def _run_workflow(time_elapsed_seconds=0.5, finish=True): """Mock a workflow run.""" id_ = uuid4() workflow = Workflow( id_=str(id_), name="test_{}".format(id_), owner_id=new_user.id_, reana_specification=[], type_="serial", logs="", status=RunStatus.created, ) # start workflow workflow.status = RunStatus.running session.add(workflow) session.commit() termination_value = datetime.now() + timedelta( seconds=time_elapsed_seconds) class MockDatetime(datetime): @classmethod def now(cls): return termination_value if finish: with mock.patch("reana_db.models.datetime", MockDatetime): Workflow.update_workflow_status(session, workflow.id_, RunStatus.finished) return workflow
def _update_workflow_status(workflow, status, logs): """Update workflow status in DB.""" if workflow.status != status: Workflow.update_workflow_status(Session, workflow.id_, status, logs, None) if workflow.git_ref: _update_commit_status(workflow, status) if status not in ALIVE_STATUSES: workflow.run_finished_at = datetime.now() workflow.logs = workflow.logs or "" try: workflow_engine_logs = _get_workflow_engine_pod_logs(workflow) workflow.logs += workflow_engine_logs + "\n" except REANAWorkflowControllerError as exception: logging.error( f"Could not fetch workflow engine pod logs for workflow {workflow.id_}." f" Error: {exception}") workflow.logs += "Workflow engine logs could not be retrieved.\n" if RunStatus.should_cleanup_job(status): try: _delete_workflow_job(workflow) except REANAWorkflowControllerError as exception: logging.error( f"Could not clean up workflow job for workflow {workflow.id_}." f" Error: {exception}")
def initialize_krb5_token(workflow_uuid): """Create kerberos ticket from mounted keytab_file.""" cern_user = os.environ.get("CERN_USER") keytab_file = os.environ.get("CERN_KEYTAB") cmd = "kinit -kt /etc/reana/secrets/{} {}@CERN.CH".format( keytab_file, cern_user) if cern_user: try: subprocess.check_output(cmd, shell=True) except subprocess.CalledProcessError as err: msg = "Executing: {} \n Authentication failed: {}".format(cmd, err) Workflow.update_workflow_status( db_session=Session, workflow_uuid=workflow_uuid, status=None, new_logs=msg, ) logging.error(msg, exc_info=True) sys.exit(1) else: msg = "CERN_USER is not set." logging.error(msg, exc_info=True) Workflow.update_workflow_status(db_session=Session, workflow_uuid=workflow_uuid, status=None, new_logs=msg) logging.error(msg, exc_info=True)
def _update_workflow_status(workflow_uuid, status, logs): """Update workflow status in DB.""" Workflow.update_workflow_status(Session, workflow_uuid, status, logs, None) alive_statuses = \ [WorkflowStatus.created, WorkflowStatus.running, WorkflowStatus.queued] if status not in alive_statuses: _delete_workflow_engine_pod(workflow_uuid)
def publish_workflow_submission(workflow, user_id, parameters): """Publish workflow submission.""" from reana_server.status import NodesStatus Workflow.update_workflow_status(Session, workflow.id_, RunStatus.queued) scheduling_policy = REANA_WORKFLOW_SCHEDULING_POLICY if scheduling_policy not in REANA_WORKFLOW_SCHEDULING_POLICIES: raise ValueError( 'Workflow scheduling policy "{0}" is not valid.'.format( scheduling_policy)) # No need to estimate the complexity for "fifo" strategy if scheduling_policy == "fifo": workflow_priority = 0 workflow_min_job_memory = 0 else: total_cluster_memory = NodesStatus().get_total_memory() complexity = _calculate_complexity(workflow) workflow_priority = workflow.get_priority(total_cluster_memory) workflow_min_job_memory = get_workflow_min_job_memory(complexity) current_workflow_submission_publisher.publish_workflow_submission( user_id=str(user_id), workflow_id_or_name=workflow.get_full_workflow_name(), parameters=parameters, priority=workflow_priority, min_job_memory=workflow_min_job_memory, )
def _update_workflow_status(workflow_uuid, status, logs): """Update workflow status in DB.""" Workflow.update_workflow_status(Session, workflow_uuid, status, logs, None) workflow = Session.query(Workflow).filter_by(id_=workflow_uuid)\ .one_or_none() if workflow.git_ref: _update_commit_status(workflow, status)
def _update_workflow_status(workflow_uuid, status, logs): """Update workflow status in DB.""" Workflow.update_workflow_status(Session, workflow_uuid, status, logs, None) workflow = Session.query(Workflow).filter_by(id_=workflow_uuid)\ .one_or_none() if workflow.git_ref: _update_commit_status(workflow, status) alive_statuses = \ [WorkflowStatus.created, WorkflowStatus.running, WorkflowStatus.queued] if status not in alive_statuses: _delete_workflow_engine_pod(workflow_uuid)
def _update_workflow_status(workflow, status, logs): """Update workflow status in DB.""" if workflow.status != status: Workflow.update_workflow_status(Session, workflow.id_, status, logs, None) if workflow.git_ref: _update_commit_status(workflow, status) alive_statuses = [ RunStatus.created, RunStatus.running, RunStatus.queued, ] if status not in alive_statuses: _delete_workflow_engine_pod(workflow)
def _update_workflow_status(workflow, status, logs): """Update workflow status in DB.""" if workflow.status != status: Workflow.update_workflow_status(Session, workflow.id_, status, logs, None) if workflow.git_ref: _update_commit_status(workflow, status) alive_statuses = [ WorkflowStatus.created, WorkflowStatus.running, WorkflowStatus.queued, ] if status not in alive_statuses: workflow.run_finished_at = datetime.now() _delete_workflow_engine_pod(workflow)
def on_message(self, workflow_submission, message): """On new workflow_submission event handler.""" if reana_ready(): message.ack() workflow_submission = json.loads(workflow_submission) logging.info( 'Starting queued workflow: {}'.format(workflow_submission)) workflow_submission['status'] = 'start' response, http_response = current_rwc_api_client.api.\ set_workflow_status(**workflow_submission).result() http_response_json = http_response.json() if http_response.status_code == 200: workflow_uuid = http_response_json['workflow_id'] status = http_response_json['status'] Workflow.update_workflow_status(Session, workflow_uuid, status) else: message.requeue()
def _update_workflow_status(workflow, status, logs): """Update workflow status in DB.""" if workflow.status != status: Workflow.update_workflow_status(Session, workflow.id_, status, logs, None) if workflow.git_ref: _update_commit_status(workflow, status) if status not in ALIVE_STATUSES: try: workflow.run_finished_at = datetime.now() if RunStatus.should_cleanup_job(status): _delete_workflow_engine_pod(workflow) except REANAWorkflowControllerError: logging.error( f"Could not clean up workflow engine for workflow {workflow.id_}" ) workflow.logs += "Workflow engine logs could not be retrieved.\n"
def _update_workflow_status(workflow_uuid, status, logs): """Update workflow status in DB.""" Workflow.update_workflow_status(Session, workflow_uuid, status, logs, None)