From 40cf88e55ceffedfa96865696ba439312a6c66a4 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Wed, 24 Jun 2015 20:47:40 -0700 Subject: [PATCH] Expose strategies so doc generation can easily pick them up Since we have put a warning on the engine components docs saying they should not be used externally it seems ok to make these more visible so that people reading the docs can follow more of how it works (and the components involved there-in). Depends-On: I0f07858e96ea3baf46f8a453e253b9ed29c7f7e2 Depends-On: I33bd2d9dff9cb7dc1a50177db7286b7317966784 Change-Id: I24d5cbfd47aa786ffab923243b97c7ae43b2f21f --- taskflow/engines/action_engine/completer.py | 36 +++++++++++++-------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/taskflow/engines/action_engine/completer.py b/taskflow/engines/action_engine/completer.py index 7e04862c..318e3bc0 100644 --- a/taskflow/engines/action_engine/completer.py +++ b/taskflow/engines/action_engine/completer.py @@ -31,24 +31,34 @@ LOG = logging.getLogger(__name__) @six.add_metaclass(abc.ABCMeta) -class _Strategy(object): - """Local/internal helper strategy base object""" +class Strategy(object): + """Failure resolution strategy base class.""" + + strategy = None def __init__(self, runtime): self._runtime = runtime + @abc.abstractmethod + def apply(self): + """Applies some algorithm to resolve some detected failure.""" + def __str__(self): base = reflection.get_class_name(self, fully_qualified=False) - return base + "(strategy=%s)" % (self.strategy.name) + if self.strategy is not None: + strategy_name = self.strategy.name + else: + strategy_name = "???" + return base + "(strategy=%s)" % (strategy_name) -class _RevertAndRetry(_Strategy): +class RevertAndRetry(Strategy): """Sets the *associated* subflow for revert to be later retried.""" strategy = retry_atom.RETRY def __init__(self, runtime, retry): - super(_RevertAndRetry, self).__init__(runtime) + super(RevertAndRetry, self).__init__(runtime) self._retry = retry def apply(self): @@ -59,13 +69,13 @@ class _RevertAndRetry(_Strategy): return tweaked -class _RevertAll(_Strategy): +class RevertAll(Strategy): """Sets *all* nodes/atoms to the ``REVERT`` intention.""" strategy = retry_atom.REVERT_ALL def __init__(self, runtime): - super(_RevertAll, self).__init__(runtime) + super(RevertAll, self).__init__(runtime) self._analyzer = runtime.analyzer def apply(self): @@ -73,13 +83,13 @@ class _RevertAll(_Strategy): state=None, intention=st.REVERT) -class _Revert(_Strategy): +class Revert(Strategy): """Sets atom and *associated* nodes to the ``REVERT`` intention.""" strategy = retry_atom.REVERT def __init__(self, runtime, atom): - super(_Revert, self).__init__(runtime) + super(Revert, self).__init__(runtime) self._atom = atom def apply(self): @@ -99,7 +109,7 @@ class Completer(object): self._retry_action = runtime.retry_action self._storage = runtime.storage self._task_action = runtime.task_action - self._undefined_resolver = _RevertAll(self._runtime) + self._undefined_resolver = RevertAll(self._runtime) def _complete_task(self, task, event, result): """Completes the given task, processes task failure.""" @@ -152,7 +162,7 @@ class Completer(object): # Ask retry controller what to do in case of failure. strategy = self._retry_action.on_failure(retry, atom, failure) if strategy == retry_atom.RETRY: - return _RevertAndRetry(self._runtime, retry) + return RevertAndRetry(self._runtime, retry) elif strategy == retry_atom.REVERT: # Ask parent retry and figure out what to do... parent_resolver = self._determine_resolution(retry, failure) @@ -162,9 +172,9 @@ class Completer(object): if parent_resolver is not self._undefined_resolver: if parent_resolver.strategy != retry_atom.REVERT: return parent_resolver - return _Revert(self._runtime, retry) + return Revert(self._runtime, retry) elif strategy == retry_atom.REVERT_ALL: - return _RevertAll(self._runtime) + return RevertAll(self._runtime) else: raise ValueError("Unknown atom failure resolution" " action/strategy '%s'" % strategy)