diff options
author | Jason Dunsmore <jasondunsmore@gmail.com> | 2016-03-23 15:12:46 -0500 |
---|---|---|
committer | Sergey Kraynev <skraynev@mirantis.com> | 2016-08-08 08:31:15 +0000 |
commit | 5ec7f127929418e17fc7b37dc9da5b5a29835256 (patch) | |
tree | 3c77899df7a122881baafeb89b9b14d97ab6d2df | |
parent | c3ac439ed232642134778f980bb82e5aeb783bb4 (diff) | |
download | heat-5ec7f127929418e17fc7b37dc9da5b5a29835256.tar.gz |
Don't create an "update task" inside a try block
The code inside the "except" block depends on the update_task variable
that may not have been successfully assigned in the "try" block. Move
that code out of the "try" block so the exception can bubble up
instead of being obscured by a "local variable 'update_task'
referenced before assignment" error.
Change-Id: I88d6f13ee4365b1327ffc06c961600262396e066
Closes-Bug: #1561066
(cherry picked from commit 4446b861f4b8f81ef4b41310b81b5a06a33b946a)
-rw-r--r-- | heat/engine/stack.py | 8 | ||||
-rw-r--r-- | heat/tests/test_stack.py | 30 |
2 files changed, 34 insertions, 4 deletions
diff --git a/heat/engine/stack.py b/heat/engine/stack.py index 753ad847a..16a4e96dc 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -1372,11 +1372,11 @@ class Stack(collections.Mapping): self.t.env.params}) previous_template_id = None should_rollback = False + update_task = update.StackUpdate( + self, newstack, backup_stack, + rollback=action == self.ROLLBACK, + error_wait_time=cfg.CONF.error_wait_time) try: - update_task = update.StackUpdate( - self, newstack, backup_stack, - rollback=action == self.ROLLBACK, - error_wait_time=cfg.CONF.error_wait_time) updater = scheduler.TaskRunner(update_task) self.parameters = newstack.parameters diff --git a/heat/tests/test_stack.py b/heat/tests/test_stack.py index 56e4d7012..7ef8295e5 100644 --- a/heat/tests/test_stack.py +++ b/heat/tests/test_stack.py @@ -37,6 +37,7 @@ from heat.engine import scheduler from heat.engine import service from heat.engine import stack from heat.engine import template +from heat.engine import update from heat.objects import raw_template as raw_template_object from heat.objects import resource as resource_objects from heat.objects import stack as stack_object @@ -2529,6 +2530,35 @@ class StackTest(common.HeatTestCase): None) self.assertEqual(expected_message, six.text_type(expected_exception)) + @mock.patch.object(update, 'StackUpdate') + def test_update_task_exception(self, mock_stack_update): + class RandomException(Exception): + pass + + tmpl1 = template.Template({ + 'HeatTemplateFormatVersion': '2012-12-12', + 'Resources': { + 'foo': {'Type': 'GenericResourceType'} + } + }) + self.stack = stack.Stack(utils.dummy_context(), 'test_stack', tmpl1) + self.stack.store() + self.stack.create() + self.assertEqual((stack.Stack.CREATE, stack.Stack.COMPLETE), + self.stack.state) + + tmpl2 = template.Template({ + 'HeatTemplateFormatVersion': '2012-12-12', + 'Resources': { + 'foo': {'Type': 'GenericResourceType'}, + 'bar': {'Type': 'GenericResourceType'} + } + }) + updated_stack = stack.Stack(utils.dummy_context(), 'test_stack', tmpl2) + + mock_stack_update.side_effect = RandomException() + self.assertRaises(RandomException, self.stack.update, updated_stack) + def update_exception_handler(self, exc, action=stack.Stack.UPDATE, disable_rollback=False): tmpl = template.Template({ |