def defer_task(wf_cmd): """Defers a task""" ctx = wf_cmd.ctx wf_ex = wf_cmd.wf_ex task_spec = wf_cmd.task_spec if not wf_utils.find_task_executions_by_spec(wf_ex, task_spec): _create_task_execution(wf_ex, task_spec, ctx, state=states.WAITING)
def _find_task_execution_by_spec(self, task_spec): in_t_execs = wf_utils.find_task_executions_by_spec( self.wf_ex, task_spec ) # TODO(rakhmerov): Temporary hack. See the previous comment. return in_t_execs[-1] if in_t_execs else None
def evaluate_workflow_final_context(self): task_execs = wf_utils.find_task_executions_by_spec(self.wf_ex, self._get_target_task_specification()) # NOTE: For reverse workflow there can't be multiple # executions for one task. assert len(task_execs) <= 1 return data_flow.evaluate_task_outbound_context(task_execs[0])
def evaluate_workflow_final_context(self): task_execs = wf_utils.find_task_executions_by_spec( self.wf_ex, self._get_target_task_specification()) # NOTE: For reverse workflow there can't be multiple # executions for one task. assert len(task_execs) <= 1 return data_flow.evaluate_task_outbound_context(task_execs[0])
def _triggers_join(self, join_task_spec, inbound_task_spec): in_t_execs = wf_utils.find_task_executions_by_spec( self.wf_ex, inbound_task_spec) # TODO(rakhmerov): Temporary hack. See the previous comment. in_t_ex = in_t_execs[-1] if in_t_execs else None if not in_t_ex or not states.is_completed(in_t_ex.state): return False return list( filter(lambda t_name: join_task_spec.get_name() == t_name, self._find_next_task_names(in_t_ex)))
def _is_satisfied_task(self, task_spec): if wf_utils.find_task_executions_by_spec(self.wf_ex, task_spec): return False if not self.wf_spec.get_task_requires(task_spec): return True success_t_names = set() for t_ex in self.wf_ex.task_executions: if t_ex.state == states.SUCCESS: success_t_names.add(t_ex.name) return not (set(self.wf_spec.get_task_requires(task_spec)) - success_t_names)
def _triggers_join(self, join_task_spec, inbound_task_spec): in_t_execs = wf_utils.find_task_executions_by_spec( self.wf_ex, inbound_task_spec ) # TODO(rakhmerov): Temporary hack. See the previous comment. in_t_ex = in_t_execs[-1] if in_t_execs else None if not in_t_ex or not states.is_completed(in_t_ex.state): return False return list( filter( lambda t_name: join_task_spec.get_name() == t_name, self._find_next_task_names(in_t_ex) ) )
def defer(self): """Defers task. This methods finds task execution or creates new and puts task to a waiting state. """ if not self.task_ex: self.task_ex = wf_utils.find_task_executions_by_spec( self.wf_ex, self.task_spec ) if not self.task_ex: self._create_task_execution() self.set_state(states.WAITING, 'Task execution is deferred.') self.waiting = True