def publish_job_success(job_id,
                        job_spec,
                        workflow_workspace,
                        expanded_workflow_json,
                        step,
                        command,
                        publisher,
                        workflow_uuid,
                        cache_dir_path=None):
    """Publish to MQ the job success."""
    finished_jobs = {"total": 1, "job_ids": [job_id]}
    if step == expanded_workflow_json['steps'][-1] and \
            command == step['commands'][-1]:
        workflow_status = 2
    else:
        workflow_status = 1

    message = {}
    message["progress"] = build_progress_message(finished=finished_jobs)
    if cache_dir_path:
        message["caching_info"] = build_caching_info_message(
            job_spec, job_id, workflow_workspace, step, cache_dir_path)
    publisher.publish_workflow_status(workflow_uuid,
                                      workflow_status,
                                      message=message)
def publish_workflow_failure(job_id, workflow_uuid, publisher):
    """Publish to MQ the workflow failure."""
    failed_jobs = {"total": 1, "job_ids": [job_id]} if job_id else None

    publisher.publish_workflow_status(
        workflow_uuid,
        3,
        message={"progress": build_progress_message(failed=failed_jobs)})
def publish_workflow_start(workflow_json, workflow_uuid, publisher):
    """Publish to MQ the start of the workflow."""
    total_commands = 0
    for step in workflow_json['steps']:
        total_commands += len(step['commands'])
    total_jobs = {"total": total_commands, "job_ids": []}
    publisher.publish_workflow_status(
        workflow_uuid,
        1,
        message={"progress": build_progress_message(total=total_jobs)})
def publish_job_submission(step_number, command, workflow_json, job_id,
                           publisher, workflow_uuid):
    """Publish to MQ the job submission."""
    logging.info('Publishing step:{0}, cmd: {1},'
                 ' total steps {2} to MQ'.format(step_number, command,
                                                 len(workflow_json['steps'])))
    running_jobs = {"total": 1, "job_ids": [job_id]}

    publisher.publish_workflow_status(
        workflow_uuid,
        status=1,
        message={"progress": build_progress_message(running=running_jobs)})
def publish_cache_copy(job_id, step, expanded_workflow_json, command,
                       publisher, workflow_uuid):
    """Publish to MQ the cache hit."""
    logging.info('Copied from cache')
    if step == expanded_workflow_json['steps'][-1] and \
            command == step['commands'][-1]:
        workflow_status = 2
    else:
        workflow_status = 1
    succeeded_jobs = {"total": 1, "job_ids": [job_id]}
    publisher.publish_workflow_status(workflow_uuid,
                                      workflow_status,
                                      message={
                                          "progress":
                                          build_progress_message(
                                              finished=succeeded_jobs,
                                              cached=succeeded_jobs)
                                      })
Exemplo n.º 6
0
    def submit(self, spec, parameters, state, metadata):  # noqa: C901
        """Submit a yadage packtivity to RJC."""
        parameters, state = finalize_inputs(parameters, state)
        job = build_job(spec["process"], parameters, state, self.config)

        if "command" in job:
            prettified_cmd = wrapped_cmd = job["command"]
        elif "script" in job:
            prettified_cmd = job["script"]
            wrapped_cmd = make_script(job)

        image = spec["environment"]["image"]
        imagetag = spec["environment"].get("imagetag", "")
        if imagetag:
            image = image + ":" + imagetag

        kerberos = None
        compute_backend = None
        kubernetes_uid = None
        kubernetes_memory_limit = None
        unpacked_img = None
        voms_proxy = None
        htcondor_max_runtime = None
        htcondor_accounting_group = None
        resources = spec["environment"].get("resources", None)
        if resources:
            for item in resources:
                if not isinstance(item, dict):
                    log.info(
                        'REANA only supports dictionary entries for resources. "{0}" value is not formatted in such a way and will be ignored.'
                        .format(item))
                    continue
                if "kerberos" in item.keys():
                    kerberos = item["kerberos"]
                if "compute_backend" in item.keys():
                    compute_backend = item["compute_backend"]
                if "kubernetes_uid" in item.keys():
                    kubernetes_uid = item["kubernetes_uid"]
                if "kubernetes_memory_limit" in item.keys():
                    kubernetes_memory_limit = item["kubernetes_memory_limit"]
                if "unpacked_img" in item.keys():
                    unpacked_img = item["unpacked_img"]
                if "voms_proxy" in item.keys():
                    voms_proxy = item["voms_proxy"]
                if "htcondor_max_runtime" in item.keys():
                    htcondor_max_runtime = item["htcondor_max_runtime"]
                if "htcondor_accounting_group" in item.keys():
                    htcondor_accounting_group = item[
                        "htcondor_accounting_group"]

        log.info("state context is {0}".format(state))
        log.info("would run job {0}".format(job))

        state.ensure()

        log.info("submitting!")

        workflow_uuid = os.getenv("workflow_uuid", "default")
        job_request_body = {
            "workflow_uuid": workflow_uuid,
            "image": image,
            "cmd": wrapped_cmd,
            "prettified_cmd": prettified_cmd,
            "workflow_workspace": os.getenv("workflow_workspace", "default"),
            "job_name": metadata["name"],
            "cvmfs_mounts": MOUNT_CVMFS,
        }

        if compute_backend:
            job_request_body["compute_backend"] = compute_backend
        if kerberos:
            job_request_body["kerberos"] = kerberos
        if kubernetes_uid:
            job_request_body["kubernetes_uid"] = kubernetes_uid
        if kubernetes_memory_limit:
            job_request_body[
                "kubernetes_memory_limit"] = kubernetes_memory_limit
        if unpacked_img:
            job_request_body["unpacked_img"] = unpacked_img
        if voms_proxy:
            job_request_body["voms_proxy"] = voms_proxy
        if htcondor_max_runtime:
            job_request_body["htcondor_max_runtime"] = htcondor_max_runtime
        if htcondor_accounting_group:
            job_request_body[
                "htcondor_accounting_group"] = htcondor_accounting_group

        job_id = self.rjc_api_client.submit(**job_request_body)

        log.info("submitted job:{0}".format(job_id))
        message = {
            "progress":
            build_progress_message(running={
                "total": 1,
                "job_ids": [job_id.get("job_id")]
            })
        }
        workflow_uuid = os.getenv("workflow_uuid", "default")
        status_running = 1
        try:
            publisher = REANAWorkflowStatusPublisher()
            publisher.publish_workflow_status(workflow_uuid,
                                              status_running,
                                              message=message)
        except Exception as e:
            log.info("Status: workflow - {workflow_uuid} "
                     "status - {status} message - {message}".format(
                         workflow_uuid=workflow_uuid,
                         status=status_running,
                         message=message))
            log.info("workflow status publish failed: {0}".format(e))

        return ReanaExternalProxy(jobproxy=job_id,
                                  spec=spec,
                                  pardata=parameters,
                                  statedata=state)