Skip to content

Commit 1947239

Browse files
author
caberos
committed
fix and improve the new code
1 parent f1abcfc commit 1947239

File tree

3 files changed

+73
-61
lines changed

3 files changed

+73
-61
lines changed

SoftLayer/CLI/virt/upgrade.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
"""Upgrade a virtual server."""
22
# :license: MIT, see LICENSE for more details.
33

4-
import json
5-
64
import click
75

86
import SoftLayer
@@ -22,18 +20,20 @@
2220
help="CPU core will be on a dedicated host server.")
2321
@click.option('--memory', type=virt.MEM_TYPE, help="Memory in megabytes")
2422
@click.option('--network', type=click.INT, help="Network port speed in Mbps")
25-
@click.option('--add', type=click.INT, required=False, help="add Hard disk in GB")
26-
@click.option('--disk', nargs=1, help="update the number and capacity in GB Hard disk, E.G {'number':2,'capacity':100}")
23+
@click.option('--add-disk', type=click.INT, multiple=True, required=False, help="add Hard disk in GB")
24+
@click.option('--resize-disk', nargs=2, multiple=True, type=(int, int),
25+
help="Update disk number to size in GB. --resize-disk 250 2 ")
2726
@click.option('--flavor', type=click.STRING,
2827
help="Flavor keyName\nDo not use --memory, --cpu or --private, if you are using flavors")
2928
@environment.pass_env
30-
def cli(env, identifier, cpu, private, memory, network, flavor, disk, add):
29+
def cli(env, identifier, cpu, private, memory, network, flavor, add_disk, resize_disk):
3130
"""Upgrade a virtual server."""
3231

3332
vsi = SoftLayer.VSManager(env.client)
3433

35-
if not any([cpu, memory, network, flavor, disk, add]):
36-
raise exceptions.ArgumentError("Must provide [--cpu], [--memory], [--network], or [--flavor] to upgrade")
34+
if not any([cpu, memory, network, flavor, resize_disk, add_disk]):
35+
raise exceptions.ArgumentError("Must provide [--cpu],"
36+
" [--memory], [--network], [--flavor], [--resize-disk], or [--add] to upgrade")
3737

3838
if private and not cpu:
3939
raise exceptions.ArgumentError("Must specify [--cpu] when using [--private]")
@@ -44,9 +44,18 @@ def cli(env, identifier, cpu, private, memory, network, flavor, disk, add):
4444

4545
if memory:
4646
memory = int(memory / 1024)
47-
if disk is not None:
48-
disk = json.loads(disk)
47+
if resize_disk:
48+
disk_json = list()
49+
for guest_disk in resize_disk:
50+
disks = {'capacity': guest_disk[0], 'number': guest_disk[1]}
51+
disk_json.append(disks)
52+
53+
elif add_disk:
54+
disk_json = list()
55+
for guest_disk in add_disk:
56+
disks = {'capacity': guest_disk, 'number': -1}
57+
disk_json.append(disks)
4958

5059
if not vsi.upgrade(vs_id, cpus=cpu, memory=memory, nic_speed=network, public=not private, preset=flavor,
51-
disk=disk, add=add):
60+
disk=disk_json):
5261
raise exceptions.CLIAbort('VS Upgrade Failed')

SoftLayer/managers/vs.py

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -819,8 +819,7 @@ def capture(self, instance_id, name, additional_disks=False, notes=None):
819819
return self.guest.createArchiveTransaction(
820820
name, disks_to_capture, notes, id=instance_id)
821821

