diff --git a/taskflow/engines/action_engine/engine.py b/taskflow/engines/action_engine/engine.py index d0bcf538..63d6bfd4 100644 --- a/taskflow/engines/action_engine/engine.py +++ b/taskflow/engines/action_engine/engine.py @@ -26,6 +26,7 @@ from taskflow.engines import base from taskflow import decorators from taskflow import exceptions as exc +from taskflow.openstack.common import excutils from taskflow import states from taskflow import storage as t_storage @@ -50,15 +51,20 @@ class ActionEngine(base.EngineBase): self.notifier = misc.TransitionNotifier() self.task_notifier = misc.TransitionNotifier() - def _revert(self, current_failure): + def _revert(self, current_failure=None): self._change_state(states.REVERTING) - state = self._root.revert(self) + try: + state = self._root.revert(self) + except Exception: + with excutils.save_and_reraise_exception(): + self._change_state(states.FAILURE) + self._change_state(state) if state == states.SUSPENDED: return - self._change_state(states.FAILURE) misc.Failure.reraise_if_any(self._failures) - current_failure.reraise() + if current_failure: + current_failure.reraise() def _reset(self): self._failures = [] @@ -82,7 +88,7 @@ class ActionEngine(base.EngineBase): raise exc.MissingDependencies(self._flow, sorted(missing)) self._run() elif self._failures: - self._revert(self._failures[-1]) + self._revert() else: self._run() @@ -91,6 +97,7 @@ class ActionEngine(base.EngineBase): try: state = self._root.execute(self) except Exception: + self._change_state(states.FAILURE) self._revert(misc.Failure()) else: self._change_state(state) diff --git a/taskflow/tests/unit/test_action_engine.py b/taskflow/tests/unit/test_action_engine.py index 25646ae5..ef0dc5b1 100644 --- a/taskflow/tests/unit/test_action_engine.py +++ b/taskflow/tests/unit/test_action_engine.py @@ -199,13 +199,13 @@ class EngineTaskTest(EngineTestBase): ['flow RUNNING', 'fail RUNNING', 'fail FAILURE', + 'flow FAILURE', 'flow REVERTING', 'fail REVERTING', 'fail reverted(Failure: exceptions.RuntimeError: Woot!)', 'fail REVERTED', 'fail PENDING', - 'flow REVERTED', - 'flow FAILURE']) + 'flow REVERTED']) def test_invalid_flow_raises(self): value = 'i am string, not task/flow, sorry' @@ -638,7 +638,7 @@ class SuspendFlowTest(EngineTestBase): 'b reverted(5)']) with self.assertRaisesRegexp(RuntimeError, '^Woot'): engine.run() - self.assertEquals(engine.storage.get_flow_state(), states.FAILURE) + self.assertEquals(engine.storage.get_flow_state(), states.REVERTED) self.assertEquals( self.values, ['a', diff --git a/taskflow/tests/unit/test_linear_flow.py b/taskflow/tests/unit/test_linear_flow.py index 74e29d39..159b2556 100644 --- a/taskflow/tests/unit/test_linear_flow.py +++ b/taskflow/tests/unit/test_linear_flow.py @@ -89,9 +89,9 @@ class LinearFlowTest(test.TestCase): expected_states = [ states.RUNNING, + states.FAILURE, states.REVERTING, states.REVERTED, - states.FAILURE, ] self.assertEquals(expected_states, changes) expected_states = [