Repository: softlayer/softlayer-python
Pull request #1858 (2023-02-09 18:52:14)

Updated command slcli block snapshot-order, added flag iops 
Issue link: #1856 
Note: additionally was updated some unit test and descriptions in snapshot group command
```
softlayer-python/ (issue1856) $ slcli block snapshot-order -h
Usage: slcli block snapshot-order [OPTIONS] VOLUME_ID

        Order snapshot space for a block storage volume.

┌────┬───────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│    │ volume_id │                                                                                                        │
│    │ --iops    │ Performance Storage IOPs, between 100 and 6000 in multiples of 100.                                    │
│    │ --size    │ Size of snapshot space to create in GB.  [required]                                                    │
│    │ --tier    │ Endurance Storage Tier (IOPS per GB) of the block volume for which space is ordered [optional, and     │
│    │           │ only valid for endurance storage volumes]. Choices: 0.25, 2, 4, 10                                     │
│    │ --upgrade │ Flag to indicate that the order is an upgrade.                                                         │
│ -h │ --help    │ Show this message and exit.                                                                            │
└────┴───────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────┘
```


Patch:
diff --git a/SoftLayer/CLI/autoscale/detail.py b/SoftLayer/CLI/autoscale/detail.py
index 9d2d36ad..c5170ac1 100644
--- a/SoftLayer/CLI/autoscale/detail.py
+++ b/SoftLayer/CLI/autoscale/detail.py
@@ -15,7 +15,7 @@
 @click.argument('identifier')
 @environment.pass_env
 def cli(env, identifier):
-    """Get details of an Autoscale group."""
+    """Get details of an Autoscale groups."""
 
     autoscale = AutoScaleManager(env.client)
     group = autoscale.details(identifier)
diff --git a/SoftLayer/CLI/autoscale/list.py b/SoftLayer/CLI/autoscale/list.py
index bcc1b244..1e81c23b 100644
--- a/SoftLayer/CLI/autoscale/list.py
+++ b/SoftLayer/CLI/autoscale/list.py
@@ -13,7 +13,7 @@
 @click.command(cls=SLCommand)
 @environment.pass_env
 def cli(env):
-    """List all Autoscale Groups on your account."""
+    """List AutoScale Groups."""
 
     autoscale = AutoScaleManager(env.client)
     groups = autoscale.list()
diff --git a/SoftLayer/CLI/block/access/authorize.py b/SoftLayer/CLI/block/access/authorize.py
index e5aef52a..aba08cf8 100644
--- a/SoftLayer/CLI/block/access/authorize.py
+++ b/SoftLayer/CLI/block/access/authorize.py
@@ -11,17 +11,17 @@
 
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
-@click.option('--hardware-id', '-d', multiple=True,
-              help='The ID of one hardware server to authorize. ' + MULTIPLE)
+@click.option('--hardware-id', '-h', multiple=True,
+              help='The id of one SoftLayer_Hardware to authorize ' + MULTIPLE)
+@click.option('--virtual-id', '-v', multiple=True,
+              help='The id of one SoftLayer_Virtual_Guest to authorize ' + MULTIPLE)
 @click.option('--ip-address-id', '-i', multiple=True,
-              help='The ID of one SoftLayer_Network_Subnet_IpAddress to authorize. ' + MULTIPLE)
+              help='The id of one SoftLayer_Network_Subnet_IpAddress to authorize ' + MULTIPLE)
 @click.option('--ip-address', multiple=True,
-              help='An IP address to authorize. ' + MULTIPLE)
-@click.option('--virtual-id', '-v', multiple=True,
-              help='The ID of one virtual server to authorize. ' + MULTIPLE)
+              help='An IP address to authorize ' + MULTIPLE)
 @environment.pass_env
 def cli(env, volume_id, hardware_id, virtual_id, ip_address_id, ip_address):
-    """Authorize hosts to access a given volume."""
+    """Authorizes hosts to access a given volume"""
     block_manager = SoftLayer.BlockStorageManager(env.client)
     ip_address_id_list = list(ip_address_id)
 
