Skip to content

Commit d589ba4

Browse files
Merge pull request #1804 from BrianSantivanez/issue1802
`slcli vs upgrade --resize-disk` is resizing another disk and not the selected one
2 parents 60948da + ada3050 commit d589ba4

File tree

3 files changed

+106
-1
lines changed

3 files changed

+106
-1
lines changed

SoftLayer/fixtures/SoftLayer_Product_Package.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2216,3 +2216,63 @@
22162216
}
22172217
]
22182218
}]
2219+
2220+
getVSDiskItemPrices = [
2221+
{
2222+
"id": 2255,
2223+
"locationGroupId": None,
2224+
"categories": [
2225+
{
2226+
"categoryCode": "guest_disk1",
2227+
"id": 82,
2228+
"name": "Second Disk",
2229+
"quantityLimit": 0,
2230+
"sortOrder": None
2231+
},
2232+
{
2233+
"categoryCode": "guest_disk2",
2234+
"id": 92,
2235+
"name": "Third Disk",
2236+
"quantityLimit": 0,
2237+
"sortOrder": None
2238+
},
2239+
{
2240+
"categoryCode": "guest_disk3",
2241+
"id": 93,
2242+
"name": "Fourth Disk",
2243+
"quantityLimit": 0,
2244+
"sortOrder": None
2245+
},
2246+
{
2247+
"categoryCode": "guest_disk4",
2248+
"id": 116,
2249+
"name": "Fifth Disk",
2250+
"quantityLimit": 0,
2251+
"sortOrder": None
2252+
}
2253+
],
2254+
"item": {
2255+
"capacity": "10",
2256+
"description": "10 GB (SAN)",
2257+
"keyName": "GUEST_DISK_10_GB_SAN"
2258+
}
2259+
},
2260+
{
2261+
"id": 1639,
2262+
"locationGroupId": None,
2263+
"categories": [
2264+
{
2265+
"categoryCode": "guest_disk0",
2266+
"id": 81,
2267+
"name": "First Disk",
2268+
"quantityLimit": 0,
2269+
"sortOrder": None
2270+
}
2271+
],
2272+
"item": {
2273+
"capacity": "10",
2274+
"description": "10 GB (SAN)",
2275+
"keyName": "GUEST_DISK_10_GB_SAN"
2276+
}
2277+
}
2278+
]

SoftLayer/managers/vs.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1068,8 +1068,11 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
10681068
'Unable to find %s option with value %s' % (
10691069
('disk', disk_guest.get('capacity'))))
10701070

1071+
category_id = self.get_disk_category_id_by_disk_number(disk_guest.get('capacity'), disk_number)
1072+
if category_id is None:
1073+
raise exceptions.SoftLayerError('Invalid disk number to this disk capacity')
10711074
category = {'categories': [{
1072-
'categoryCode': 'guest_disk' + str(disk_number),
1075+
'id': category_id,
10731076
'complexType': "SoftLayer_Product_Item_Category"}],
10741077
'complexType': 'SoftLayer_Product_Item_Price',
10751078
'id': price_id}
@@ -1101,6 +1104,43 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
11011104
return True
11021105
return False
11031106

1107+
def get_disk_category_id_by_disk_number(self, capacity, disk_number):
1108+
"""Uses Product_Package::getItemPrices to get all disk items with its categories and
1109+
1110+
disk_key_names dictionary to convert disk numbers (int) to ordinal numbers (string)
1111+
"""
1112+
disk_key_names = {
1113+
1: "First Disk",
1114+
2: "Second Disk",
1115+
3: "Third Disk",
1116+
4: "Fourth Disk",
1117+
5: "Fifth Disk",
1118+
}
1119+
category_to_request = disk_key_names.get(disk_number)
1120+
if category_to_request is None:
1121+
return None
1122+
1123+
key_name = "*= GUEST_DISK_"+str(capacity)+"_GB_SAN"
1124+
object_filter = {
1125+
"itemPrices": {
1126+
"locationGroupId": {"operation": "is null"},
1127+
"item": {
1128+
"keyName": {"operation": key_name}
1129+
}
1130+
}
1131+
}
1132+
mask = "mask[id,locationGroupId,item[capacity,description,keyName],categories]"
1133+
disk_items = self.client.call(
1134+
'SoftLayer_Product_Package', 'getItemPrices', id=46, mask=mask, filter=object_filter
1135+
)
1136+
category_id = None
1137+
for disk_item in disk_items:
1138+
for category in disk_item.get('categories'):
1139+
if category.get('name') == category_to_request:
1140+
category_id = category.get('id')
1141+
break
1142+
return category_id
1143+
11041144
def order_guest(self, guest_object, test=False):
11051145
"""Uses Product_Order::placeOrder to create a virtual guest.
11061146

tests/CLI/modules/vs/vs_tests.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from unittest import mock as mock
1111

1212
from SoftLayer.CLI import exceptions
13+
from SoftLayer.fixtures import SoftLayer_Product_Package
1314
from SoftLayer.fixtures import SoftLayer_Virtual_Guest as SoftLayer_Virtual_Guest
1415
from SoftLayer import SoftLayerAPIError
1516
from SoftLayer import SoftLayerError
@@ -565,6 +566,8 @@ def test_upgrade(self, confirm_mock):
565566
@mock.patch('SoftLayer.CLI.formatting.confirm')
566567
def test_upgrade_disk(self, confirm_mock):
567568
confirm_mock.return_value = True
569+
mock = self.set_mock('SoftLayer_Product_Package', 'getItemPrices')
570+
mock.return_value = SoftLayer_Product_Package.getVSDiskItemPrices
568571
result = self.run_command(['vs', 'upgrade', '100', '--flavor=M1_64X512X100',
569572
'--resize-disk=10', '1', '--resize-disk=10', '2'])
570573
self.assert_no_fail(result)
@@ -598,6 +601,8 @@ def test_upgrade_with_flavor(self, confirm_mock):
598601
@mock.patch('SoftLayer.CLI.formatting.confirm')
599602
def test_upgrade_with_add_disk(self, confirm_mock):
600603
confirm_mock.return_value = True
604+
mock = self.set_mock('SoftLayer_Product_Package', 'getItemPrices')
605+
mock.return_value = SoftLayer_Product_Package.getVSDiskItemPrices
601606
result = self.run_command(['vs', 'upgrade', '100', '--add-disk=10', '--add-disk=10'])
602607
self.assert_no_fail(result)
603608
self.assert_called_with('SoftLayer_Product_Order', 'placeOrder')

0 commit comments

Comments
 (0)