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) })
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)