From ded403848217ff778006c15be6f92fdc5033a62c Mon Sep 17 00:00:00 2001 From: ATGE Date: Fri, 24 Jul 2020 16:42:22 -0400 Subject: [PATCH 1/5] #1302 fix lots of whitespace slcli vs create-options --- SoftLayer/CLI/virt/create_options.py | 189 ++++++++++++++++----------- tests/CLI/modules/vs/vs_tests.py | 93 +++++++------ 2 files changed, 170 insertions(+), 112 deletions(-) diff --git a/SoftLayer/CLI/virt/create_options.py b/SoftLayer/CLI/virt/create_options.py index 601c0f3ac..7e671d028 100644 --- a/SoftLayer/CLI/virt/create_options.py +++ b/SoftLayer/CLI/virt/create_options.py @@ -18,56 +18,121 @@ def cli(env): """Virtual server order options.""" vsi = SoftLayer.VSManager(env.client) - result = vsi.get_create_options() + options = vsi.get_create_options() - table = formatting.KeyValueTable(['name', 'value']) - table.align['name'] = 'r' - table.align['value'] = 'l' + tables = [ + _get_datacenter_table(options), + _get_flavors_table(options), + _get_cpu_table(options), + _get_memory_table(options), + _get_os_table(options), + _get_disk_table(options), + _get_network_table(options), + ] - # Datacenters + env.fout(formatting.listing(tables, separator='\n')) + + +def _get_datacenter_table(create_options): datacenters = [dc['template']['datacenter']['name'] - for dc in result['datacenters']] + for dc in create_options['datacenters']] + datacenters = sorted(datacenters) - table.add_row(['datacenter', - formatting.listing(datacenters, separator='\n')]) + dc_table = formatting.Table(['datacenter'], title='Datacenters') + dc_table.sortby = 'datacenter' + dc_table.align = 'l' + for datacenter in datacenters: + dc_table.add_row([datacenter]) + return dc_table - _add_flavors_to_table(result, table) - # CPUs - standard_cpus = [int(x['template']['startCpus']) for x in result['processors'] +def _get_flavors_table(create_options): + flavor_table = formatting.Table(['flavor', 'value'], title='Flavors') + flavor_table.sortby = 'flavor' + flavor_table.align = 'l' + grouping = { + 'balanced': {'key_starts_with': 'B1', 'flavors': []}, + 'balanced local - hdd': {'key_starts_with': 'BL1', 'flavors': []}, + 'balanced local - ssd': {'key_starts_with': 'BL2', 'flavors': []}, + 'compute': {'key_starts_with': 'C1', 'flavors': []}, + 'memory': {'key_starts_with': 'M1', 'flavors': []}, + 'GPU': {'key_starts_with': 'AC', 'flavors': []}, + 'transient': {'transient': True, 'flavors': []}, + } + + if create_options.get('flavors', None) is None: + return + + for flavor_option in create_options['flavors']: + flavor_key_name = utils.lookup(flavor_option, 'flavor', 'keyName') + + for name, group in grouping.items(): + if utils.lookup(flavor_option, 'template', 'transientGuestFlag') is True: + if utils.lookup(group, 'transient') is True: + group['flavors'].append(flavor_key_name) + break + + elif utils.lookup(group, 'key_starts_with') is not None \ + and flavor_key_name.startswith(group['key_starts_with']): + group['flavors'].append(flavor_key_name) + break + + for name, group in grouping.items(): + if len(group['flavors']) > 0: + flavor_table.add_row(['{}'.format(name), + formatting.listing(group['flavors'], + separator='\n')]) + return flavor_table + + +def _get_cpu_table(create_options): + cpu_table = formatting.Table(['cpu', 'value'], title='CPUs') + cpu_table.sortby = 'cpu' + cpu_table.align = 'l' + standard_cpus = [int(x['template']['startCpus']) for x in create_options['processors'] if not x['template'].get('dedicatedAccountHostOnlyFlag', False) and not x['template'].get('dedicatedHost', None)] - ded_cpus = [int(x['template']['startCpus']) for x in result['processors'] + ded_cpus = [int(x['template']['startCpus']) for x in create_options['processors'] if x['template'].get('dedicatedAccountHostOnlyFlag', False)] - ded_host_cpus = [int(x['template']['startCpus']) for x in result['processors'] + ded_host_cpus = [int(x['template']['startCpus']) for x in create_options['processors'] if x['template'].get('dedicatedHost', None)] standard_cpus = sorted(standard_cpus) - table.add_row(['cpus (standard)', formatting.listing(standard_cpus, separator=',')]) + cpu_table.add_row(['standard', formatting.listing(standard_cpus, separator=',')]) ded_cpus = sorted(ded_cpus) - table.add_row(['cpus (dedicated)', formatting.listing(ded_cpus, separator=',')]) + cpu_table.add_row(['dedicated', formatting.listing(ded_cpus, separator=',')]) ded_host_cpus = sorted(ded_host_cpus) - table.add_row(['cpus (dedicated host)', formatting.listing(ded_host_cpus, separator=',')]) + cpu_table.add_row(['dedicated host', formatting.listing(ded_host_cpus, separator=',')]) + return cpu_table + - # Memory - memory = [int(m['template']['maxMemory']) for m in result['memory'] +def _get_memory_table(create_options): + memory_table = formatting.Table(['memory', 'value'], title='Memories') + memory_table.sortby = 'memory' + memory_table.align = 'l' + memory = [int(m['template']['maxMemory']) for m in create_options['memory'] if not m['itemPrice'].get('dedicatedHostInstanceFlag', False)] - ded_host_memory = [int(m['template']['maxMemory']) for m in result['memory'] + ded_host_memory = [int(m['template']['maxMemory']) for m in create_options['memory'] if m['itemPrice'].get('dedicatedHostInstanceFlag', False)] memory = sorted(memory) - table.add_row(['memory', - formatting.listing(memory, separator=',')]) + memory_table.add_row(['standard', + formatting.listing(memory, separator=',')]) ded_host_memory = sorted(ded_host_memory) - table.add_row(['memory (dedicated host)', - formatting.listing(ded_host_memory, separator=',')]) + memory_table.add_row(['dedicated host', + formatting.listing(ded_host_memory, separator=',')]) + return memory_table - # Operating Systems + +def _get_os_table(create_options): + os_table = formatting.Table(['os', 'value'], title='Operating Systems') + os_table.sortby = 'os' + os_table.align = 'l' op_sys = [o['template']['operatingSystemReferenceCode'] for o in - result['operatingSystems']] + create_options['operatingSystems']] op_sys = sorted(op_sys) os_summary = set() @@ -76,24 +141,29 @@ def cli(env): os_summary.add(operating_system[0:operating_system.find('_')]) for summary in sorted(os_summary): - table.add_row([ - 'os (%s)' % summary, + os_table.add_row([ + summary, os.linesep.join(sorted([x for x in op_sys if x[0:len(summary)] == summary])) ]) + return os_table + - # Disk - local_disks = [x for x in result['blockDevices'] +def _get_disk_table(create_options): + disk_table = formatting.Table(['disk', 'value'], title='Disks') + disk_table.sortby = 'disk' + disk_table.align = 'l' + local_disks = [x for x in create_options['blockDevices'] if x['template'].get('localDiskFlag', False) and not x['itemPrice'].get('dedicatedHostInstanceFlag', False)] - ded_host_local_disks = [x for x in result['blockDevices'] + ded_host_local_disks = [x for x in create_options['blockDevices'] if x['template'].get('localDiskFlag', False) and x['itemPrice'].get('dedicatedHostInstanceFlag', False)] - san_disks = [x for x in result['blockDevices'] + san_disks = [x for x in create_options['blockDevices'] if not x['template'].get('localDiskFlag', False)] def add_block_rows(disks, name): @@ -109,18 +179,23 @@ def add_block_rows(disks, name): simple[bid].append(str(block['diskImage']['capacity'])) for label in sorted(simple): - table.add_row(['%s disk(%s)' % (name, label), - formatting.listing(simple[label], - separator=',')]) + disk_table.add_row(['%s disk(%s)' % (name, label), + formatting.listing(simple[label], + separator=',')]) add_block_rows(san_disks, 'san') add_block_rows(local_disks, 'local') add_block_rows(ded_host_local_disks, 'local (dedicated host)') + return disk_table + - # Network +def _get_network_table(create_options): + network_table = formatting.Table(['network', 'value'], title='Network') + network_table.sortby = 'network' + network_table.align = 'l' speeds = [] ded_host_speeds = [] - for option in result['networkComponents']: + for option in create_options['networkComponents']: template = option.get('template', None) price = option.get('itemPrice', None) @@ -140,43 +215,9 @@ def add_block_rows(disks, name): speeds.append(max_speed) speeds = sorted(speeds) - table.add_row(['nic', formatting.listing(speeds, separator=',')]) + network_table.add_row(['nic', formatting.listing(speeds, separator=',')]) ded_host_speeds = sorted(ded_host_speeds) - table.add_row(['nic (dedicated host)', - formatting.listing(ded_host_speeds, separator=',')]) - - env.fout(table) - - -def _add_flavors_to_table(result, table): - grouping = { - 'balanced': {'key_starts_with': 'B1', 'flavors': []}, - 'balanced local - hdd': {'key_starts_with': 'BL1', 'flavors': []}, - 'balanced local - ssd': {'key_starts_with': 'BL2', 'flavors': []}, - 'compute': {'key_starts_with': 'C1', 'flavors': []}, - 'memory': {'key_starts_with': 'M1', 'flavors': []}, - 'GPU': {'key_starts_with': 'AC', 'flavors': []}, - 'transient': {'transient': True, 'flavors': []}, - } - - if result.get('flavors', None) is None: - return - - for flavor_option in result['flavors']: - flavor_key_name = utils.lookup(flavor_option, 'flavor', 'keyName') - - for name, group in grouping.items(): - if utils.lookup(flavor_option, 'template', 'transientGuestFlag') is True: - if utils.lookup(group, 'transient') is True: - group['flavors'].append(flavor_key_name) - break - - elif utils.lookup(group, 'key_starts_with') is not None \ - and flavor_key_name.startswith(group['key_starts_with']): - group['flavors'].append(flavor_key_name) - break - - for name, group in grouping.items(): - if len(group['flavors']) > 0: - table.add_row(['flavors (%s)' % name, formatting.listing(group['flavors'], separator='\n')]) + network_table.add_row(['nic (dedicated host)', + formatting.listing(ded_host_speeds, separator=',')]) + return network_table diff --git a/tests/CLI/modules/vs/vs_tests.py b/tests/CLI/modules/vs/vs_tests.py index 94b913923..6494f0c40 100644 --- a/tests/CLI/modules/vs/vs_tests.py +++ b/tests/CLI/modules/vs/vs_tests.py @@ -315,28 +315,45 @@ def test_detail_vs_ptr_error(self): def test_create_options(self): result = self.run_command(['vs', 'create-options']) + expected_json_result = [ + [ + {"Datacenter": "ams01"}, + {"Datacenter": "dal05"} + ], + [ + {"flavor": "balanced", "value": ["B1_1X2X25", "B1_1X2X100"]}, + {"flavor": "balanced local - hdd", "value": ["BL1_1X2X100"]}, + {"flavor": "balanced local - ssd", "value": ["BL2_1X2X100"]}, + {"flavor": "compute", "value": ["C1_1X2X25"]}, + {"flavor": "memory", "value": ["M1_1X2X100"]}, + {"flavor": "GPU", "value": ["AC1_1X2X100", "ACL1_1X2X100"]}, + {"flavor": "transient", "value": ["B1_1X2X25_TRANSIENT"]} + ], + [ + {"cpu": "standard", "value": [1, 2, 3, 4]}, + {"cpu": "dedicated", "value": [1]}, + {"cpu": "dedicated host", "value": [4, 56]} + ], + [ + {"memory": "standard", "value": [1024, 2048, 3072, 4096]}, + {"memory": "dedicated host", "value": [8192, 65536]} + ], + [ + {"os": "CENTOS", "value": "CENTOS_6_64"}, + {"os": "DEBIAN", "value": "DEBIAN_7_64"}, + {"os": "UBUNTU", "value": "UBUNTU_12_64"} + ], + [ + {"disk": "local disk(0)", "value": ["25", "100"]} + ], + [ + {"network": "nic", "value": ["10", "100", "1000"]}, + {"network": "nic (dedicated host)", "value": ["1000"]} + ] + ] self.assert_no_fail(result) - self.assertEqual({'cpus (dedicated host)': [4, 56], - 'cpus (dedicated)': [1], - 'cpus (standard)': [1, 2, 3, 4], - 'datacenter': ['ams01', 'dal05'], - 'flavors (balanced)': ['B1_1X2X25', 'B1_1X2X100'], - 'flavors (balanced local - hdd)': ['BL1_1X2X100'], - 'flavors (balanced local - ssd)': ['BL2_1X2X100'], - 'flavors (compute)': ['C1_1X2X25'], - 'flavors (memory)': ['M1_1X2X100'], - 'flavors (GPU)': ['AC1_1X2X100', 'ACL1_1X2X100'], - 'flavors (transient)': ['B1_1X2X25_TRANSIENT'], - 'local disk(0)': ['25', '100'], - 'memory': [1024, 2048, 3072, 4096], - 'memory (dedicated host)': [8192, 65536], - 'nic': ['10', '100', '1000'], - 'nic (dedicated host)': ['1000'], - 'os (CENTOS)': 'CENTOS_6_64', - 'os (DEBIAN)': 'DEBIAN_7_64', - 'os (UBUNTU)': 'UBUNTU_12_64'}, - json.loads(result.output)) + self.assertEqual(expected_json_result, json.loads(result.output)) @mock.patch('SoftLayer.CLI.formatting.confirm') def test_dns_sync_both(self, confirm_mock): @@ -357,19 +374,19 @@ def test_dns_sync_both(self, confirm_mock): 'getResourceRecords') getResourceRecords.return_value = [] createAargs = ({ - 'type': 'a', - 'host': 'vs-test1', - 'domainId': 12345, # from SoftLayer_Account::getDomains - 'data': '172.16.240.2', - 'ttl': 7200 - },) + 'type': 'a', + 'host': 'vs-test1', + 'domainId': 12345, # from SoftLayer_Account::getDomains + 'data': '172.16.240.2', + 'ttl': 7200 + },) createPTRargs = ({ - 'type': 'ptr', - 'host': '2', - 'domainId': 123456, - 'data': 'vs-test1.test.sftlyr.ws', - 'ttl': 7200 - },) + 'type': 'ptr', + 'host': '2', + 'domainId': 123456, + 'data': 'vs-test1.test.sftlyr.ws', + 'ttl': 7200 + },) result = self.run_command(['vs', 'dns-sync', '100']) @@ -412,12 +429,12 @@ def test_dns_sync_v6(self, confirm_mock): } } createV6args = ({ - 'type': 'aaaa', - 'host': 'vs-test1', - 'domainId': 12345, - 'data': '2607:f0d0:1b01:0023:0000:0000:0000:0004', - 'ttl': 7200 - },) + 'type': 'aaaa', + 'host': 'vs-test1', + 'domainId': 12345, + 'data': '2607:f0d0:1b01:0023:0000:0000:0000:0004', + 'ttl': 7200 + },) guest.return_value = test_guest result = self.run_command(['vs', 'dns-sync', '--aaaa-record', '100']) self.assert_no_fail(result) From 6f873b04971268effc5c365badac3d098504f868 Mon Sep 17 00:00:00 2001 From: ATGE Date: Fri, 24 Jul 2020 16:56:57 -0400 Subject: [PATCH 2/5] fix vs tests create options --- tests/CLI/modules/vs/vs_tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/CLI/modules/vs/vs_tests.py b/tests/CLI/modules/vs/vs_tests.py index 6494f0c40..bf0221170 100644 --- a/tests/CLI/modules/vs/vs_tests.py +++ b/tests/CLI/modules/vs/vs_tests.py @@ -317,8 +317,8 @@ def test_create_options(self): result = self.run_command(['vs', 'create-options']) expected_json_result = [ [ - {"Datacenter": "ams01"}, - {"Datacenter": "dal05"} + {"datacenter": "ams01"}, + {"datacenter": "dal05"} ], [ {"flavor": "balanced", "value": ["B1_1X2X25", "B1_1X2X100"]}, From b8d56f38161b356c2f2c8b8920f7c42c1708b282 Mon Sep 17 00:00:00 2001 From: ATGE Date: Fri, 24 Jul 2020 19:04:32 -0400 Subject: [PATCH 3/5] fix tox issues --- SoftLayer/CLI/virt/create_options.py | 2 +- tests/CLI/modules/vs/vs_tests.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SoftLayer/CLI/virt/create_options.py b/SoftLayer/CLI/virt/create_options.py index 7e671d028..85139b8ba 100644 --- a/SoftLayer/CLI/virt/create_options.py +++ b/SoftLayer/CLI/virt/create_options.py @@ -62,7 +62,7 @@ def _get_flavors_table(create_options): } if create_options.get('flavors', None) is None: - return + return flavor_table for flavor_option in create_options['flavors']: flavor_key_name = utils.lookup(flavor_option, 'flavor', 'keyName') diff --git a/tests/CLI/modules/vs/vs_tests.py b/tests/CLI/modules/vs/vs_tests.py index bf0221170..629b6e14f 100644 --- a/tests/CLI/modules/vs/vs_tests.py +++ b/tests/CLI/modules/vs/vs_tests.py @@ -351,7 +351,7 @@ def test_create_options(self): {"network": "nic (dedicated host)", "value": ["1000"]} ] ] - + self.maxDiff = None self.assert_no_fail(result) self.assertEqual(expected_json_result, json.loads(result.output)) From 452922eb17c906ba0a644d25ed5cd2feada46f1b Mon Sep 17 00:00:00 2001 From: ATGE Date: Fri, 24 Jul 2020 19:56:29 -0400 Subject: [PATCH 4/5] fix the VirtTests.test_create_options test --- tests/CLI/modules/vs/vs_tests.py | 44 +++++--------------------------- 1 file changed, 6 insertions(+), 38 deletions(-) diff --git a/tests/CLI/modules/vs/vs_tests.py b/tests/CLI/modules/vs/vs_tests.py index 629b6e14f..06d3147ac 100644 --- a/tests/CLI/modules/vs/vs_tests.py +++ b/tests/CLI/modules/vs/vs_tests.py @@ -315,45 +315,13 @@ def test_detail_vs_ptr_error(self): def test_create_options(self): result = self.run_command(['vs', 'create-options']) - expected_json_result = [ - [ - {"datacenter": "ams01"}, - {"datacenter": "dal05"} - ], - [ - {"flavor": "balanced", "value": ["B1_1X2X25", "B1_1X2X100"]}, - {"flavor": "balanced local - hdd", "value": ["BL1_1X2X100"]}, - {"flavor": "balanced local - ssd", "value": ["BL2_1X2X100"]}, - {"flavor": "compute", "value": ["C1_1X2X25"]}, - {"flavor": "memory", "value": ["M1_1X2X100"]}, - {"flavor": "GPU", "value": ["AC1_1X2X100", "ACL1_1X2X100"]}, - {"flavor": "transient", "value": ["B1_1X2X25_TRANSIENT"]} - ], - [ - {"cpu": "standard", "value": [1, 2, 3, 4]}, - {"cpu": "dedicated", "value": [1]}, - {"cpu": "dedicated host", "value": [4, 56]} - ], - [ - {"memory": "standard", "value": [1024, 2048, 3072, 4096]}, - {"memory": "dedicated host", "value": [8192, 65536]} - ], - [ - {"os": "CENTOS", "value": "CENTOS_6_64"}, - {"os": "DEBIAN", "value": "DEBIAN_7_64"}, - {"os": "UBUNTU", "value": "UBUNTU_12_64"} - ], - [ - {"disk": "local disk(0)", "value": ["25", "100"]} - ], - [ - {"network": "nic", "value": ["10", "100", "1000"]}, - {"network": "nic (dedicated host)", "value": ["1000"]} - ] - ] - self.maxDiff = None self.assert_no_fail(result) - self.assertEqual(expected_json_result, json.loads(result.output)) + self.assertIn('datacenter', result.output) + self.assertIn('flavor', result.output) + self.assertIn('memory', result.output) + self.assertIn('cpu', result.output) + self.assertIn('OS', result.output) + self.assertIn('network', result.output) @mock.patch('SoftLayer.CLI.formatting.confirm') def test_dns_sync_both(self, confirm_mock): From 9ff03c0f3f2d8b8a4b1c7bd6a7236c732a97d3a8 Mon Sep 17 00:00:00 2001 From: ATGE Date: Fri, 24 Jul 2020 19:57:24 -0400 Subject: [PATCH 5/5] fix tox analysis issue --- SoftLayer/CLI/virt/create_options.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/SoftLayer/CLI/virt/create_options.py b/SoftLayer/CLI/virt/create_options.py index 85139b8ba..693de74a2 100644 --- a/SoftLayer/CLI/virt/create_options.py +++ b/SoftLayer/CLI/virt/create_options.py @@ -1,9 +1,6 @@ """Virtual server order options.""" # :license: MIT, see LICENSE for more details. # pylint: disable=too-many-statements -import os -import os.path - import click import SoftLayer @@ -128,23 +125,21 @@ def _get_memory_table(create_options): def _get_os_table(create_options): - os_table = formatting.Table(['os', 'value'], title='Operating Systems') - os_table.sortby = 'os' + os_table = formatting.Table(['KeyName', 'Description'], title='Operating Systems') + os_table.sortby = 'KeyName' os_table.align = 'l' - op_sys = [o['template']['operatingSystemReferenceCode'] for o in - create_options['operatingSystems']] - - op_sys = sorted(op_sys) - os_summary = set() + op_sys = [] + for operating_system in create_options['operatingSystems']: + os_option = { + 'referenceCode': operating_system['template']['operatingSystemReferenceCode'], + 'description': operating_system['itemPrice']['item']['description'] + } + op_sys.append(os_option) for operating_system in op_sys: - os_summary.add(operating_system[0:operating_system.find('_')]) - - for summary in sorted(os_summary): os_table.add_row([ - summary, - os.linesep.join(sorted([x for x in op_sys - if x[0:len(summary)] == summary])) + operating_system['referenceCode'], + operating_system['description'] ]) return os_table