From 192b192e6d975245993de56a932a9c2f3e77dcf7 Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Fri, 5 Oct 2018 18:21:49 -0400 Subject: [PATCH 1/6] fixed suspend cloud server order. --- .../fixtures/SoftLayer_Product_Package.py | 5 +++ .../SoftLayer_Product_Package_Preset.py | 1 + SoftLayer/managers/ordering.py | 31 ++++++++++++++++--- tests/managers/ordering_tests.py | 17 +++++----- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/SoftLayer/fixtures/SoftLayer_Product_Package.py b/SoftLayer/fixtures/SoftLayer_Product_Package.py index b7b008788..66a558205 100644 --- a/SoftLayer/fixtures/SoftLayer_Product_Package.py +++ b/SoftLayer/fixtures/SoftLayer_Product_Package.py @@ -1346,6 +1346,11 @@ "hourlyRecurringFee": ".093", "id": 204015, "recurringFee": "62", + "categories": [ + { + "categoryCode": "guest_core" + } + ], "item": { "description": "4 x 2.0 GHz or higher Cores", "id": 859, diff --git a/SoftLayer/fixtures/SoftLayer_Product_Package_Preset.py b/SoftLayer/fixtures/SoftLayer_Product_Package_Preset.py index d111b9595..ec3356c1d 100644 --- a/SoftLayer/fixtures/SoftLayer_Product_Package_Preset.py +++ b/SoftLayer/fixtures/SoftLayer_Product_Package_Preset.py @@ -49,6 +49,7 @@ "id": 209595, "recurringFee": "118.26", "item": { + "capacity": 8, "description": "8 x 2.0 GHz or higher Cores", "id": 11307, "keyName": "GUEST_CORE_8", diff --git a/SoftLayer/managers/ordering.py b/SoftLayer/managers/ordering.py index 01a182ae1..a6e71f1b7 100644 --- a/SoftLayer/managers/ordering.py +++ b/SoftLayer/managers/ordering.py @@ -322,7 +322,7 @@ def get_preset_by_key(self, package_keyname, preset_keyname, mask=None): return presets[0] - def get_price_id_list(self, package_keyname, item_keynames): + def get_price_id_list(self, package_keyname, item_keynames, core): """Converts a list of item keynames to a list of price IDs. This function is used to convert a list of item keynames into @@ -331,6 +331,7 @@ def get_price_id_list(self, package_keyname, item_keynames): :param str package_keyname: The package associated with the prices :param list item_keynames: A list of item keyname strings + :param str core: preset guest core capacity. :returns: A list of price IDs associated with the given item keynames in the given package @@ -356,8 +357,11 @@ def get_price_id_list(self, package_keyname, item_keynames): # can take that ID and create the proper price for us in the location # in which the order is made if matching_item['itemCategory']['categoryCode'] != "gpu0": - price_id = [p['id'] for p in matching_item['prices'] - if not p['locationGroupId']][0] + price_id = None + category_code = [] + for price in matching_item['prices']: + if not price['locationGroupId']: + price_id = self.save_price_id(category_code, core, price, price_id) else: # GPU items has two generic prices and they are added to the list # according to the number of gpu items added in the order. @@ -370,6 +374,20 @@ def get_price_id_list(self, package_keyname, item_keynames): return prices + @staticmethod + def save_price_id(category_code, core, price, price_id): + """Save item prices ids""" + if 'capacityRestrictionMinimum' not in price: + if price['categories'][0]['categoryCode'] not in category_code: + category_code.append(price['categories'][0]['categoryCode']) + price_id = price['id'] + elif int(price['capacityRestrictionMinimum']) <= int(core) <= int( + price['capacityRestrictionMaximum']): + if price['categories'][0]['categoryCode'] not in category_code: + category_code.append(price['categories'][0]['categoryCode']) + price_id = price['id'] + return price_id + def get_preset_prices(self, preset): """Get preset item prices. @@ -534,15 +552,20 @@ def generate_order(self, package_keyname, location, item_keynames, complex_type= order['quantity'] = quantity order['useHourlyPricing'] = hourly + preset_core = None if preset_keyname: preset_id = self.get_preset_by_key(package_keyname, preset_keyname)['id'] + preset_items = self.get_preset_prices(preset_id) + for item in preset_items['prices']: + if item['item']['itemCategory']['categoryCode'] == "guest_core": + preset_core = item['item']['capacity'] order['presetId'] = preset_id if not complex_type: raise exceptions.SoftLayerError("A complex type must be specified with the order") order['complexType'] = complex_type - price_ids = self.get_price_id_list(package_keyname, item_keynames) + price_ids = self.get_price_id_list(package_keyname, item_keynames, preset_core) order['prices'] = [{'id': price_id} for price_id in price_ids] container['orderContainers'] = [order] diff --git a/tests/managers/ordering_tests.py b/tests/managers/ordering_tests.py index 0ea7c7546..093c68ccf 100644 --- a/tests/managers/ordering_tests.py +++ b/tests/managers/ordering_tests.py @@ -296,7 +296,8 @@ def test_get_preset_by_key_preset_not_found(self): def test_get_price_id_list(self): category1 = {'categoryCode': 'cat1'} - price1 = {'id': 1234, 'locationGroupId': None, 'itemCategory': [category1]} + price1 = {'id': 1234, 'locationGroupId': None, 'categories': [{"categoryCode": "guest_core"}], + 'itemCategory': [category1]} item1 = {'id': 1111, 'keyName': 'ITEM1', 'itemCategory': category1, 'prices': [price1]} category2 = {'categoryCode': 'cat2'} price2 = {'id': 5678, 'locationGroupId': None, 'categories': [category2]} @@ -305,7 +306,7 @@ def test_get_price_id_list(self): with mock.patch.object(self.ordering, 'list_items') as list_mock: list_mock.return_value = [item1, item2] - prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM2']) + prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM2'], "8") list_mock.assert_called_once_with('PACKAGE_KEYNAME', mask='id, itemCategory, keyName, prices[categories]') self.assertEqual([price1['id'], price2['id']], prices) @@ -320,7 +321,7 @@ def test_get_price_id_list_item_not_found(self): exc = self.assertRaises(exceptions.SoftLayerError, self.ordering.get_price_id_list, - 'PACKAGE_KEYNAME', ['ITEM2']) + 'PACKAGE_KEYNAME', ['ITEM2'], "8") list_mock.assert_called_once_with('PACKAGE_KEYNAME', mask='id, itemCategory, keyName, prices[categories]') self.assertEqual("Item ITEM2 does not exist for package PACKAGE_KEYNAME", str(exc)) @@ -333,7 +334,7 @@ def test_get_price_id_list_gpu_items_with_two_categories(self): with mock.patch.object(self.ordering, 'list_items') as list_mock: list_mock.return_value = [item1, item1] - prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM1']) + prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM1'], "8") list_mock.assert_called_once_with('PACKAGE_KEYNAME', mask='id, itemCategory, keyName, prices[categories]') self.assertEqual([price2['id'], price1['id']], prices) @@ -366,7 +367,7 @@ def test_generate_order_with_preset(self): mock_pkg.assert_called_once_with(pkg, mask='id') mock_preset.assert_called_once_with(pkg, preset) - mock_get_ids.assert_called_once_with(pkg, items) + mock_get_ids.assert_called_once_with(pkg, items, 8) self.assertEqual(expected_order, order) def test_generate_order(self): @@ -388,7 +389,7 @@ def test_generate_order(self): mock_pkg.assert_called_once_with(pkg, mask='id') mock_preset.assert_not_called() - mock_get_ids.assert_called_once_with(pkg, items) + mock_get_ids.assert_called_once_with(pkg, items, None) self.assertEqual(expected_order, order) def test_verify_order(self): @@ -526,7 +527,7 @@ def test_location_group_id_none(self): with mock.patch.object(self.ordering, 'list_items') as list_mock: list_mock.return_value = [item1, item2] - prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM2']) + prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM2'], "8") list_mock.assert_called_once_with('PACKAGE_KEYNAME', mask='id, itemCategory, keyName, prices[categories]') self.assertEqual([price1['id'], price2['id']], prices) @@ -543,7 +544,7 @@ def test_location_groud_id_empty(self): with mock.patch.object(self.ordering, 'list_items') as list_mock: list_mock.return_value = [item1, item2] - prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM2']) + prices = self.ordering.get_price_id_list('PACKAGE_KEYNAME', ['ITEM1', 'ITEM2'], "8") list_mock.assert_called_once_with('PACKAGE_KEYNAME', mask='id, itemCategory, keyName, prices[categories]') self.assertEqual([price1['id'], price2['id']], prices) From ad84d58bcaccd688ae4f81f32977b3b05144aa2b Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Mon, 8 Oct 2018 15:42:25 -0400 Subject: [PATCH 2/6] unit test suspend cloud server --- SoftLayer/managers/ordering.py | 8 ++++---- tests/managers/ordering_tests.py | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/SoftLayer/managers/ordering.py b/SoftLayer/managers/ordering.py index a6e71f1b7..af27fbffb 100644 --- a/SoftLayer/managers/ordering.py +++ b/SoftLayer/managers/ordering.py @@ -358,10 +358,9 @@ def get_price_id_list(self, package_keyname, item_keynames, core): # in which the order is made if matching_item['itemCategory']['categoryCode'] != "gpu0": price_id = None - category_code = [] for price in matching_item['prices']: if not price['locationGroupId']: - price_id = self.save_price_id(category_code, core, price, price_id) + price_id = self.get_item_price_id(core, price, price_id) else: # GPU items has two generic prices and they are added to the list # according to the number of gpu items added in the order. @@ -375,8 +374,9 @@ def get_price_id_list(self, package_keyname, item_keynames, core): return prices @staticmethod - def save_price_id(category_code, core, price, price_id): - """Save item prices ids""" + def get_item_price_id(core, price, price_id): + """get item price id""" + category_code = [] if 'capacityRestrictionMinimum' not in price: if price['categories'][0]['categoryCode'] not in category_code: category_code.append(price['categories'][0]['categoryCode']) diff --git a/tests/managers/ordering_tests.py b/tests/managers/ordering_tests.py index 093c68ccf..4928c4bd5 100644 --- a/tests/managers/ordering_tests.py +++ b/tests/managers/ordering_tests.py @@ -548,3 +548,28 @@ def test_location_groud_id_empty(self): list_mock.assert_called_once_with('PACKAGE_KEYNAME', mask='id, itemCategory, keyName, prices[categories]') self.assertEqual([price1['id'], price2['id']], prices) + + def test_get_item_price_id_without_capacity_restriction(self): + category1 = {'categoryCode': 'cat1'} + price1 = {'id': 1234, 'locationGroupId': '', 'categories': [category1]} + + with mock.patch.object(self.ordering, 'get_item_price_id') as list_mock: + list_mock.return_value = [price1] + + prices = self.ordering.get_item_price_id("8", price1) + + list_mock.assert_called_once_with("8", price1) + self.assertEqual(1234, prices[0]['id']) + + def test_get_item_price_id_with_capacity_restriction(self): + category1 = {'categoryCode': 'cat1'} + price1 = {'id': 1234, 'locationGroupId': '', "capacityRestrictionMaximum": "16", + "capacityRestrictionMinimum": "1", 'categories': [category1]} + + with mock.patch.object(self.ordering, 'get_item_price_id') as list_mock: + list_mock.return_value = [price1] + + prices = self.ordering.get_item_price_id("8", price1) + + list_mock.assert_called_once_with("8", price1) + self.assertEqual(1234, prices[0]['id']) From f5da2d60308fe86d41320d1d5eb80d376641de9b Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Tue, 9 Oct 2018 14:43:52 -0400 Subject: [PATCH 3/6] Unit test suspend cloud server order --- tests/managers/ordering_tests.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/managers/ordering_tests.py b/tests/managers/ordering_tests.py index 4928c4bd5..4319ff149 100644 --- a/tests/managers/ordering_tests.py +++ b/tests/managers/ordering_tests.py @@ -553,23 +553,15 @@ def test_get_item_price_id_without_capacity_restriction(self): category1 = {'categoryCode': 'cat1'} price1 = {'id': 1234, 'locationGroupId': '', 'categories': [category1]} - with mock.patch.object(self.ordering, 'get_item_price_id') as list_mock: - list_mock.return_value = [price1] + price_id = self.ordering.get_item_price_id("8", price1, None) - prices = self.ordering.get_item_price_id("8", price1) - - list_mock.assert_called_once_with("8", price1) - self.assertEqual(1234, prices[0]['id']) + self.assertEqual(1234, price_id) def test_get_item_price_id_with_capacity_restriction(self): category1 = {'categoryCode': 'cat1'} price1 = {'id': 1234, 'locationGroupId': '', "capacityRestrictionMaximum": "16", "capacityRestrictionMinimum": "1", 'categories': [category1]} - with mock.patch.object(self.ordering, 'get_item_price_id') as list_mock: - list_mock.return_value = [price1] - - prices = self.ordering.get_item_price_id("8", price1) + price_id = self.ordering.get_item_price_id("8", price1, None) - list_mock.assert_called_once_with("8", price1) - self.assertEqual(1234, prices[0]['id']) + self.assertEqual(1234, price_id) From 8056e816185bb13a80194abd5808cdb925d2c13c Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Wed, 10 Oct 2018 09:56:33 -0400 Subject: [PATCH 4/6] Refactored suspend cloud server order --- SoftLayer/managers/ordering.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/SoftLayer/managers/ordering.py b/SoftLayer/managers/ordering.py index af27fbffb..17feb0580 100644 --- a/SoftLayer/managers/ordering.py +++ b/SoftLayer/managers/ordering.py @@ -322,7 +322,7 @@ def get_preset_by_key(self, package_keyname, preset_keyname, mask=None): return presets[0] - def get_price_id_list(self, package_keyname, item_keynames, core): + def get_price_id_list(self, package_keyname, item_keynames, core=None): """Converts a list of item keynames to a list of price IDs. This function is used to convert a list of item keynames into @@ -377,12 +377,13 @@ def get_price_id_list(self, package_keyname, item_keynames, core): def get_item_price_id(core, price, price_id): """get item price id""" category_code = [] - if 'capacityRestrictionMinimum' not in price: + capacity_min = int(price.get('capacityRestrictionMinimum', -1)) + capacity_max = int(price.get('capacityRestrictionMaximum', -1)) + if capacity_min is -1: if price['categories'][0]['categoryCode'] not in category_code: category_code.append(price['categories'][0]['categoryCode']) price_id = price['id'] - elif int(price['capacityRestrictionMinimum']) <= int(core) <= int( - price['capacityRestrictionMaximum']): + elif capacity_min <= int(core) <= capacity_max: if price['categories'][0]['categoryCode'] not in category_code: category_code.append(price['categories'][0]['categoryCode']) price_id = price['id'] From d7473db02bd9bd06ff3ca9e7478bfbbac570e49b Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Wed, 10 Oct 2018 10:17:01 -0400 Subject: [PATCH 5/6] Refactored suspend cloud server order --- SoftLayer/managers/ordering.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SoftLayer/managers/ordering.py b/SoftLayer/managers/ordering.py index 17feb0580..361ce0102 100644 --- a/SoftLayer/managers/ordering.py +++ b/SoftLayer/managers/ordering.py @@ -379,7 +379,7 @@ def get_item_price_id(core, price, price_id): category_code = [] capacity_min = int(price.get('capacityRestrictionMinimum', -1)) capacity_max = int(price.get('capacityRestrictionMaximum', -1)) - if capacity_min is -1: + if capacity_min == -1: if price['categories'][0]['categoryCode'] not in category_code: category_code.append(price['categories'][0]['categoryCode']) price_id = price['id'] From d989dfd18b950d1261311e0901c48614b7b936a8 Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Thu, 11 Oct 2018 10:34:50 -0400 Subject: [PATCH 6/6] Refactored suspend cloud server order --- SoftLayer/managers/ordering.py | 27 +++++++++++---------------- tests/managers/ordering_tests.py | 14 +++++++++----- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/SoftLayer/managers/ordering.py b/SoftLayer/managers/ordering.py index 361ce0102..5b6927369 100644 --- a/SoftLayer/managers/ordering.py +++ b/SoftLayer/managers/ordering.py @@ -357,10 +357,7 @@ def get_price_id_list(self, package_keyname, item_keynames, core=None): # can take that ID and create the proper price for us in the location # in which the order is made if matching_item['itemCategory']['categoryCode'] != "gpu0": - price_id = None - for price in matching_item['prices']: - if not price['locationGroupId']: - price_id = self.get_item_price_id(core, price, price_id) + price_id = self.get_item_price_id(core, matching_item['prices']) else: # GPU items has two generic prices and they are added to the list # according to the number of gpu items added in the order. @@ -374,19 +371,17 @@ def get_price_id_list(self, package_keyname, item_keynames, core=None): return prices @staticmethod - def get_item_price_id(core, price, price_id): + def get_item_price_id(core, prices): """get item price id""" - category_code = [] - capacity_min = int(price.get('capacityRestrictionMinimum', -1)) - capacity_max = int(price.get('capacityRestrictionMaximum', -1)) - if capacity_min == -1: - if price['categories'][0]['categoryCode'] not in category_code: - category_code.append(price['categories'][0]['categoryCode']) - price_id = price['id'] - elif capacity_min <= int(core) <= capacity_max: - if price['categories'][0]['categoryCode'] not in category_code: - category_code.append(price['categories'][0]['categoryCode']) - price_id = price['id'] + price_id = None + for price in prices: + if not price['locationGroupId']: + capacity_min = int(price.get('capacityRestrictionMinimum', -1)) + capacity_max = int(price.get('capacityRestrictionMaximum', -1)) + if capacity_min == -1: + price_id = price['id'] + elif capacity_min <= int(core) <= capacity_max: + price_id = price['id'] return price_id def get_preset_prices(self, preset): diff --git a/tests/managers/ordering_tests.py b/tests/managers/ordering_tests.py index 4319ff149..a0a253a9f 100644 --- a/tests/managers/ordering_tests.py +++ b/tests/managers/ordering_tests.py @@ -551,17 +551,21 @@ def test_location_groud_id_empty(self): def test_get_item_price_id_without_capacity_restriction(self): category1 = {'categoryCode': 'cat1'} - price1 = {'id': 1234, 'locationGroupId': '', 'categories': [category1]} + category2 = {'categoryCode': 'cat2'} + prices = [{'id': 1234, 'locationGroupId': '', 'categories': [category1]}, + {'id': 2222, 'locationGroupId': 509, 'categories': [category2]}] - price_id = self.ordering.get_item_price_id("8", price1, None) + price_id = self.ordering.get_item_price_id("8", prices) self.assertEqual(1234, price_id) def test_get_item_price_id_with_capacity_restriction(self): category1 = {'categoryCode': 'cat1'} - price1 = {'id': 1234, 'locationGroupId': '', "capacityRestrictionMaximum": "16", - "capacityRestrictionMinimum": "1", 'categories': [category1]} + price1 = [{'id': 1234, 'locationGroupId': '', "capacityRestrictionMaximum": "16", + "capacityRestrictionMinimum": "1", 'categories': [category1]}, + {'id': 2222, 'locationGroupId': '', "capacityRestrictionMaximum": "56", + "capacityRestrictionMinimum": "36", 'categories': [category1]}] - price_id = self.ordering.get_item_price_id("8", price1, None) + price_id = self.ordering.get_item_price_id("8", price1) self.assertEqual(1234, price_id)