def execute(self, args): cci = CCIManager(self.client) cci_id = resolve_id(cci.resolve_ids, args.get('<identifier>'), 'CCI') ready = cci.wait_for_ready(cci_id, int(args.get('--wait') or 0)) if ready: return "READY" else: raise CLIAbort("Instance %s not ready" % cci_id)
class CCIWaitReadyGoTests(unittest.TestCase): def setUp(self): self.client = MagicMock() self.cci = CCIManager(self.client) self.guestObject = self.client['Virtual_Guest'].getObject @patch('SoftLayer.managers.cci.CCIManager.wait_for_ready') def test_wait_interface(self, ready): # verify interface to wait_for_ready is intact self.cci.wait_for_transaction(1, 1) ready.assert_called_once_with(1, 1, delay=1, pending=True) def test_active_not_provisioned(self): # active transaction and no provision date should be false self.guestObject.side_effect = [ {'activeTransaction': {'id': 1}}, ] value = self.cci.wait_for_ready(1, 1) self.assertFalse(value) def test_active_and_provisiondate(self): # active transaction and provision date should be True self.guestObject.side_effect = [ {'activeTransaction': {'id': 1}, 'provisionDate': 'aaa'}, ] value = self.cci.wait_for_ready(1, 1) self.assertTrue(value) def test_active_provision_pending(self): # active transaction and provision date # and pending should be false self.guestObject.side_effect = [ {'activeTransaction': {'id': 1}, 'provisionDate': 'aaa'}, ] value = self.cci.wait_for_ready(1, 1, pending=True) self.assertFalse(value) def test_active_reload(self): # actively running reload self.guestObject.side_effect = [ { 'activeTransaction': {'id': 1}, 'provisionDate': 'aaa', 'lastOperatingSystemReload': {'id': 1}, }, ] value = self.cci.wait_for_ready(1, 1) self.assertFalse(value) def test_reload_no_pending(self): # reload complete, maintance transactions self.guestObject.side_effect = [ { 'activeTransaction': {'id': 2}, 'provisionDate': 'aaa', 'lastOperatingSystemReload': {'id': 1}, }, ] value = self.cci.wait_for_ready(1, 1) self.assertTrue(value) def test_reload_pending(self): # reload complete, pending maintance transactions self.guestObject.side_effect = [ { 'activeTransaction': {'id': 2}, 'provisionDate': 'aaa', 'lastOperatingSystemReload': {'id': 1}, }, ] value = self.cci.wait_for_ready(1, 1, pending=True) self.assertFalse(value) @patch('SoftLayer.managers.cci.sleep') def test_ready_iter_once_incomplete(self, _sleep): self.guestObject = self.client['Virtual_Guest'].getObject # no iteration, false self.guestObject.side_effect = [ {'activeTransaction': {'id': 1}}, ] value = self.cci.wait_for_ready(1, 1) self.assertFalse(value) self.assertFalse(_sleep.called) @patch('SoftLayer.managers.cci.sleep') def test_iter_once_complete(self, _sleep): # no iteration, true self.guestObject.side_effect = [ {'provisionDate': 'aaa'}, ] value = self.cci.wait_for_ready(1, 1) self.assertTrue(value) self.assertFalse(_sleep.called) @patch('SoftLayer.managers.cci.sleep') def test_iter_four_complete(self, _sleep): # test 4 iterations with positive match self.guestObject.side_effect = [ {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'provisionDate': 'aaa'}, ] value = self.cci.wait_for_ready(1, 4) self.assertTrue(value) _sleep.assert_has_calls([call(1), call(1), call(1)]) self.guestObject.assert_has_calls([ call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), ]) @patch('SoftLayer.managers.cci.sleep') def test_iter_two_incomplete(self, _sleep): # test 2 iterations, with no matches self.guestObject.side_effect = [ {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'provisionDate': 'aaa'} ] value = self.cci.wait_for_ready(1, 2) self.assertFalse(value) _sleep.assert_called_once_with(1) self.guestObject.assert_has_calls([ call(id=1, mask=ANY), call(id=1, mask=ANY), ]) @patch('SoftLayer.managers.cci.sleep') def test_iter_ten_incomplete(self, _sleep): # 10 iterations at 10 second sleeps with no # matching values. self.guestObject.side_effect = [ {}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, {'activeTransaction': {'id': 1}}, ] value = self.cci.wait_for_ready(1, 10, delay=10) self.assertFalse(value) self.guestObject.assert_has_calls([ call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), call(id=1, mask=ANY), ]) # should only be 9 calls to sleep, last iteration # should return a value and skip the sleep _sleep.assert_has_calls([ call(10), call(10), call(10), call(10), call(10), call(10), call(10), call(10), call(10)])
def execute(self, args): update_with_template_args(args) cci = CCIManager(self.client) self._update_with_like_args(args) # Disks will be a comma-separated list. Let's make it a real list. if isinstance(args.get('--disk'), str): args['--disk'] = args.get('--disk').split(',') # SSH keys may be a comma-separated list. Let's make it a real list. if isinstance(args.get('--key'), str): args['--key'] = args.get('--key').split(',') self._validate_args(args) # Do not create CCI with --test or --export do_create = not (args['--export'] or args['--test']) table = Table(['Item', 'cost']) table.align['Item'] = 'r' table.align['cost'] = 'r' data = self._parse_create_args(args) output = [] if args.get('--test'): result = cci.verify_create_instance(**data) total_monthly = 0.0 total_hourly = 0.0 table = Table(['Item', 'cost']) table.align['Item'] = 'r' table.align['cost'] = 'r' for price in result['prices']: total_monthly += float(price.get('recurringFee', 0.0)) total_hourly += float(price.get('hourlyRecurringFee', 0.0)) if args.get('--hourly'): rate = "%.2f" % float(price['hourlyRecurringFee']) else: rate = "%.2f" % float(price['recurringFee']) table.add_row([price['item']['description'], rate]) if args.get('--hourly'): total = total_hourly else: total = total_monthly billing_rate = 'monthly' if args.get('--hourly'): billing_rate = 'hourly' table.add_row(['Total %s cost' % billing_rate, "%.2f" % total]) output.append(table) output.append(FormattedItem( None, ' -- ! Prices reflected here are retail and do not ' 'take account level discounts and are not guaranteed.') ) if args['--export']: export_file = args.pop('--export') export_to_template(export_file, args, exclude=['--wait', '--test']) return 'Successfully exported options to a template file.' if do_create: if args['--really'] or confirm( "This action will incur charges on your account. " "Continue?"): result = cci.create_instance(**data) table = KeyValueTable(['name', 'value']) table.align['name'] = 'r' table.align['value'] = 'l' table.add_row(['id', result['id']]) table.add_row(['created', result['createDate']]) table.add_row(['guid', result['globalIdentifier']]) output.append(table) if args.get('--wait'): ready = cci.wait_for_ready( result['id'], int(args.get('--wait') or 1)) table.add_row(['ready', ready]) else: raise CLIAbort('Aborting CCI order.') return output