summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhuangtianhua <huangtianhua@huawei.com>2015-12-02 16:02:41 +0800
committerhuangtianhua <huangtianhua@huawei.com>2015-12-04 16:58:21 +0800
commit5f8c16887455b6228ca8eec4a600c06c696fb334 (patch)
tree1d819b8a4ad1db84ce76da772be7ce431edc53c7
parentf1081b678ea8f93630a3f628197814a80b01dfc6 (diff)
downloadheat-5f8c16887455b6228ca8eec4a600c06c696fb334.tar.gz
Correct reset_state_on_error() handling
The change Ic948c2fe5baf23c9c4ced33060f672ca9c278a19 aim to prevent the stacks hanging in IN_PROGRESS, but the code is incorrect, this patch fix them. Closes-Bug: #1521881 Related-Bug: #1492433 (cherry picked from commit 63141b20bcb5fe0b7941a6d8578936e42c485242) Conflicts: heat/tests/test_stack.py Change-Id: I0e9655b5a931452d810c38b7ddf6a2ce742bb7ed
-rwxr-xr-xheat/engine/stack.py9
-rw-r--r--heat/tests/test_stack.py23
2 files changed, 16 insertions, 16 deletions
diff --git a/heat/engine/stack.py b/heat/engine/stack.py
index 81e6865d2..225dbbdee 100755
--- a/heat/engine/stack.py
+++ b/heat/engine/stack.py
@@ -75,9 +75,11 @@ def reset_state_on_error(func):
LOG.error(_LE('Unexpected exception in %(func)s: %(msg)s'),
{'func': func.__name__, 'msg': errmsg})
finally:
- if stack.state == stack.IN_PROGRESS:
- stack.set_state(stack.action, stack.FAILED, errmsg)
- assert errmsg is not None, "Returned while IN_PROGRESS"
+ if stack.status == stack.IN_PROGRESS:
+ msg = _("Unexpected returning while IN_PROGRESS.")
+ stack.state_set(stack.action, stack.FAILED,
+ errmsg if errmsg is not None else msg)
+ assert errmsg is not None, "Returned while IN_PROGRESS."
return handle_exceptions
@@ -1273,7 +1275,6 @@ class Stack(collections.Mapping):
sus_task(timeout=self.timeout_secs())
@profiler.trace('Stack.delete_snapshot', hide_args=False)
- @reset_state_on_error
def delete_snapshot(self, snapshot):
'''Remove a snapshot from the backends.'''
for name, rsrc in six.iteritems(self.resources):
diff --git a/heat/tests/test_stack.py b/heat/tests/test_stack.py
index 1b2c0ff2c..ec9534a95 100644
--- a/heat/tests/test_stack.py
+++ b/heat/tests/test_stack.py
@@ -1871,16 +1871,19 @@ class ResetStateOnErrorTest(common.HeatTestCase):
(COMPLETE, IN_PROGRESS, FAILED) = range(3)
action = 'something'
- state = COMPLETE
+ status = COMPLETE
+
+ def __init__(self):
+ self.state_set = mock.MagicMock()
@stack.reset_state_on_error
def raise_exception(self):
- self.state = self.IN_PROGRESS
+ self.status = self.IN_PROGRESS
raise ValueError('oops')
@stack.reset_state_on_error
def raise_exit_exception(self):
- self.state = self.IN_PROGRESS
+ self.status = self.IN_PROGRESS
raise BaseException('bye')
@stack.reset_state_on_error
@@ -1889,35 +1892,31 @@ class ResetStateOnErrorTest(common.HeatTestCase):
@stack.reset_state_on_error
def fail(self):
- self.state = self.FAILED
+ self.status = self.FAILED
return 'Hello world'
def test_success(self):
dummy = self.DummyStack()
- dummy.set_state = mock.MagicMock()
self.assertEqual('Hello world', dummy.succeed())
- self.assertFalse(dummy.set_state.called)
+ self.assertFalse(dummy.state_set.called)
def test_failure(self):
dummy = self.DummyStack()
- dummy.set_state = mock.MagicMock()
self.assertEqual('Hello world', dummy.fail())
- self.assertFalse(dummy.set_state.called)
+ self.assertFalse(dummy.state_set.called)
def test_reset_state_exception(self):
dummy = self.DummyStack()
- dummy.set_state = mock.MagicMock()
exc = self.assertRaises(ValueError, dummy.raise_exception)
self.assertIn('oops', str(exc))
- self.assertTrue(dummy.set_state.called)
+ self.assertTrue(dummy.state_set.called)
def test_reset_state_exit_exception(self):
dummy = self.DummyStack()
- dummy.set_state = mock.MagicMock()
exc = self.assertRaises(BaseException, dummy.raise_exit_exception)
self.assertIn('bye', str(exc))
- self.assertTrue(dummy.set_state.called)
+ self.assertTrue(dummy.state_set.called)