summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Dunsmore <jasondunsmore@gmail.com>2016-03-23 15:12:46 -0500
committerSergey Kraynev <skraynev@mirantis.com>2016-08-08 08:31:15 +0000
commit5ec7f127929418e17fc7b37dc9da5b5a29835256 (patch)
tree3c77899df7a122881baafeb89b9b14d97ab6d2df
parentc3ac439ed232642134778f980bb82e5aeb783bb4 (diff)
downloadheat-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.py8
-rw-r--r--heat/tests/test_stack.py30
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({