diff --git a/SoftLayer/CLI/block/access/list.py b/SoftLayer/CLI/block/access/list.py
index 0150f3f2..be9f89df 100644
--- a/SoftLayer/CLI/block/access/list.py
+++ b/SoftLayer/CLI/block/access/list.py
@@ -12,18 +12,15 @@
 
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
+@click.option('--sortby', help='Column to sort by', default='name')
 @click.option('--columns',
               callback=column_helper.get_formatter(storage_utils.COLUMNS),
-              help='Columns to display. Options are: {0}.'.format(
+              help='Columns to display. Options: {0}'.format(
                   ', '.join(column.name for column in storage_utils.COLUMNS)),
               default=','.join(storage_utils.DEFAULT_COLUMNS))
-@click.option('--sortby',
-              help='Column to sort by. Options are: {0}.'.format(
-                  ', '.join(column.name for column in storage_utils.COLUMNS)),
-              default='name')
 @environment.pass_env
 def cli(env, columns, sortby, volume_id):
-    """List hosts that are authorized to access the volume."""
+    """List ACLs."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
     resolved_id = helpers.resolve_id(block_manager.resolve_ids, volume_id, 'Volume Id')
     access_list = block_manager.get_block_volume_access_list(
diff --git a/SoftLayer/CLI/block/access/password.py b/SoftLayer/CLI/block/access/password.py
index 744c5c5a..187c5aff 100644
--- a/SoftLayer/CLI/block/access/password.py
+++ b/SoftLayer/CLI/block/access/password.py
@@ -9,7 +9,7 @@
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('access_id')
 @click.option('--password', '-p', multiple=False,
-              help='Password you want to set, this command will fail if the password is not strong.')
+              help='Password you want to set, this command will fail if the password is not strong')
 @environment.pass_env
 def cli(env, access_id, password):
     """Changes a password for a volume's access.
diff --git a/SoftLayer/CLI/block/access/revoke.py b/SoftLayer/CLI/block/access/revoke.py
index b034ecac..fe4f8f07 100644
--- a/SoftLayer/CLI/block/access/revoke.py
+++ b/SoftLayer/CLI/block/access/revoke.py
@@ -8,17 +8,20 @@
 
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
-@click.option('--hardware-id', '-d', multiple=True,
-              help='The ID of one SoftLayer_Hardware to revoke authorization.')
+@click.option('--hardware-id', '-h', multiple=True,
+              help='The id of one SoftLayer_Hardware'
+              ' to revoke authorization')
+@click.option('--virtual-id', '-v', multiple=True,
+              help='The id of one SoftLayer_Virtual_Guest'
+              ' to revoke authorization')
 @click.option('--ip-address-id', '-i', multiple=True,
-              help='The ID of one SoftLayer_Network_Subnet_IpAddress to revoke authorization.')
+              help='The id of one SoftLayer_Network_Subnet_IpAddress'
+              ' to revoke authorization')
 @click.option('--ip-address', multiple=True,
-              help='An IP address to revoke authorization.')
-@click.option('--virtual-id', '-v', multiple=True,
-              help='The ID of one SoftLayer_Virtual_Guest to revoke authorization.')
+              help='An IP address to revoke authorization')
 @environment.pass_env
 def cli(env, volume_id, hardware_id, virtual_id, ip_address_id, ip_address):
-    """Revoke authorization for hosts that are accessing a specific volume."""
+    """Revokes authorization for hosts accessing a given volume"""
     block_manager = SoftLayer.BlockStorageManager(env.client)
     ip_address_id_list = list(ip_address_id)
 
diff --git a/SoftLayer/CLI/block/refresh.py b/SoftLayer/CLI/block/refresh.py
index d5e8bea8..7d0ed941 100644
--- a/SoftLayer/CLI/block/refresh.py
+++ b/SoftLayer/CLI/block/refresh.py
@@ -9,12 +9,10 @@
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
 @click.argument('snapshot_id')
-@click.option('--force-refresh', '-f', is_flag=True, default=False, show_default=True,
-              help="Cancel current refresh process and initiates the new refresh.")
 @environment.pass_env
-def cli(env, volume_id, snapshot_id, force_refresh):
+def cli(env, volume_id, snapshot_id):
     """Refresh a duplicate volume with a snapshot from its parent."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
-    resp = block_manager.refresh_dupe(volume_id, snapshot_id, force_refresh)
+    resp = block_manager.refresh_dupe(volume_id, snapshot_id)
 
     click.echo(resp)
diff --git a/SoftLayer/CLI/block/snapshot/cancel.py b/SoftLayer/CLI/block/snapshot/cancel.py
index 1b867b5b..100aac61 100644
--- a/SoftLayer/CLI/block/snapshot/cancel.py
+++ b/SoftLayer/CLI/block/snapshot/cancel.py
@@ -11,11 +11,11 @@
 
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume-id')
-@click.option('--reason', help="An optional reason for cancellation")
+@click.option('--reason', help="An optional reason for cancellation.")
 @click.option('--immediate',
               is_flag=True,
               help="Cancels the snapshot space immediately instead "
-                   "of on the billing anniversary")
+                   "of on the billing anniversary.")
 @environment.pass_env
 def cli(env, volume_id, reason, immediate):
     """Cancel existing snapshot space for a given volume."""
diff --git a/SoftLayer/CLI/block/snapshot/create.py b/SoftLayer/CLI/block/snapshot/create.py
index b6b46ae9..92dbe405 100644
--- a/SoftLayer/CLI/block/snapshot/create.py
+++ b/SoftLayer/CLI/block/snapshot/create.py
@@ -9,10 +9,10 @@
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
 @click.option('--notes', '-n',
-              help='Notes to set on the new snapshot')
+              help='Notes to set on the new snapshot.')
 @environment.pass_env
 def cli(env, volume_id, notes):
-    """Creates a snapshot on a given volume"""
+    """Creates a snapshot on a given volume."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
     snapshot = block_manager.create_snapshot(volume_id, notes=notes)
 
