def _deserialize_task(self, workflow, s_state): assert isinstance(workflow, Workflow) # task_spec task_spec = workflow.get_task_spec_from_name(s_state['task_spec']) task = Task(workflow, task_spec) # id task.id = s_state['id'] # parent # as the task_tree might not be complete yet # keep the ids so they can be processed at the end task.parent = s_state['parent'] # children task.children = [ self._deserialize_task(workflow, c) for c in s_state['children'] ] # state task._state = s_state['state'] task.triggered = s_state['triggered'] # last_state_change task.last_state_change = s_state['last_state_change'] # data task.data = s_state['data'] # internal_data #if 'subworkflow' in s_state['internal_data']: # task.internal_data = self._deserialize_dict(s_state['internal_data']) return task
def _deserialize_task(self, workflow, s_state): assert isinstance(workflow, Workflow) # task_spec task_spec = workflow.get_task_spec_from_name(s_state['task_spec']) task = Task(workflow, task_spec) # id task.id = s_state['id'] # parent task.parent = workflow.get_task(s_state['parent']) # children task.children = [ self._deserialize_task(workflow, c) for c in s_state['children'] ] # state task._state = s_state['state'] task.triggered = s_state['triggered'] # last_state_change task.last_state_change = s_state['last_state_change'] # attributes task.attributes = s_state['attributes'] # internal_attributes task.internal_attributes = s_state['internal_attributes'] return task
def _deserialize_task(self, workflow, s_state): assert isinstance(workflow, Workflow) # task_spec task_spec = workflow.get_task_spec_from_name(s_state['task_spec']) task = Task(workflow, task_spec) # id task.id = s_state['id'] # parent task.parent = workflow.get_task(s_state['parent']) # children task.children = [self._deserialize_task(workflow, c) for c in s_state['children']] # state task._state = s_state['state'] task.triggered = s_state['triggered'] # last_state_change task.last_state_change = s_state['last_state_change'] # attributes task.attributes = s_state['attributes'] # internal_attributes task.internal_attributes = s_state['internal_attributes'] return task
def _deserialize_task(self, workflow, s_state): assert isinstance(workflow, Workflow) # task_spec task_spec = workflow.get_task_spec_from_name(s_state['task_spec']) task = Task(workflow, task_spec) # id task.id = s_state['id'] # parent # as the task_tree might not be complete yet # keep the ids so they can be processed at the end task.parent = s_state['parent'] # children task.children = [self._deserialize_task(workflow, c) for c in s_state['children']] # state task._state = s_state['state'] task.triggered = s_state['triggered'] # last_state_change task.last_state_change = s_state['last_state_change'] # data task.data = s_state['data'] # internal_data task.internal_data = s_state['internal_data'] return task
def _retry_failed_task_clone(self, failed_task): ''' Retry failed task by cloning it, leaving exisitng task as is. (marat): personally a like this way much better, then _retry_failed_task(), but there is a problem with leaving failed_task in ERROR state, cause workflow becomes incompleted forever ''' cloned_task = Task(failed_task.workflow, failed_task.task_spec, parent=failed_task.parent, state=Task.FUTURE, internal_data={ 'error_data': failed_task.internal_data['error_data'] }) # Correct position siblings = failed_task.parent.children siblings.pop() siblings.insert(siblings.index(failed_task) + 1, cloned_task) for child in failed_task.children[:]: if child.task_spec in failed_task.task_spec.outputs: cloned_task.children.append(child) failed_task.children.remove(child) cloned_task.task_spec._update_state(cloned_task)
def accept_message(self, message): """ Indicate to the workflow that a message has been received. The message will be processed by any waiting Intermediate or Boundary Message Events, that are waiting for the message. """ assert not self.read_only self.refresh_waiting_tasks() self.do_engine_steps() for my_task in Task.Iterator(self.task_tree, Task.WAITING): my_task.task_spec.accept_message(my_task, message)
def _branch_is_complete(self, my_task): # Determine whether that branch is now completed by checking whether # it has any waiting items other than myself in it. skip = None for task in Task.Iterator(my_task, my_task.NOT_FINISHED_MASK): # If the current task is a child of myself, ignore it. if skip is not None and task._is_descendant_of(skip): continue if task.task_spec == self: skip = task continue return False return True
def _deserialize_task(self, workflow, s_state): assert isinstance(workflow, Workflow) # task_spec task_spec = workflow.get_task_spec_from_name(s_state['task_spec']) if task_spec.name == "Root": # Don't create two roots task = workflow.task_tree else: task = Task(workflow, task_spec) # id task.id = s_state['id'] # parent task.parent = workflow.get_task(s_state['parent']) # We need to add children in before deserializing child tasks so they can # find their parent (Task.Iter uses children to traverse the hierarchy if task.parent and task not in task.parent.children: task.parent.children.append(task) assert task.parent is not None or task.get_name() == 'Root' # children for c in s_state['children']: self._deserialize_task(workflow, c) # state task._state = s_state['state'] # last_state_change task.last_state_change = s_state['last_state_change'] # attributes task.attributes = s_state['attributes'] # internal_attributes task.internal_attributes = s_state['internal_attributes'] return task
def _deserialize_task(self, workflow, s_state): assert isinstance(workflow, Workflow), ("The workflow parameter did " "not receive a Workflow " "object. Instead, it got a " "'%s'" % workflow.__class__) # task_spec task_spec = workflow.get_task_spec_from_name(s_state['task_spec']) if task_spec.name == "Root": # Don't create two roots task = workflow.task_tree else: task = Task(workflow, task_spec) # id task.id = s_state['id'] # parent task.parent = workflow.get_task(s_state['parent']) # We need to add children in before deserializing child tasks so they can # find their parent (Task.Iter uses children to traverse the hierarchy if task.parent and task not in task.parent.children: task.parent.children.append(task) #assert task.parent is not None or task.get_name() == 'Root', ("Task " # "'%s' parent is None" % task.get_name()) # children for c in s_state['children']: self._deserialize_task(workflow, c) # state task._state = s_state['state'] # last_state_change task.last_state_change = s_state['last_state_change'] # attributes task.attributes = s_state['attributes'] # internal_attributes task.internal_attributes = s_state['internal_attributes'] return task