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:
@@ -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)
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
Reference in New Issue
Block a user