diff --git a/SoftLayer/CLI/block/snapshot/delete.py b/SoftLayer/CLI/block/snapshot/delete.py
index 44c9e546..4c08c59a 100644
--- a/SoftLayer/CLI/block/snapshot/delete.py
+++ b/SoftLayer/CLI/block/snapshot/delete.py
@@ -10,7 +10,7 @@
 @click.argument('snapshot_id')
 @environment.pass_env
 def cli(env, snapshot_id):
-    """Deletes a snapshot on a given volume"""
+    """Deletes a snapshot on a given volume."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
     deleted = block_manager.delete_snapshot(snapshot_id)
 
diff --git a/SoftLayer/CLI/block/snapshot/disable.py b/SoftLayer/CLI/block/snapshot/disable.py
index 58c17c09..254b5bd1 100644
--- a/SoftLayer/CLI/block/snapshot/disable.py
+++ b/SoftLayer/CLI/block/snapshot/disable.py
@@ -10,11 +10,11 @@
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
 @click.option('--schedule-type',
-              help='Snapshot schedule [INTERVAL|HOURLY|DAILY|WEEKLY]',
+              help='Snapshot schedule [INTERVAL|HOURLY|DAILY|WEEKLY].',
               required=True)
 @environment.pass_env
 def cli(env, volume_id, schedule_type):
-    """Disables snapshots on the specified schedule for a given volume"""
+    """Disables snapshots on the specified schedule for a given volume."""
 
     if (schedule_type not in ['INTERVAL', 'HOURLY', 'DAILY', 'WEEKLY']):
         raise exceptions.CLIAbort(
diff --git a/SoftLayer/CLI/block/snapshot/enable.py b/SoftLayer/CLI/block/snapshot/enable.py
index b357793f..2fda6f8d 100644
--- a/SoftLayer/CLI/block/snapshot/enable.py
+++ b/SoftLayer/CLI/block/snapshot/enable.py
@@ -10,24 +10,24 @@
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
 @click.option('--schedule-type',
-              help='Snapshot schedule [INTERVAL|HOURLY|DAILY|WEEKLY]',
+              help='Snapshot schedule [INTERVAL|HOURLY|DAILY|WEEKLY].',
               required=True)
 @click.option('--retention-count',
-              help='Number of snapshots to retain',
+              help='Number of snapshots to retain.',
               required=True)
 @click.option('--minute',
-              help='Minute of the day when snapshots should be taken',
+              help='Minute of the day when snapshots should be taken.',
               default=0)
 @click.option('--hour',
-              help='Hour of the day when snapshots should be taken',
+              help='Hour of the day when snapshots should be taken.',
               default=0)
 @click.option('--day-of-week',
-              help='Day of the week when snapshots should be taken',
+              help='Day of the week when snapshots should be taken.',
               default='SUNDAY')
 @environment.pass_env
 def cli(env, volume_id, schedule_type, retention_count,
         minute, hour, day_of_week):
-    """Enables snapshots for a given volume on the specified schedule"""
+    """Enables snapshots for a given volume on the specified schedule."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
 
     valid_schedule_types = {'INTERVAL', 'HOURLY', 'DAILY', 'WEEKLY'}
diff --git a/SoftLayer/CLI/block/snapshot/get_notify_status.py b/SoftLayer/CLI/block/snapshot/get_notify_status.py
index 29659a7d..e45e73b8 100644
--- a/SoftLayer/CLI/block/snapshot/get_notify_status.py
+++ b/SoftLayer/CLI/block/snapshot/get_notify_status.py
@@ -10,7 +10,7 @@
 @click.argument('volume_id')
 @environment.pass_env
 def cli(env, volume_id):
