def process(self, session, execution, workflow, status, output): from flux.models import Run run = Run.load(session, id=execution.run_id, lockmode='update') failure = False values = None operation = session.query(Operation).get(self.operation) if status == 'completed': if output['status'] == 'valid': status, outcome, values = self._parse_outcome(operation, output) if status == 'completed': execution.complete(session, outcome) else: failure = True execution.fail(session, outcome) elif output['status'] == 'invalid': execution.invalidate(session, output['errors']) return run.invalidate(session) elif status == 'failed': failure = True execution.fail(session) elif status == 'timedout': failure = True execution.timeout(session) interpolator = self._construct_interpolator(run, execution) if values: interpolator['step']['out'] = values environment = Environment(workflow, run, interpolator, output=values, ancestor=execution, failure=failure) postoperation = self.postoperation if postoperation: postoperation.evaluate(session, environment) if environment.failure: if execution.status == 'failed': return run.fail(session) if execution.status == 'timedout': return run.timeout(session) if not run.active_executions.count(): executions = run.executions execution_status = WorkflowExecution.status if executions.filter(execution_status=='failed').count(): return run.fail(session) if executions.filter(execution_status=='timedout').count(): return run.timeout(session) if not executions.filter(execution_status!='completed').count(): return run.complete(session)
def _setup_active_run(self, workflow_id, steps, parameters=None): session = self.config.schema.session run = Run.create(session, workflow_id, started=current_timestamp()) session.commit() self._runs.append(run.id) execution = None for step in steps: execution = run.create_execution(session, step, parameters=parameters, ancestor=execution) execution.start() sleep(1) session.commit() return run