From 0b6536d9d398b6c8cdfcd17f2f50702086b41648 Mon Sep 17 00:00:00 2001 From: Wolfgang Nagele Date: Thu, 4 Sep 2014 15:20:18 +1000 Subject: [PATCH 1/2] Fix for issue #383 --- SoftLayer/managers/hardware.py | 2 +- SoftLayer/managers/ordering.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SoftLayer/managers/hardware.py b/SoftLayer/managers/hardware.py index 7f6de620c..0caed70df 100644 --- a/SoftLayer/managers/hardware.py +++ b/SoftLayer/managers/hardware.py @@ -224,7 +224,7 @@ def get_available_dedicated_server_packages(self): for package in packages: available_packages.append((package['id'], package['name'], - package['description'])) + package.get('description', None))) return available_packages diff --git a/SoftLayer/managers/ordering.py b/SoftLayer/managers/ordering.py index 3942e7df3..d99d9dcbb 100644 --- a/SoftLayer/managers/ordering.py +++ b/SoftLayer/managers/ordering.py @@ -63,8 +63,8 @@ def filter_outlet_packages(packages): non_outlet_packages = [] for package in packages: - if all(['OUTLET' not in package['description'].upper(), - 'OUTLET' not in package['name'].upper()]): + if all(['OUTLET' not in package.get('description', '').upper(), + 'OUTLET' not in package.get('name', '').upper()]): non_outlet_packages.append(package) return non_outlet_packages From 81323523066caa66a0e6525d507ae8a75f5a32e3 Mon Sep 17 00:00:00 2001 From: Wolfgang Nagele Date: Fri, 5 Sep 2014 21:30:17 +1000 Subject: [PATCH 2/2] Support immediate cancellation of servers --- SoftLayer/CLI/modules/server.py | 5 ++++- SoftLayer/managers/hardware.py | 5 +++-- SoftLayer/tests/CLI/modules/server_tests.py | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SoftLayer/CLI/modules/server.py b/SoftLayer/CLI/modules/server.py index be390b386..e49891991 100644 --- a/SoftLayer/CLI/modules/server.py +++ b/SoftLayer/CLI/modules/server.py @@ -252,6 +252,8 @@ class CancelServer(environment.CLIRunnable): Cancel a dedicated server Options: + --immediate Cancels the server immediately (instead of on the billing + anniversary) --comment=COMMENT An optional comment to add to the cancellation ticket --reason=REASON An optional cancellation reason. See cancel-reasons for a list of available options @@ -271,9 +273,10 @@ def execute(self, args): comment = self.env.input("(Optional) Add a cancellation comment:") reason = args.get('--reason') + immediate = args.get('--immediate') if args['--really'] or formatting.no_going_back(hw_id): - mgr.cancel_hardware(hw_id, reason, comment) + mgr.cancel_hardware(hw_id, reason, comment, immediate) else: raise exceptions.CLIAbort('Aborted') diff --git a/SoftLayer/managers/hardware.py b/SoftLayer/managers/hardware.py index 0caed70df..2f8addd40 100644 --- a/SoftLayer/managers/hardware.py +++ b/SoftLayer/managers/hardware.py @@ -33,7 +33,8 @@ def __init__(self, client, ordering_manager=None): else: self.ordering_manager = ordering_manager - def cancel_hardware(self, hardware_id, reason='unneeded', comment=''): + def cancel_hardware(self, hardware_id, reason='unneeded', comment='', + immediate=False): """ Cancels the specified dedicated server. :param int hardware_id: The ID of the hardware to be cancelled. @@ -48,7 +49,7 @@ def cancel_hardware(self, hardware_id, reason='unneeded', comment=''): mask='id,bareMetalInstanceFlag') if server.get('bareMetalInstanceFlag'): - return self.cancel_metal(hardware_id) + return self.cancel_metal(hardware_id, immediate) reasons = self.get_cancellation_reasons() cancel_reason = reasons['unneeded'] diff --git a/SoftLayer/tests/CLI/modules/server_tests.py b/SoftLayer/tests/CLI/modules/server_tests.py index 32671126b..29b6f14a5 100644 --- a/SoftLayer/tests/CLI/modules/server_tests.py +++ b/SoftLayer/tests/CLI/modules/server_tests.py @@ -329,7 +329,7 @@ def test_cancel_server(self, resolve_mock, cancel_mock, ngb_mock): args = {'--really': True, '--reason': 'Test'} runnable.execute(args) - cancel_mock.assert_called_with(hw_id, args['--reason'], None) + cancel_mock.assert_called_with(hw_id, args['--reason'], None, None) # Now check to make sure we properly call CLIAbort in the negative case env_mock = mock.Mock()