822-
def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=True, preset=None,
823-
disk=None, add=None):
822+
def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=True, preset=None, disk=None):
824823
"""Upgrades a VS instance.
825824
826825
Example::
@@ -853,10 +852,7 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
853852
if memory is not None and preset is not None:
854853
raise ValueError("Do not use memory, private or cpu if you are using flavors")
855854
data['memory'] = memory
856-
if disk is not None:
857-
data['disk'] = disk.get('capacity')
858-
elif add is not None:
859-
data['disk'] = add
855+
860856
maintenance_window = datetime.datetime.now(utils.UTC())
861857
order = {
862858
'complexType': 'SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade',
@@ -867,6 +863,35 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
867863
'virtualGuests': [{'id': int(instance_id)}],
868864
}
869865

866+
if disk:
867+
disk_number = 0
868+
vsi_disk = self.get_instance(instance_id)
869+
for item in vsi_disk.get('billingItem').get('children'):
870+
if item.get('categoryCode').__contains__('guest_disk'):
871+
if disk_number < int("".join(filter(str.isdigit, item.get('categoryCode')))):
872+
disk_number = int("".join(filter(str.isdigit, item.get('categoryCode'))))
873+
for disk_guest in disk:
874+
if disk_guest.get('number') > 0:
875+
price_id = self._get_price_id_for_upgrade_option(upgrade_prices, 'disk',
876+
disk_guest.get('capacity'),
877+
public)
878+
disk_number = disk_guest.get('number')
879+
880+
else:
881+
price_id = self._get_price_id_for_upgrade_option(upgrade_prices, 'disk',
882+
disk_guest.get('capacity'),
883+
public)
884+
disk_number = disk_number + 1
885+
886+
category = {'categories': [{
887+
'categoryCode': 'guest_disk' + str(disk_number),
888+
'complexType': "SoftLayer_Product_Item_Category"}],
889+
'complexType': 'SoftLayer_Product_Item_Price',
890+
'id': price_id}
891+
892+
prices.append(category)
893+
order['prices'] = prices
894+
870895
for option, value in data.items():
871896
if not value:
872897
continue
@@ -879,28 +904,7 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
879904
raise exceptions.SoftLayerError(
880905
"Unable to find %s option with value %s" % (option, value))
881906

882-
if disk is not None:
883-
category = {'categories': [{
884-
'categoryCode': 'guest_disk' + str(disk.get('number')),
885-
'complexType': "SoftLayer_Product_Item_Category"
886-
}], 'complexType': 'SoftLayer_Product_Item_Price'}
887-
prices.append(category)
888-
prices[0]['id'] = price_id
889-
elif add:
890-
vsi_disk = self.get_instance(instance_id)
891-
disk_number = 0
892-
for item in vsi_disk.get('billingItem').get('children'):
893-
if item.get('categoryCode').__contains__('guest_disk'):
894-
if disk_number < int("".join(filter(str.isdigit, item.get('categoryCode')))):
895-
disk_number = int("".join(filter(str.isdigit, item.get('categoryCode'))))
896-
category = {'categories': [{
897-
'categoryCode': 'guest_disk' + str(disk_number + 1),
898-
'complexType': "SoftLayer_Product_Item_Category"
899-
}], 'complexType': 'SoftLayer_Product_Item_Price'}
900-
prices.append(category)
901-
prices[0]['id'] = price_id
902-
else:
903-
prices.append({'id': price_id})
907+
prices.append({'id': price_id})
904908

905909
order['prices'] = prices
906910
if preset is not None:
@@ -1024,6 +1028,7 @@ def _get_price_id_for_upgrade_option(self, upgrade_prices, option, value, public
10241028
'disk': 'guest_disk'
10251029
}
10261030
category_code = option_category.get(option)
1031+
10271032
for price in upgrade_prices:
10281033
if price.get('categories') is None or price.get('item') is None:
10291034
continue
@@ -1034,7 +1039,7 @@ def _get_price_id_for_upgrade_option(self, upgrade_prices, option, value, public
10341039

10351040
for category in price.get('categories'):
10361041
if option == 'disk':
1037-
if not (category_code == (''.join([i for i in category.get('categoryCode') if not i.isdigit()]))
1042+
if (category_code == (''.join([i for i in category.get('categoryCode') if not i.isdigit()]))
10381043
and str(product.get('capacity')) == str(value)):
10391044
return price.get('id')
10401045

@@ -1052,8 +1057,6 @@ def _get_price_id_for_upgrade_option(self, upgrade_prices, option, value, public
10521057
elif option == 'nic_speed':
10531058
if 'Public' in product.get('description'):
10541059
return price.get('id')
1055-
elif option == 'disk':
1056-
return price.get('id')
10571060
else:
10581061
return price.get('id')
10591062

tests/CLI/modules/vs/vs_tests.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -370,19 +370,19 @@ def test_dns_sync_both(self, confirm_mock):
370370
'getResourceRecords')
371371
getResourceRecords.return_value = []
372372
createAargs = ({
373-
'type': 'a',
374-
'host': 'vs-test1',
375-
'domainId': 12345, # from SoftLayer_Account::getDomains
376-
'data': '172.16.240.2',
377-
'ttl': 7200
378-
},)
373+
'type': 'a',
374+
'host': 'vs-test1',
375+
'domainId': 12345, # from SoftLayer_Account::getDomains
376+
'data': '172.16.240.2',
377+
'ttl': 7200
378+
},)
379379
createPTRargs = ({
380-
'type': 'ptr',
381-
'host': '2',
382-
'domainId': 123456,
383-
'data': 'vs-test1.test.sftlyr.ws',
384-
'ttl': 7200
385-
},)
380+
'type': 'ptr',
381+
'host': '2',
382+
'domainId': 123456,
383+
'data': 'vs-test1.test.sftlyr.ws',
384+
'ttl': 7200
385+
},)
386386

387387
result = self.run_command(['vs', 'dns-sync', '100'])
388388

@@ -425,12 +425,12 @@ def test_dns_sync_v6(self, confirm_mock):
425425
}
426426
}
427427
createV6args = ({
428-
'type': 'aaaa',
429-
'host': 'vs-test1',
430-
'domainId': 12345,
431-
'data': '2607:f0d0:1b01:0023:0000:0000:0000:0004',
432-
'ttl': 7200
433-
},)
428+
'type': 'aaaa',
429+
'host': 'vs-test1',
430+
'domainId': 12345,
431+
'data': '2607:f0d0:1b01:0023:0000:0000:0000:0004',
432+
'ttl': 7200
433+
},)
434434
guest.return_value = test_guest
435435
result = self.run_command(['vs', 'dns-sync', '--aaaa-record', '100'])
436436
self.assert_no_fail(result)
@@ -574,7 +574,7 @@ def test_upgrade(self, confirm_mock):
574574
def test_upgrade_disk(self, confirm_mock):
575575
confirm_mock.return_value = True
576576
result = self.run_command(['vs', 'upgrade', '100', '--flavor=M1_64X512X100',
577-
'--disk={"number":1,"capacity":10}'])
577+
'--resize-disk=10', '1', '--resize-disk=10', '2'])
578578
self.assert_no_fail(result)
579579
self.assert_called_with('SoftLayer_Product_Order', 'placeOrder')
580580
call = self.calls('SoftLayer_Product_Order', 'placeOrder')[0]
@@ -598,7 +598,7 @@ def test_upgrade_with_flavor(self, confirm_mock):
598598
@mock.patch('SoftLayer.CLI.formatting.confirm')
599599
def test_upgrade_with_add_disk(self, confirm_mock):
600600
confirm_mock.return_value = True
601-
result = self.run_command(['vs', 'upgrade', '100', '--add=10'])
601+
result = self.run_command(['vs', 'upgrade', '100', '--add-disk=10', '--add-disk=10'])
602602
self.assert_no_fail(result)
603603
self.assert_called_with('SoftLayer_Product_Order', 'placeOrder')
604604
call = self.calls('SoftLayer_Product_Order', 'placeOrder')[0]

0 commit comments

Comments
 (0)