From 1c4113d53198d0ba4c45212d1237f0a935d59825 Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Wed, 20 Mar 2019 13:22:45 -0400 Subject: [PATCH 1/2] Fix order place quantity option. --- SoftLayer/CLI/order/place.py | 7 +++- SoftLayer/managers/ordering.py | 12 ++++-- tests/CLI/modules/order_tests.py | 21 ++++++++++ tests/managers/ordering_tests.py | 71 ++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 6 deletions(-) diff --git a/SoftLayer/CLI/order/place.py b/SoftLayer/CLI/order/place.py index 3fe13caac..eb86c40ad 100644 --- a/SoftLayer/CLI/order/place.py +++ b/SoftLayer/CLI/order/place.py @@ -23,6 +23,9 @@ @click.option('--verify', is_flag=True, help="Flag denoting whether or not to only verify the order, not place it") +@click.option('--quantity', + type=int, + help="The quantity of the item being ordered") @click.option('--billing', type=click.Choice(['hourly', 'monthly']), default='hourly', @@ -35,7 +38,7 @@ @click.argument('order_items', nargs=-1) @environment.pass_env def cli(env, package_keyname, location, preset, verify, billing, complex_type, - extras, order_items): + quantity, extras, order_items): """Place or verify an order. This CLI command is used for placing/verifying an order of the specified package in @@ -84,7 +87,7 @@ def cli(env, package_keyname, location, preset, verify, billing, complex_type, args = (package_keyname, location, order_items) kwargs = {'preset_keyname': preset, 'extras': extras, - 'quantity': 1, + 'quantity': quantity, 'complex_type': complex_type, 'hourly': bool(billing == 'hourly')} diff --git a/SoftLayer/managers/ordering.py b/SoftLayer/managers/ordering.py index fbc56b654..a7b53ae7c 100644 --- a/SoftLayer/managers/ordering.py +++ b/SoftLayer/managers/ordering.py @@ -415,7 +415,7 @@ def get_item_prices(self, package_id): return prices def verify_order(self, package_keyname, location, item_keynames, complex_type=None, - hourly=True, preset_keyname=None, extras=None, quantity=1): + hourly=True, preset_keyname=None, extras=None, quantity=None): """Verifies an order with the given package and prices. This function takes in parameters needed for an order and verifies the order @@ -446,7 +446,7 @@ def verify_order(self, package_keyname, location, item_keynames, complex_type=No return self.order_svc.verifyOrder(order) def place_order(self, package_keyname, location, item_keynames, complex_type=None, - hourly=True, preset_keyname=None, extras=None, quantity=1): + hourly=True, preset_keyname=None, extras=None, quantity=None): """Places an order with the given package and prices. This function takes in parameters needed for an order and places the order. @@ -509,7 +509,7 @@ def place_quote(self, package_keyname, location, item_keynames, complex_type=Non return self.order_svc.placeQuote(order) def generate_order(self, package_keyname, location, item_keynames, complex_type=None, - hourly=True, preset_keyname=None, extras=None, quantity=1): + hourly=True, preset_keyname=None, extras=None, quantity=None): """Generates an order with the given package and prices. This function takes in parameters needed for an order and generates an order @@ -546,7 +546,6 @@ def generate_order(self, package_keyname, location, item_keynames, complex_type= order.update(extras) order['packageId'] = package['id'] order['location'] = self.get_location_id(location) - order['quantity'] = quantity order['useHourlyPricing'] = hourly preset_core = None @@ -562,6 +561,11 @@ def generate_order(self, package_keyname, location, item_keynames, complex_type= raise exceptions.SoftLayerError("A complex type must be specified with the order") order['complexType'] = complex_type + if not quantity: + order['quantity'] = 1 + else: + order['quantity'] = quantity + price_ids = self.get_price_id_list(package_keyname, item_keynames, preset_core) order['prices'] = [{'id': price_id} for price_id in price_ids] diff --git a/tests/CLI/modules/order_tests.py b/tests/CLI/modules/order_tests.py index 854690ac6..200258b56 100644 --- a/tests/CLI/modules/order_tests.py +++ b/tests/CLI/modules/order_tests.py @@ -104,6 +104,27 @@ def test_place(self): 'status': 'APPROVED'}, json.loads(result.output)) + def test_place_quantity(self): + order_date = '2017-04-04 07:39:20' + order = {'orderId': 1234, 'orderDate': order_date, 'placedOrder': {'status': 'APPROVED'}} + verify_mock = self.set_mock('SoftLayer_Product_Order', 'verifyOrder') + place_mock = self.set_mock('SoftLayer_Product_Order', 'placeOrder') + items_mock = self.set_mock('SoftLayer_Product_Package', 'getItems') + + verify_mock.return_value = self._get_verified_order_return() + place_mock.return_value = order + items_mock.return_value = self._get_order_items() + + result = self.run_command(['-y', 'order', 'place', '--quantity=2', 'package', 'DALLAS13', 'ITEM1', + '--complex-type', 'SoftLayer_Container_Product_Order_Thing']) + + self.assert_no_fail(result) + self.assert_called_with('SoftLayer_Product_Order', 'placeOrder') + self.assertEqual({'id': 1234, + 'created': order_date, + 'status': 'APPROVED'}, + json.loads(result.output)) + def test_place_extras_parameter_fail(self): result = self.run_command(['-y', 'order', 'place', 'package', 'DALLAS13', 'ITEM1', '--extras', '{"device":[']) diff --git a/tests/managers/ordering_tests.py b/tests/managers/ordering_tests.py index b5d2aaa48..24abbb9f0 100644 --- a/tests/managers/ordering_tests.py +++ b/tests/managers/ordering_tests.py @@ -148,6 +148,21 @@ def test_generate_order_template(self): 'prices': [{'id': 1921}], 'quantity': 1}) + def test_generate_order_template_quantity(self): + result = self.ordering.generate_order_template( + 1234, [{'hostname': 'test1', 'domain': 'example.com'}, {'hostname': 'test2', 'domain': 'example.com'}], + quantity=2) + self.assertEqual(result, {'presetId': None, + 'hardware': [{'domain': 'example.com', + 'hostname': 'test1'}, + {'domain': 'example.com', + 'hostname': 'test2'} + ], + 'useHourlyPricing': '', + 'packageId': 50, + 'prices': [{'id': 1921}], + 'quantity': 2}) + def test_generate_order_template_virtual(self): result = self.ordering.generate_order_template( 1234, [{'hostname': 'test1', 'domain': 'example.com'}], quantity=1) @@ -370,6 +385,34 @@ def test_generate_order_with_preset(self): mock_get_ids.assert_called_once_with(pkg, items, 8) self.assertEqual(expected_order, order) + def test_generate_order_with_quantity(self): + pkg = 'PACKAGE_KEYNAME' + quantity = 2 + items = ['ITEM1', 'ITEM2'] + extras = {"hardware": [{"hostname": "gateway01", "domain": "example.com"}, + {"hostname": "gateway02", "domain": "example.com"}]} + complex_type = 'My_Type' + expected_order = {'orderContainers': [ + {'complexType': 'My_Type', + "hardware": [{"hostname": "gateway01", "domain": "example.com"}, + {"hostname": "gateway02", "domain": "example.com"}], + 'location': 1854895, + 'packageId': 1234, + 'prices': [{'id': 1111}, {'id': 2222}], + 'quantity': 2, + 'useHourlyPricing': True} + ]} + + mock_pkg, mock_preset, mock_get_ids = self._patch_for_generate() + + order = self.ordering.generate_order(pkg, 'DALLAS13', items, complex_type=complex_type, extras=extras, + quantity=quantity) + + mock_pkg.assert_called_once_with(pkg, mask='id') + mock_preset.assert_not_called() + mock_get_ids.assert_called_once_with(pkg, items, None) + self.assertEqual(expected_order, order) + def test_generate_order(self): pkg = 'PACKAGE_KEYNAME' items = ['ITEM1', 'ITEM2'] @@ -444,6 +487,34 @@ def test_place_order(self): extras=extras, quantity=quantity) self.assertEqual(ord_mock.return_value, order) + def test_place_order_with_quantity(self): + ord_mock = self.set_mock('SoftLayer_Product_Order', 'placeOrder') + ord_mock.return_value = {'id': 1234} + pkg = 'PACKAGE_KEYNAME' + location = 'DALLAS13' + items = ['ITEM1', 'ITEM2'] + hourly = True + preset_keyname = 'PRESET' + complex_type = 'Complex_Type' + extras = {"server": [{"hostname": "test01", "domain": "example.com"}, + {"hostname": "test02", "domain": "example.com"}]} + quantity = 2 + + with mock.patch.object(self.ordering, 'generate_order') as gen_mock: + gen_mock.return_value = {'order': {}} + + order = self.ordering.place_order(pkg, location, items, hourly=hourly, + preset_keyname=preset_keyname, + complex_type=complex_type, + extras=extras, quantity=quantity) + print("----------------------------------") + print(order) + gen_mock.assert_called_once_with(pkg, location, items, hourly=hourly, + preset_keyname=preset_keyname, + complex_type=complex_type, + extras=extras, quantity=quantity) + self.assertEqual(ord_mock.return_value, order) + def test_place_quote(self): ord_mock = self.set_mock('SoftLayer_Product_Order', 'placeQuote') ord_mock.return_value = {'id': 1234} From 099175c8cd83c1db5e5f9d627cec7c3b316dc75a Mon Sep 17 00:00:00 2001 From: Fernando Ojeda Date: Wed, 20 Mar 2019 14:58:37 -0400 Subject: [PATCH 2/2] Fix order place quantity option unit test. --- tests/managers/ordering_tests.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/managers/ordering_tests.py b/tests/managers/ordering_tests.py index 24abbb9f0..39aff5de1 100644 --- a/tests/managers/ordering_tests.py +++ b/tests/managers/ordering_tests.py @@ -507,8 +507,7 @@ def test_place_order_with_quantity(self): preset_keyname=preset_keyname, complex_type=complex_type, extras=extras, quantity=quantity) - print("----------------------------------") - print(order) + gen_mock.assert_called_once_with(pkg, location, items, hourly=hourly, preset_keyname=preset_keyname, complex_type=complex_type,