-    """Get snapshots space usage threshold warning flag setting for a given volume"""
+    """Get snapshots space usage threshold warning flag setting for a given volume."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
     enabled = block_manager.get_volume_snapshot_notification_status(volume_id)
 
diff --git a/SoftLayer/CLI/block/snapshot/list.py b/SoftLayer/CLI/block/snapshot/list.py
index f3a65c18..90d42a91 100644
--- a/SoftLayer/CLI/block/snapshot/list.py
+++ b/SoftLayer/CLI/block/snapshot/list.py
@@ -28,7 +28,7 @@
 
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
-@click.option('--sortby', help='Column to sort by',
+@click.option('--sortby', help='Column to sort by.',
               default='created')
 @click.option('--columns',
               callback=column_helper.get_formatter(COLUMNS),
diff --git a/SoftLayer/CLI/block/snapshot/order.py b/SoftLayer/CLI/block/snapshot/order.py
index 4d6455d3..4e2ce68a 100644
--- a/SoftLayer/CLI/block/snapshot/order.py
+++ b/SoftLayer/CLI/block/snapshot/order.py
@@ -9,34 +9,45 @@
 
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
-@click.option('--capacity',
+@click.option('--iops',
               type=int,
-              help='Size of snapshot space to create in GB',
+              help='Performance Storage IOPs, between 100 and 6000 in multiples of 100.')
+@click.option('--size',
+              type=int,
+              help='Size of snapshot space to create in GB.',
               required=True)
 @click.option('--tier',
               help='Endurance Storage Tier (IOPS per GB) of the block'
               ' volume for which space is ordered [optional, and only'
-              ' valid for endurance storage volumes]',
+              ' valid for endurance storage volumes].',
               type=click.Choice(['0.25', '2', '4', '10']))
 @click.option('--upgrade',
               type=bool,
-              help='Flag to indicate that the order is an upgrade',
+              help='Flag to indicate that the order is an upgrade.',
               default=False,
               is_flag=True)
 @environment.pass_env
-def cli(env, volume_id, capacity, tier, upgrade):
+def cli(env, volume_id, size, tier, upgrade, iops):
     """Order snapshot space for a block storage volume."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
 
     if tier is not None:
         tier = float(tier)
 
+    if iops is not None:
+        if iops < 100 or iops > 6000:
+            raise exceptions.ArgumentError(f"Invalid value for '--iops' / '-i': '{iops}' is not one "
+                                           "of between 100 and 6000.")
+        if iops % 100 != 0:
+            raise exceptions.ArgumentError(f"Invalid value for '--iops' / '-i': '{iops}' is not a multiple of 100.")
+
     try:
         order = block_manager.order_snapshot_space(
             volume_id,
-            capacity=capacity,
+            capacity=size,
             tier=tier,
-            upgrade=upgrade
+            upgrade=upgrade,
+            iops=iops
         )
     except ValueError as ex:
         raise exceptions.ArgumentError(str(ex))
diff --git a/SoftLayer/CLI/block/snapshot/restore.py b/SoftLayer/CLI/block/snapshot/restore.py
index 34f7aa2d..6cfc5591 100644
--- a/SoftLayer/CLI/block/snapshot/restore.py
+++ b/SoftLayer/CLI/block/snapshot/restore.py
@@ -10,10 +10,10 @@
 @click.argument('volume_id')
 @click.option('--snapshot-id', '-s',
               help='The id of the snapshot which will be used'
-              ' to restore the block volume')
+              ' to restore the block volume.')
 @environment.pass_env
 def cli(env, volume_id, snapshot_id):
-    """Restore block volume using a given snapshot"""
+    """Restore block volume using a given snapshot."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
     success = block_manager.restore_from_snapshot(volume_id, snapshot_id)
 
diff --git a/SoftLayer/CLI/block/snapshot/schedule_list.py b/SoftLayer/CLI/block/snapshot/schedule_list.py
index af74feba..a6c6ff2e 100644
--- a/SoftLayer/CLI/block/snapshot/schedule_list.py
+++ b/SoftLayer/CLI/block/snapshot/schedule_list.py
@@ -11,7 +11,7 @@
 @click.argument('volume_id')
 @environment.pass_env
 def cli(env, volume_id):
-    """Lists snapshot schedules for a given volume"""
+    """Lists snapshot schedules for a given volume."""
 
     block_manager = SoftLayer.BlockStorageManager(env.client)
 
diff --git a/SoftLayer/CLI/block/snapshot/set_notify_status.py b/SoftLayer/CLI/block/snapshot/set_notify_status.py
index fe4725bf..a9d051ee 100644
--- a/SoftLayer/CLI/block/snapshot/set_notify_status.py
+++ b/SoftLayer/CLI/block/snapshot/set_notify_status.py
@@ -12,12 +12,12 @@
     '--enable/--disable',
     default=True,
     help="""
