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
This commit is contained in:
Ivan A. Melnikov
2013-10-07 16:40:57 +04:00
parent 6ccac5f334
commit 63f8e3e5f6
3 changed files with 16 additions and 9 deletions

View File

@@ -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)

View File

@@ -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',

View File

@@ -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 = [