From a2430e8e9719e3d996848fa27ec9b1c71c690bbe Mon Sep 17 00:00:00 2001 From: huangtianhua Date: Thu, 29 Dec 2016 15:21:31 +0800 Subject: [PATCH] No need to check if resource not created Check fail directly if resource not created. Change-Id: I315fa5f2acc7780156df27ec40ea701672ef65d1 Closes-Bug: #1652902 --- heat/engine/resource.py | 7 ++++ heat/tests/aws/test_volume.py | 3 ++ heat/tests/openstack/aodh/test_alarm.py | 32 +++++++++++-------- .../openstack/aodh/test_gnocchi_alarm.py | 22 ++++++++----- heat/tests/openstack/heat/test_cloudwatch.py | 4 ++- heat/tests/openstack/nova/test_keypair.py | 2 ++ heat/tests/openstack/nova/test_server.py | 1 + heat/tests/openstack/trove/test_instance.py | 1 + heat/tests/test_resource.py | 19 +++++++---- heat/tests/test_stack.py | 16 ++++++++++ 10 files changed, 78 insertions(+), 29 deletions(-) diff --git a/heat/engine/resource.py b/heat/engine/resource.py index 84aefe60c1..7dbb42ff5a 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -1401,6 +1401,13 @@ class Resource(object): LOG.info(_LI('Checking %s'), self) if hasattr(self, 'handle_%s' % action.lower()): + if self.state == (self.INIT, self.COMPLETE): + reason = _('Can not check %s, resource not ' + 'created yet.') % self.name + self.state_set(action, self.FAILED, reason) + exc = Exception(_('Resource %s not created yet.') % self.name) + failure = exception.ResourceFailure(exc, self, action) + raise failure return self._do_action(action) else: reason = '%s not supported for %s' % (action, self.type()) diff --git a/heat/tests/aws/test_volume.py b/heat/tests/aws/test_volume.py index 4193f6806b..251286976e 100644 --- a/heat/tests/aws/test_volume.py +++ b/heat/tests/aws/test_volume.py @@ -517,6 +517,7 @@ class VolumeTest(vt_base.BaseVolumeTest): def test_volume_check(self): stack = utils.parse_stack(self.t, stack_name='volume_check') res = stack['DataVolume'] + res.state_set(res.CREATE, res.COMPLETE) fake_volume = vt_base.FakeVolume('available') cinder = mock.Mock() cinder.volumes.get.return_value = fake_volume @@ -533,6 +534,7 @@ class VolumeTest(vt_base.BaseVolumeTest): def test_volume_check_not_available(self): stack = utils.parse_stack(self.t, stack_name='volume_check_na') res = stack['DataVolume'] + res.state_set(res.CREATE, res.COMPLETE) cinder = mock.Mock() fake_volume = vt_base.FakeVolume('foobar') cinder.volumes.get.return_value = fake_volume @@ -546,6 +548,7 @@ class VolumeTest(vt_base.BaseVolumeTest): def test_volume_check_fail(self): stack = utils.parse_stack(self.t, stack_name='volume_check_fail') res = stack['DataVolume'] + res.state_set(res.CREATE, res.COMPLETE) cinder = mock.Mock() cinder.volumes.get.side_effect = Exception('boom') self.patchobject(res, 'client', return_value=cinder) diff --git a/heat/tests/openstack/aodh/test_alarm.py b/heat/tests/openstack/aodh/test_alarm.py index 006be05c1f..15ce1b6b43 100644 --- a/heat/tests/openstack/aodh/test_alarm.py +++ b/heat/tests/openstack/aodh/test_alarm.py @@ -472,10 +472,12 @@ class AodhAlarmTest(common.HeatTestCase): # check that super method has been called and execute deleting self.assertEqual(1, self.fa.alarm.delete.call_count) - def _prepare_check_resource(self): + def _prepare_resource(self, for_check=True): snippet = template_format.parse(not_string_alarm_template) self.stack = utils.parse_stack(snippet) res = self.stack['MEMAlarmHigh'] + if for_check: + res.state_set(res.CREATE, res.COMPLETE) res.client = mock.Mock() mock_alarm = mock.Mock(enabled=True, state='ok') res.client().alarm.get.return_value = mock_alarm @@ -483,13 +485,13 @@ class AodhAlarmTest(common.HeatTestCase): @mock.patch.object(alarm.watchrule.WatchRule, 'load') def test_check(self, mock_load): - res = self._prepare_check_resource() + res = self._prepare_resource() scheduler.TaskRunner(res.check)() self.assertEqual((res.CHECK, res.COMPLETE), res.state) @mock.patch.object(alarm.watchrule.WatchRule, 'load') def test_check_watchrule_failure(self, mock_load): - res = self._prepare_check_resource() + res = self._prepare_resource() exc = alarm.exception.EntityNotFound(entity='Watch Rule', name='Boom') mock_load.side_effect = exc @@ -500,7 +502,7 @@ class AodhAlarmTest(common.HeatTestCase): @mock.patch.object(alarm.watchrule.WatchRule, 'load') def test_check_alarm_failure(self, mock_load): - res = self._prepare_check_resource() + res = self._prepare_resource() res.client().alarm.get.side_effect = Exception('Boom') self.assertRaises(exception.ResourceFailure, @@ -509,7 +511,7 @@ class AodhAlarmTest(common.HeatTestCase): self.assertIn('Boom', res.status_reason) def test_show_resource(self): - res = self._prepare_check_resource() + res = self._prepare_resource(for_check=False) res.client().alarm.create.return_value = FakeAodhAlarm res.client().alarm.get.return_value = FakeAodhAlarm scheduler.TaskRunner(res.create)() @@ -804,22 +806,24 @@ class CombinationAlarmTest(common.HeatTestCase): self.m.VerifyAll() - def _prepare_check_resource(self): + def _prepare_resource(self, for_check=True): snippet = template_format.parse(combination_alarm_template) self.stack = utils.parse_stack(snippet) res = self.stack['CombinAlarm'] + if for_check: + res.state_set(res.CREATE, res.COMPLETE) res.client = mock.Mock() mock_alarm = mock.Mock(enabled=True, state='ok') res.client().alarms.get.return_value = mock_alarm return res def test_check(self): - res = self._prepare_check_resource() + res = self._prepare_resource() scheduler.TaskRunner(res.check)() self.assertEqual((res.CHECK, res.COMPLETE), res.state) def test_check_failure(self): - res = self._prepare_check_resource() + res = self._prepare_resource() res.client().alarms.get.side_effect = Exception('Boom') self.assertRaises(exception.ResourceFailure, @@ -828,7 +832,7 @@ class CombinationAlarmTest(common.HeatTestCase): self.assertIn('Boom', res.status_reason) def test_show_resource(self): - res = self._prepare_check_resource() + res = self._prepare_resource(for_check=False) res.client().alarms.create.return_value = mock.MagicMock( alarm_id='2') res.client().alarms.get.return_value = FakeCombinationAlarm() @@ -898,22 +902,24 @@ class EventAlarmTest(common.HeatTestCase): self.assertEqual('12345', rsrc.handle_delete()) self.assertEqual(1, self.fa.alarm.delete.call_count) - def _prepare_check_resource(self): + def _prepare_resource(self, for_check=True): snippet = template_format.parse(event_alarm_template) self.stack = utils.parse_stack(snippet) res = self.stack['test_event_alarm'] + if for_check: + res.state_set(res.CREATE, res.COMPLETE) res.client = mock.Mock() mock_alarm = mock.Mock(enabled=True, state='ok') res.client().alarm.get.return_value = mock_alarm return res def test_check(self): - res = self._prepare_check_resource() + res = self._prepare_resource() scheduler.TaskRunner(res.check)() self.assertEqual((res.CHECK, res.COMPLETE), res.state) def test_check_alarm_failure(self): - res = self._prepare_check_resource() + res = self._prepare_resource() res.client().alarm.get.side_effect = Exception('Boom') self.assertRaises(exception.ResourceFailure, @@ -922,7 +928,7 @@ class EventAlarmTest(common.HeatTestCase): self.assertIn('Boom', res.status_reason) def test_show_resource(self): - res = self._prepare_check_resource() + res = self._prepare_resource(for_check=False) res.client().alarm.create.return_value = FakeAodhAlarm res.client().alarm.get.return_value = FakeAodhAlarm scheduler.TaskRunner(res.create)() diff --git a/heat/tests/openstack/aodh/test_gnocchi_alarm.py b/heat/tests/openstack/aodh/test_gnocchi_alarm.py index 126d2f097f..02fc273f4c 100644 --- a/heat/tests/openstack/aodh/test_gnocchi_alarm.py +++ b/heat/tests/openstack/aodh/test_gnocchi_alarm.py @@ -160,10 +160,12 @@ class GnocchiResourcesAlarmTest(common.HeatTestCase): self.m.VerifyAll() - def _prepare_check_resource(self): + def _prepare_resource(self, for_check=True): snippet = template_format.parse(gnocchi_resources_alarm_template) self.stack = utils.parse_stack(snippet) res = self.stack['GnoResAlarm'] + if for_check: + res.state_set(res.CREATE, res.COMPLETE) res.client = mock.Mock() mock_alarm = mock.Mock(enabled=True, state='ok') res.client().alarm.get.return_value = mock_alarm @@ -206,12 +208,12 @@ class GnocchiResourcesAlarmTest(common.HeatTestCase): self.m.VerifyAll() def test_check(self): - res = self._prepare_check_resource() + res = self._prepare_resource() scheduler.TaskRunner(res.check)() self.assertEqual((res.CHECK, res.COMPLETE), res.state) def test_check_failure(self): - res = self._prepare_check_resource() + res = self._prepare_resource() res.client().alarm.get.side_effect = Exception('Boom') self.assertRaises(exception.ResourceFailure, @@ -220,7 +222,7 @@ class GnocchiResourcesAlarmTest(common.HeatTestCase): self.assertIn('Boom', res.status_reason) def test_show_resource(self): - res = self._prepare_check_resource() + res = self._prepare_resource(for_check=False) res.client().alarm.create.return_value = FakeAodhAlarm res.client().alarm.get.return_value = FakeAodhAlarm scheduler.TaskRunner(res.create)() @@ -350,18 +352,20 @@ class GnocchiAggregationByMetricsAlarmTest(GnocchiResourcesAlarmTest): self.m.VerifyAll() - def _prepare_check_resource(self): + def _prepare_resource(self, for_check=True): snippet = template_format.parse( gnocchi_aggregation_by_metrics_alarm_template) self.stack = utils.parse_stack(snippet) res = self.stack['GnoAggregationByMetricsAlarm'] + if for_check: + res.state_set(res.CREATE, res.COMPLETE) res.client = mock.Mock() mock_alarm = mock.Mock(enabled=True, state='ok') res.client().alarm.get.return_value = mock_alarm return res def test_show_resource(self): - res = self._prepare_check_resource() + res = self._prepare_resource(for_check=False) res.client().alarm.create.return_value = FakeAodhAlarm res.client().alarm.get.return_value = FakeAodhAlarm scheduler.TaskRunner(res.create)() @@ -492,18 +496,20 @@ class GnocchiAggregationByResourcesAlarmTest(GnocchiResourcesAlarmTest): self.m.VerifyAll() - def _prepare_check_resource(self): + def _prepare_resource(self, for_check=True): snippet = template_format.parse( gnocchi_aggregation_by_resources_alarm_template) self.stack = utils.parse_stack(snippet) res = self.stack['GnoAggregationByResourcesAlarm'] + if for_check: + res.state_set(res.CREATE, res.COMPLETE) res.client = mock.Mock() mock_alarm = mock.Mock(enabled=True, state='ok') res.client().alarm.get.return_value = mock_alarm return res def test_show_resource(self): - res = self._prepare_check_resource() + res = self._prepare_resource(for_check=False) res.client().alarm.create.return_value = FakeAodhAlarm res.client().alarm.get.return_value = FakeAodhAlarm scheduler.TaskRunner(res.create)() diff --git a/heat/tests/openstack/heat/test_cloudwatch.py b/heat/tests/openstack/heat/test_cloudwatch.py index 610bbabcaa..d93a43e47c 100644 --- a/heat/tests/openstack/heat/test_cloudwatch.py +++ b/heat/tests/openstack/heat/test_cloudwatch.py @@ -96,7 +96,9 @@ class CloudWatchAlarmTest(common.HeatTestCase): def _get_watch_rule(self): stack = self.parse_stack() - return stack['test_me'] + res = stack['test_me'] + res.state_set(res.CREATE, res.COMPLETE) + return res @mock.patch.object(cloud_watch.watchrule.WatchRule, 'load') def test_check(self, mock_lock): diff --git a/heat/tests/openstack/nova/test_keypair.py b/heat/tests/openstack/nova/test_keypair.py index 93f045f7f5..87a8339414 100644 --- a/heat/tests/openstack/nova/test_keypair.py +++ b/heat/tests/openstack/nova/test_keypair.py @@ -162,12 +162,14 @@ class NovaKeyPairTest(common.HeatTestCase): def test_check_key(self): res = self._get_test_resource(self.kp_template) + res.state_set(res.CREATE, res.COMPLETE, 'for test') res.client = mock.Mock() scheduler.TaskRunner(res.check)() self.assertEqual((res.CHECK, res.COMPLETE), res.state) def test_check_key_fail(self): res = self._get_test_resource(self.kp_template) + res.state_set(res.CREATE, res.COMPLETE, 'for test') res.client = mock.Mock() res.client().keypairs.get.side_effect = Exception("boom") exc = self.assertRaises(exception.ResourceFailure, diff --git a/heat/tests/openstack/nova/test_server.py b/heat/tests/openstack/nova/test_server.py index faea9b9df7..c7978bc4f1 100644 --- a/heat/tests/openstack/nova/test_server.py +++ b/heat/tests/openstack/nova/test_server.py @@ -267,6 +267,7 @@ class ServersTest(common.HeatTestCase): server = self.fc.servers.list()[1] server.status = status res = self.stack['WebServer'] + res.state_set(res.CREATE, res.COMPLETE) res.client = mock.Mock() res.client().servers.get.return_value = server return res diff --git a/heat/tests/openstack/trove/test_instance.py b/heat/tests/openstack/trove/test_instance.py index 9836a00c5f..1c6329d12b 100644 --- a/heat/tests/openstack/trove/test_instance.py +++ b/heat/tests/openstack/trove/test_instance.py @@ -274,6 +274,7 @@ class InstanceTest(common.HeatTestCase): def _get_db_instance(self): t = template_format.parse(db_template) res = self._setup_test_instance('trove_check', t) + res.state_set(res.CREATE, res.COMPLETE) res.flavor = 'Foo Flavor' res.volume = 'Foo Volume' res.datastore_type = 'Foo Type' diff --git a/heat/tests/test_resource.py b/heat/tests/test_resource.py index 3004e0a26b..9b7cab90bd 100644 --- a/heat/tests/test_resource.py +++ b/heat/tests/test_resource.py @@ -1320,10 +1320,18 @@ class ResourceTest(common.HeatTestCase): self.m.VerifyAll() - def test_check_supported(self): + def _mock_check_res(self, mock_check=True): tmpl = rsrc_defn.ResourceDefinition('test_res', 'GenericResourceType') res = generic_rsrc.ResourceWithProps('test_res', tmpl, self.stack) - res.handle_check = mock.Mock() + res.state_set(res.CREATE, res.COMPLETE) + if mock_check: + res.handle_check = mock.Mock() + + return res + + def test_check_supported(self): + res = self._mock_check_res() + scheduler.TaskRunner(res.check)() self.assertTrue(res.handle_check.called) @@ -1332,8 +1340,7 @@ class ResourceTest(common.HeatTestCase): self.assertNotIn('not supported', res.status_reason) def test_check_not_supported(self): - tmpl = rsrc_defn.ResourceDefinition('test_res', 'GenericResourceType') - res = generic_rsrc.ResourceWithProps('test_res', tmpl, self.stack) + res = self._mock_check_res(mock_check=False) scheduler.TaskRunner(res.check)() self.assertIn('not supported', res.status_reason) @@ -1341,9 +1348,7 @@ class ResourceTest(common.HeatTestCase): self.assertEqual(res.COMPLETE, res.status) def test_check_failed(self): - tmpl = rsrc_defn.ResourceDefinition('test_res', 'GenericResourceType') - res = generic_rsrc.ResourceWithProps('test_res', tmpl, self.stack) - res.handle_check = mock.Mock() + res = self._mock_check_res() res.handle_check.side_effect = Exception('boom') self.assertRaises(exception.ResourceFailure, diff --git a/heat/tests/test_stack.py b/heat/tests/test_stack.py index 37e31be684..59f2db9ede 100644 --- a/heat/tests/test_stack.py +++ b/heat/tests/test_stack.py @@ -922,6 +922,8 @@ class StackTest(common.HeatTestCase): def test_check_supported(self): stack1 = self._get_stack_to_check('check-supported') + stack1['A'].state_set(stack1['A'].CREATE, stack1['A'].COMPLETE) + stack1['B'].state_set(stack1['B'].CREATE, stack1['B'].COMPLETE) stack1.check() self.assertEqual(stack1.COMPLETE, stack1.status) @@ -933,6 +935,7 @@ class StackTest(common.HeatTestCase): def test_check_not_supported(self): stack1 = self._get_stack_to_check('check-not-supported') del stack1['B'].handle_check + stack1['A'].state_set(stack1['A'].CREATE, stack1['A'].COMPLETE) stack1.check() self.assertEqual(stack1.COMPLETE, stack1.status) @@ -942,8 +945,21 @@ class StackTest(common.HeatTestCase): def test_check_fail(self): stk = self._get_stack_to_check('check-fail') + # if resource not created, check fail + stk.check() + self.assertEqual(stk.FAILED, stk.status) + self.assertEqual(stk.CHECK, stk.action) + self.assertFalse(stk['A'].handle_check.called) + self.assertFalse(stk['B'].handle_check.called) + self.assertIn('Resource A not created yet', + stk.status_reason) + self.assertIn('Resource B not created yet', + stk.status_reason) + # check if resource created stk['A'].handle_check.side_effect = Exception('fail-A') stk['B'].handle_check.side_effect = Exception('fail-B') + stk['A'].state_set(stk['A'].CREATE, stk['A'].COMPLETE) + stk['B'].state_set(stk['B'].CREATE, stk['B'].COMPLETE) stk.check() self.assertEqual(stk.FAILED, stk.status)