-    Enable/Disable snapshot notification. Use `slcli block snapshot-set-notification volumeId --enable` to enable
+    Enable/Disable snapshot notification. Use `slcli block snapshot-set-notification volumeId --enable` to enable.
     """,
     required=True)
 @environment.pass_env
 def cli(env, volume_id, enable):
-    """Enables/Disables snapshot space usage threshold warning for a given volume"""
+    """Enables/Disables snapshot space usage threshold warning for a given volume."""
     block_manager = SoftLayer.BlockStorageManager(env.client)
 
     status = block_manager.set_volume_snapshot_notification(volume_id, enable)
diff --git a/SoftLayer/CLI/file/refresh.py b/SoftLayer/CLI/file/refresh.py
index 8f930b05..2eb40483 100644
--- a/SoftLayer/CLI/file/refresh.py
+++ b/SoftLayer/CLI/file/refresh.py
@@ -9,12 +9,10 @@
 @click.command(cls=SoftLayer.CLI.command.SLCommand, )
 @click.argument('volume_id')
 @click.argument('snapshot_id')
-@click.option('--force-refresh', '-f', is_flag=True, default=False, show_default=True,
-              help="Cancel current refresh process and initiates the new refresh.")
 @environment.pass_env
-def cli(env, volume_id, snapshot_id, force_refresh):
+def cli(env, volume_id, snapshot_id):
     """Refresh a duplicate volume with a snapshot from its parent."""
     file_manager = SoftLayer.FileStorageManager(env.client)
-    resp = file_manager.refresh_dupe(volume_id, snapshot_id, force_refresh)
+    resp = file_manager.refresh_dupe(volume_id, snapshot_id)
 
     click.echo(resp)
diff --git a/SoftLayer/CLI/routes.py b/SoftLayer/CLI/routes.py
index d236fc0b..ff754030 100644
--- a/SoftLayer/CLI/routes.py
+++ b/SoftLayer/CLI/routes.py
@@ -58,8 +58,6 @@
     ('virtual:notification-add', 'SoftLayer.CLI.virt.notification_add:cli'),
     ('virtual:notification-delete', 'SoftLayer.CLI.virt.notification_delete:cli'),
     ('virtual:host-list', 'SoftLayer.CLI.dedicatedhost.list:cli'),
-    ('virtual:host-create', 'SoftLayer.CLI.dedicatedhost.create:cli'),
-    ('virtual:os-available', 'SoftLayer.CLI.virt.os_available:cli'),
 
     ('dedicatedhost', 'SoftLayer.CLI.dedicatedhost'),
     ('dedicatedhost:list', 'SoftLayer.CLI.dedicatedhost.list:cli'),
diff --git a/SoftLayer/CLI/virt/os_available.py b/SoftLayer/CLI/virt/os_available.py
deleted file mode 100644
index ecf10098..00000000
--- a/SoftLayer/CLI/virt/os_available.py
+++ /dev/null
@@ -1,30 +0,0 @@
-"""Get all available Operating Systems."""
-# :license: MIT, see LICENSE for more details.
-
-import click
-
-import SoftLayer
-
-from SoftLayer.CLI import environment
-from SoftLayer.CLI import formatting
-
-
-@click.command(cls=SoftLayer.CLI.command.SLCommand, )
-@environment.pass_env
-def cli(env):
-    """Get all available Operating Systems."""
-
-    table = formatting.KeyValueTable(['Id', 'KeyName', 'Description', 'Hourly', 'Monthly', 'Setup'])
-    table.align['name'] = 'r'
-    table.align['value'] = 'l'
-    manager = SoftLayer.OrderingManager(env.client)
-    _filter = {"items": {"prices": {"categories": {"categoryCode": {"operation": "os"}}}}}
-    # PUBLIC_CLOUD_SERVER = 835
-    operations = manager.get_items(storage_filter=_filter, package_id=835)
-
-    for operation_system in operations:
-        table.add_row([operation_system.get('id'), operation_system.get('keyName'), operation_system.get('description'),
-                       operation_system['prices'][0].get('hourlyRecurringFee') or formatting.blank(),
-                       operation_system['prices'][0]['laborFee'],
-                       operation_system['prices'][0]['setupFee']])
-    env.fout(table)
diff --git a/SoftLayer/consts.py b/SoftLayer/consts.py
index 6b5e5f12..ec87e422 100644
--- a/SoftLayer/consts.py
+++ b/SoftLayer/consts.py
@@ -5,7 +5,7 @@
 
     :license: MIT, see LICENSE for more details.
 """
