From bbb18e76f374e07d1ea8b273820d89efbc1a1e61 Mon Sep 17 00:00:00 2001 From: Angus Salkeld Date: Fri, 10 Apr 2015 15:44:07 +1000 Subject: [PATCH] Use helper functions stack_suspend and stack_resume These wait for the stack state to get to complete, this wasn't done consistently. In test_autoscaling we were only waiting for the resource state to get to SUSPEND_COMPLETE and this lead to a time sensitive bug. Change-Id: Id985d833dc0b4cab1e3cb9d8f67d5d8cc94b5863 Closes-bug: #1438717 --- heat_integrationtests/common/test.py | 17 +++++++++++++++++ .../functional/test_autoscaling.py | 18 ++++-------------- .../functional/test_aws_stack.py | 10 ++-------- .../functional/test_remote_stack.py | 16 ++-------------- 4 files changed, 25 insertions(+), 36 deletions(-) diff --git a/heat_integrationtests/common/test.py b/heat_integrationtests/common/test.py index 331c922ce..2868d0faf 100644 --- a/heat_integrationtests/common/test.py +++ b/heat_integrationtests/common/test.py @@ -191,6 +191,15 @@ class HeatIntegrationTest(testscenarios.WithScenarios, return call_until_true( self.conf.build_timeout, 1, ping) + def _wait_for_all_resource_status(self, stack_identifier, + status, failure_pattern='^.*_FAILED$', + success_on_not_found=False): + for res in self.client.resources.list(stack_identifier): + self._wait_for_resource_status( + stack_identifier, res.resource_name, + status, failure_pattern=failure_pattern, + success_on_not_found=success_on_not_found) + def _wait_for_resource_status(self, stack_identifier, resource_name, status, failure_pattern='^.*_FAILED$', success_on_not_found=False): @@ -406,11 +415,19 @@ class HeatIntegrationTest(testscenarios.WithScenarios, def stack_suspend(self, stack_identifier): stack_name = stack_identifier.split('/')[0] self.client.actions.suspend(stack_name) + + # improve debugging by first checking the resource's state. + self._wait_for_all_resource_status(stack_identifier, + 'SUSPEND_COMPLETE') self._wait_for_stack_status(stack_identifier, 'SUSPEND_COMPLETE') def stack_resume(self, stack_identifier): stack_name = stack_identifier.split('/')[0] self.client.actions.resume(stack_name) + + # improve debugging by first checking the resource's state. + self._wait_for_all_resource_status(stack_identifier, + 'RESUME_COMPLETE') self._wait_for_stack_status(stack_identifier, 'RESUME_COMPLETE') def wait_for_event_with_reason(self, stack_identifier, reason, diff --git a/heat_integrationtests/functional/test_autoscaling.py b/heat_integrationtests/functional/test_autoscaling.py index 932245dd6..489ae63ea 100644 --- a/heat_integrationtests/functional/test_autoscaling.py +++ b/heat_integrationtests/functional/test_autoscaling.py @@ -318,21 +318,11 @@ class AutoscalingGroupBasicTest(AutoscalingGroupTest): nested_ident = self.assert_resource_is_a_stack(stack_identifier, 'JobServerGroup') - self.client.actions.suspend(stack_id=stack_identifier) - self._wait_for_resource_status( - stack_identifier, 'JobServerGroup', 'SUSPEND_COMPLETE') - for res in self.client.resources.list(nested_ident): - self._wait_for_resource_status(nested_ident, - res.resource_name, - 'SUSPEND_COMPLETE') + self.stack_suspend(stack_identifier) + self._wait_for_all_resource_status(nested_ident, 'SUSPEND_COMPLETE') - self.client.actions.resume(stack_id=stack_identifier) - self._wait_for_resource_status( - stack_identifier, 'JobServerGroup', 'RESUME_COMPLETE') - for res in self.client.resources.list(nested_ident): - self._wait_for_resource_status(nested_ident, - res.resource_name, - 'RESUME_COMPLETE') + self.stack_resume(stack_identifier) + self._wait_for_all_resource_status(nested_ident, 'RESUME_COMPLETE') class AutoscalingGroupUpdatePolicyTest(AutoscalingGroupTest): diff --git a/heat_integrationtests/functional/test_aws_stack.py b/heat_integrationtests/functional/test_aws_stack.py index 5aabe9581..d8ba937e3 100644 --- a/heat_integrationtests/functional/test_aws_stack.py +++ b/heat_integrationtests/functional/test_aws_stack.py @@ -203,11 +203,5 @@ Outputs: url = self.publish_template(self.nested_name, self.nested_template) self.template = self.test_template.replace('the.yaml', url) stack_identifier = self.stack_create(template=self.template) - - self.client.actions.suspend(stack_id=stack_identifier) - self._wait_for_resource_status( - stack_identifier, 'the_nested', 'SUSPEND_COMPLETE') - - self.client.actions.resume(stack_id=stack_identifier) - self._wait_for_resource_status( - stack_identifier, 'the_nested', 'RESUME_COMPLETE') + self.stack_suspend(stack_identifier) + self.stack_resume(stack_identifier) diff --git a/heat_integrationtests/functional/test_remote_stack.py b/heat_integrationtests/functional/test_remote_stack.py index 7579eb048..868f24e93 100644 --- a/heat_integrationtests/functional/test_remote_stack.py +++ b/heat_integrationtests/functional/test_remote_stack.py @@ -140,17 +140,5 @@ outputs: def test_stack_suspend_resume(self): files = {'remote_stack.yaml': self.remote_template} stack_id = self.stack_create(files=files) - rsrc = self.client.resources.get(stack_id, 'my_stack') - remote_id = rsrc.physical_resource_id - - # suspend stack - self.client.actions.suspend(stack_id) - self._wait_for_stack_status(stack_id, 'SUSPEND_COMPLETE') - rsrc = self.client.stacks.get(remote_id) - self.assertEqual('SUSPEND_COMPLETE', rsrc.stack_status) - - # resume stack - self.client.actions.resume(stack_id) - self._wait_for_stack_status(stack_id, 'RESUME_COMPLETE') - rsrc = self.client.stacks.get(remote_id) - self.assertEqual('RESUME_COMPLETE', rsrc.stack_status) + self.stack_suspend(stack_id) + self.stack_resume(stack_id)