From c995b0963cb485a1692164cda448d9956552a06d Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Tue, 4 Feb 2020 13:50:06 -0500 Subject: [PATCH] state machine triggers for resuming progress from a failed state --- atst/models/mixins/state_machines.py | 8 ++++++++ atst/models/portfolio_state_machine.py | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/atst/models/mixins/state_machines.py b/atst/models/mixins/state_machines.py index a7edf268..3ce5193f 100644 --- a/atst/models/mixins/state_machines.py +++ b/atst/models/mixins/state_machines.py @@ -94,6 +94,14 @@ def _build_transitions(csp_stages): dest=compose_state(csp_stage, StageStates.FAILED), ) ) + transitions.append( + dict( + trigger="resume_progress_" + csp_stage.name.lower(), + source=compose_state(csp_stage, StageStates.FAILED), + dest=compose_state(csp_stage, StageStates.IN_PROGRESS), + conditions=["is_ready_resume_progress"], + ) + ) return states, transitions diff --git a/atst/models/portfolio_state_machine.py b/atst/models/portfolio_state_machine.py index 14e9c01d..b0e72c8d 100644 --- a/atst/models/portfolio_state_machine.py +++ b/atst/models/portfolio_state_machine.py @@ -122,6 +122,22 @@ class PortfolioStateMachine( ) self.fail_stage(stage) + elif self.current_state == FSMStates.FAILED: + # get the first trigger that starts with 'create_' + resume_progress_trigger = next( + filter( + lambda trigger: trigger.startswith("resume_progress_"), + self.machine.get_triggers(FSMStates.FAILED.name), + ), + None, + ) + if resume_progress_trigger: + self.trigger(resume_progress_trigger, **kwargs) + else: + app.logger.info( + f"could not locate 'resume progress trigger' for {self.__repr__()}" + ) + elif state_obj.is_CREATED: # the create trigger for the next stage should be in the available # triggers for the current state @@ -196,6 +212,13 @@ class PortfolioStateMachine( return True + def is_ready_resume_progress(self, event): + """ + This function guards advancing states from *_FAILED to *_IN_PROGRESS. + """ + + return True + @property def application_id(self): return None