-VERSION = 'v6.1.4'
+VERSION = 'v6.1.3'
 API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/xmlrpc/v3.1/'
 API_PRIVATE_ENDPOINT = 'https://api.service.softlayer.com/xmlrpc/v3.1/'
 API_PUBLIC_ENDPOINT_REST = 'https://api.softlayer.com/rest/v3.1/'
diff --git a/SoftLayer/fixtures/SoftLayer_Product_Package.py b/SoftLayer/fixtures/SoftLayer_Product_Package.py
index 724a0c7a..9c2b02ec 100644
--- a/SoftLayer/fixtures/SoftLayer_Product_Package.py
+++ b/SoftLayer/fixtures/SoftLayer_Product_Package.py
@@ -2276,33 +2276,3 @@
         }
     }
 ]
-
-getItemsOS = [{
-    "description": "Debian GNU/Linux 6.x Squeeze/Stable - LAMP Install (64 bit)",
-    "id": 3975,
-    "itemTaxCategoryId": 166,
-    "keyName": "OS_DEBIAN_6_X_SQUEEZE_LAMP_64_BIT",
-    "softwareDescriptionId": 881,
-    "itemCategory": {
-        "categoryCode": "os",
-        "id": 12,
-        "name": "Operating System",
-    },
-    "prices": [
-        {
-            "hourlyRecurringFee": "0",
-            "id": 14056,
-            "itemId": 3975,
-            "laborFee": "0",
-            "recurringFee": "0",
-            "setupFee": "0",
-            "packageReferences": [
-                {
-                    "id": 74660,
-                    "itemPriceId": 14056,
-                    "packageId": 46
-                }
-            ]
-        }
-    ]
-}]
diff --git a/SoftLayer/managers/network.py b/SoftLayer/managers/network.py
index ac720109..ab9e7164 100644
--- a/SoftLayer/managers/network.py
+++ b/SoftLayer/managers/network.py
@@ -551,7 +551,7 @@ def list_vlans(self, datacenter=None, vlan_number=None, name=None, limit=100, **
 
         kwargs['iter'] = True
         if limit > 0:
-            return self.account.getNetworkVlans(mask=kwargs['mask'], filter=_filter.to_dict(), limit=limit, iter=True)
+            return self.account.getNetworkVlans(mask=kwargs['mask'], filter=_filter.to_dict(), limit=limit)
         else:
             return self.account.getNetworkVlans(mask=kwargs['mask'], filter=_filter.to_dict(), iter=True)
 
diff --git a/SoftLayer/managers/storage.py b/SoftLayer/managers/storage.py
index 190a642d..c31c4a6b 100644
--- a/SoftLayer/managers/storage.py
+++ b/SoftLayer/managers/storage.py
@@ -381,7 +381,7 @@ def create_snapshot(self, volume_id, notes='', **kwargs):
                                 **kwargs)
 
     def order_snapshot_space(self, volume_id, capacity, tier, upgrade,
-                             **kwargs):
+                             iops=None, **kwargs):
         """Orders snapshot space for the given block volume.
 
         :param integer volume_id: The id of the volume
@@ -395,8 +395,11 @@ def order_snapshot_space(self, volume_id, capacity, tier, upgrade,
                       'staasVersion,hasEncryptionAtRest'
         volume = self.get_volume_details(volume_id, mask=object_mask, **kwargs)
 
+        if iops is None:
+            iops = int(volume['provisionedIops'])
+
         order = storage_utils.prepare_snapshot_order_object(
-            self, volume, capacity, tier, upgrade)
+            self, volume, capacity, tier, upgrade, iops)
 
         return self.client.call('Product_Order', 'placeOrder', order)
 
@@ -563,17 +566,15 @@ def cancel_volume(self,
                                 reason,
                                 id=billing_item_id)
 
-    def refresh_dupe(self, volume_id, snapshot_id, force_refresh=False):
+    def refresh_dupe(self, volume_id, snapshot_id):
         """"Refresh a duplicate volume with a snapshot from its parent.
 
         :param integer volume_id: The id of the volume
         :param integer snapshot_id: The id of the snapshot
-        :param boolean force_refresh: Force refreshing the volume if True
         """
         return self.client.call('Network_Storage',
                                 'refreshDuplicate',
                                 snapshot_id,
-                                force_refresh,
                                 id=volume_id)
 
     def convert_dep_dupe(self, volume_id):
diff --git a/SoftLayer/managers/storage_utils.py b/SoftLayer/managers/storage_utils.py
index bd6dcd13..86870ba4 100644
--- a/SoftLayer/managers/storage_utils.py
+++ b/SoftLayer/managers/storage_utils.py
@@ -423,7 +423,7 @@ def find_snapshot_schedule_id(volume, snapshot_schedule_keyname):
                      "the given storage volume")
 
 
-def prepare_snapshot_order_object(manager, volume, capacity, tier, upgrade):
+def prepare_snapshot_order_object(manager, volume, capacity, tier, upgrade, iops):
     """Prepare the snapshot space order object for the placeOrder() method
 
     :param manager: The File or Block manager calling this function
