Esempio n. 1
0
    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}")
Esempio n. 3
0
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)
Esempio n. 5
0
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)
Esempio n. 7
0
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)
Esempio n. 9
0
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)
Esempio n. 10
0
 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()
Esempio n. 11
0
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"
Esempio n. 12
0
def _update_workflow_status(workflow_uuid, status, logs):
    """Update workflow status in DB."""
    Workflow.update_workflow_status(Session, workflow_uuid, status, logs, None)