From 63f8e3e5f6ae440a7ca9cf7079c85de6bcd5b5d8 Mon Sep 17 00:00:00 2001 From: "Ivan A. Melnikov" Date: Mon, 7 Oct 2013 16:40:57 +0400 Subject: [PATCH] Update state sequence for failed flows When flow failes, it now transitions to FAILURE state, and then goes throgh REVERTING to REVERTED. So, flows that failed and were reverted are now left in REVERTED state. Change-Id: Ieb9135673847eb4942afa61696975d013b809819 --- taskflow/engines/action_engine/engine.py | 17 ++++++++++++----- taskflow/tests/unit/test_action_engine.py | 6 +++--- taskflow/tests/unit/test_linear_flow.py | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) 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 = [