@@ -466,7 +466,7 @@ def prepare_snapshot_order_object(manager, volume, capacity, tier, upgrade):
                 raise exceptions.SoftLayerError(
                     "Snapshot space cannot be ordered for this performance "
                     "volume since it does not support Encryption at Rest.")
-            iops = int(volume['provisionedIops'])
+
             prices = [find_saas_snapshot_space_price(
                 package, capacity, iops=iops)]
         else:
diff --git a/SoftLayer/managers/vs.py b/SoftLayer/managers/vs.py
index f6520849..d0d5a03e 100644
--- a/SoftLayer/managers/vs.py
+++ b/SoftLayer/managers/vs.py
@@ -1120,7 +1120,7 @@ def get_disk_category_id_by_disk_number(self, capacity, disk_number):
         if category_to_request is None:
             return None
 
-        key_name = "*= GUEST_DISK_" + str(capacity) + "_GB_SAN"
+        key_name = "*= GUEST_DISK_"+str(capacity)+"_GB_SAN"
         object_filter = {
             "itemPrices": {
                 "locationGroupId": {"operation": "is null"},
diff --git a/docs/cli/dedicated.rst b/docs/cli/dedicated.rst
index 8004d6ca..f6781c39 100644
--- a/docs/cli/dedicated.rst
+++ b/docs/cli/dedicated.rst
@@ -35,7 +35,3 @@ Dedicated Host Commands
 .. click:: SoftLayer.CLI.dedicatedhost.list:cli
     :prog: virtual host-list
     :show-nested:
-
-.. click:: SoftLayer.CLI.dedicatedhost.create:cli
-    :prog: virtual host-create
-    :show-nested:
diff --git a/docs/cli/vs.rst b/docs/cli/vs.rst
index ee1a84e3..00163336 100644
--- a/docs/cli/vs.rst
+++ b/docs/cli/vs.rst
@@ -296,14 +296,6 @@ If no timezone is specified, IMS local time (CST) will be assumed, which might n
     :prog: virtual host-list
     :show-nested:
 
-.. click:: SoftLayer.CLI.virt.create:cli
-    This command is an alias for `slcli dedicatedhost create`
-   :prog: virtual host-create
-
-.. click:: SoftLayer.CLI.virt.os_available:cli
-   :prog: virtual os-available
-   :show-nested:
-
 Manages the migration of virutal guests. Supports migrating virtual guests on Dedicated Hosts as well.
 
 Reserved Capacity
diff --git a/setup.py b/setup.py
index 332cf006..8cd53865 100644
--- a/setup.py
+++ b/setup.py
@@ -16,7 +16,7 @@
 
 setup(
     name='SoftLayer',
-    version='6.1.4',
+    version='6.1.3',
     description=DESCRIPTION,
     long_description=LONG_DESCRIPTION,
     long_description_content_type='text/x-rst',


Test patch:
diff --git a/tests/CLI/modules/block_tests.py b/tests/CLI/modules/block_tests.py
index 332f5ca6..3dfe42f7 100644
--- a/tests/CLI/modules/block_tests.py
+++ b/tests/CLI/modules/block_tests.py
@@ -446,7 +446,7 @@ def test_snapshot_order_order_not_placed(self, order_mock):
         order_mock.return_value = {}
 
         result = self.run_command(['block', 'snapshot-order', '1234',
-                                   '--capacity=10', '--tier=0.25'])
+                                   '--size=10', '--tier=0.25', '--iops=100'])
 
         self.assert_no_fail(result)
         self.assertEqual(result.output,
@@ -458,7 +458,7 @@ def test_snapshot_order_performance_manager_error(self, order_mock):
         order_mock.side_effect = ValueError('failure!')
 
         result = self.run_command(['block', 'snapshot-order', '1234',
-                                   '--capacity=10', '--tier=0.25'])
+                                   '--size=10', '--tier=0.25', '--iops=100'])
 
         self.assertEqual(2, result.exit_code)
         self.assertEqual('Argument Error: failure!', result.exception.message)
@@ -475,7 +475,7 @@ def test_snapshot_order(self, order_mock):
         }
 
         result = self.run_command(['block', 'snapshot-order', '1234',
-                                   '--capacity=10', '--tier=0.25'])
+                                   '--size=10', '--tier=0.25', '--iops=100'])
 
         self.assert_no_fail(result)
         self.assertEqual(result.output,
diff --git a/tests/CLI/modules/vs/vs_tests.py b/tests/CLI/modules/vs/vs_tests.py
index 8562f446..c87dede5 100644
--- a/tests/CLI/modules/vs/vs_tests.py
+++ b/tests/CLI/modules/vs/vs_tests.py
@@ -995,9 +995,3 @@ def test_add_notification(self):
     def test_notification_delete(self):
         result = self.run_command(['vs', 'notification-delete', '100'])
         self.assert_no_fail(result)
-
-    def test_os_available(self):
-        _mock = self.set_mock('SoftLayer_Product_Package', 'getItems')
-        _mock.return_value = SoftLayer_Product_Package.getItemsOS
-        result = self.run_command(['vs', 'os-available'])
-        self.assert_no_fail(result)
diff --git a/tests/managers/storage_utils_tests.py b/tests/managers/storage_utils_tests.py
index f7bc5005..974c5dab 100644
--- a/tests/managers/storage_utils_tests.py
+++ b/tests/managers/storage_utils_tests.py
@@ -2688,7 +2688,7 @@ def test_prep_snapshot_order_billing_item_cancelled(self):
         exception = self.assertRaises(
             exceptions.SoftLayerError,
             storage_utils.prepare_snapshot_order_object,
-            self.block, mock_volume, 10, None, False
+            self.block, mock_volume, 10, None, False, 100
         )
 
         self.assertEqual(
@@ -2703,7 +2703,7 @@ def test_prep_snapshot_order_invalid_billing_item_category_code(self):
         exception = self.assertRaises(
             exceptions.SoftLayerError,
             storage_utils.prepare_snapshot_order_object,
-            self.block, mock_volume, 10, None, False
+            self.block, mock_volume, 10, None, False, 100
         )
 
         self.assertEqual(
@@ -2730,7 +2730,7 @@ def test_prep_snapshot_order_saas_endurance_tier_is_not_none(self):
         }
 
         result = storage_utils.prepare_snapshot_order_object(
-            self.block, mock_volume, 10, 2, False
+            self.block, mock_volume, 10, 2, False, 100
         )
 
         self.assertEqual(expected_object, result)
@@ -2753,7 +2753,7 @@ def test_prep_snapshot_order_saas_endurance_upgrade(self):
         }
 
         result = storage_utils.prepare_snapshot_order_object(
-            self.block, mock_volume, 20, None, True
+            self.block, mock_volume, 20, None, True, 100
         )
 
         self.assertEqual(expected_object, result)
@@ -2769,7 +2769,7 @@ def test_prep_snapshot_order_saas_performance_volume_below_staas_v2(self):
         exception = self.assertRaises(
             exceptions.SoftLayerError,
             storage_utils.prepare_snapshot_order_object,
-            self.block, mock_volume, 10, None, False
+            self.block, mock_volume, 10, None, False, 100
         )
 
         self.assertEqual(
@@ -2797,7 +2797,7 @@ def test_prep_snapshot_order_saas_performance(self):
         }
 
         result = storage_utils.prepare_snapshot_order_object(
-            self.block, mock_volume, 10, None, False
+            self.block, mock_volume, 10, None, False, 100
         )
 
         self.assertEqual(expected_object, result)
@@ -2812,7 +2812,7 @@ def test_prep_snapshot_order_saas_invalid_storage_type(self):
         exception = self.assertRaises(
             exceptions.SoftLayerError,
             storage_utils.prepare_snapshot_order_object,
-            self.block, mock_volume, 10, None, False
+            self.block, mock_volume, 10, None, False, 100
         )
 
         self.assertEqual(
@@ -2842,7 +2842,7 @@ def test_prep_snapshot_order_enterprise_tier_is_not_none(self):
         }
 
         result = storage_utils.prepare_snapshot_order_object(
-            self.block, mock_volume, 10, 2, False
+            self.block, mock_volume, 10, 2, False, 100
         )
 
         self.assertEqual(expected_object, result)
@@ -2867,7 +2867,7 @@ def test_prep_snapshot_order_enterprise(self):
         }
 
         result = storage_utils.prepare_snapshot_order_object(
-            self.block, mock_volume, 20, None, False
+            self.block, mock_volume, 20, None, False, 100
         )
 
         self.assertEqual(expected_object, result)
@@ -2891,7 +2891,7 @@ def test_prep_snapshot_order_hourly_billing(self):
         }
 
         result = storage_utils.prepare_snapshot_order_object(
-            self.block, mock_volume, 20, None, False
+            self.block, mock_volume, 20, None, False, 100
         )
 
         self.assertEqual(expected_object, result)