X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6c43be47cb3756a0e6ffc924572259d1a1c8f2c3..3a0aa1db801154916f50b1b299d5100945a3e1df:/sdk/cwl/arvados_cwl/arvjob.py diff --git a/sdk/cwl/arvados_cwl/arvjob.py b/sdk/cwl/arvados_cwl/arvjob.py index 397b6d58c0..00355973bd 100644 --- a/sdk/cwl/arvados_cwl/arvjob.py +++ b/sdk/cwl/arvados_cwl/arvjob.py @@ -4,7 +4,7 @@ import copy from cwltool.process import get_feature, shortname from cwltool.errors import WorkflowException -from cwltool.draft2tool import revmap_file, remove_hostfs, CommandLineTool +from cwltool.draft2tool import revmap_file, CommandLineTool from cwltool.load_tool import fetch_document from cwltool.builder import Builder @@ -12,6 +12,7 @@ import arvados.collection from .arvdocker import arv_docker_get_image from .runner import Runner +from .pathmapper import InitialWorkDirPathMapper from . import done logger = logging.getLogger('arvados.cwl-runner') @@ -26,6 +27,7 @@ class ArvadosJob(object): def __init__(self, runner): self.arvrunner = runner self.running = False + self.uuid = None def run(self, dry_run=False, pull_image=True, **kwargs): script_parameters = { @@ -33,30 +35,42 @@ class ArvadosJob(object): } runtime_constraints = {} - if self.generatefiles: + if self.generatefiles["listing"]: vwd = arvados.collection.Collection() script_parameters["task.vwd"] = {} - for t in self.generatefiles: - if isinstance(self.generatefiles[t], dict): - src, rest = self.arvrunner.fs_access.get_collection(self.generatefiles[t]["path"].replace("$(task.keep)/", "keep:")) - vwd.copy(rest, t, source_collection=src) - else: - with vwd.open(t, "w") as f: - f.write(self.generatefiles[t]) + generatemapper = InitialWorkDirPathMapper([self.generatefiles], "", "", + separateDirs=False) + for f, p in generatemapper.items(): + if p.type == "CreateFile": + with vwd.open(p.target, "w") as n: + n.write(p.resolved.encode("utf-8")) vwd.save_new() - for t in self.generatefiles: - script_parameters["task.vwd"][t] = "$(task.keep)/%s/%s" % (vwd.portable_data_hash(), t) + for f, p in generatemapper.items(): + if p.type == "File": + script_parameters["task.vwd"][p.target] = p.resolved + if p.type == "CreateFile": + script_parameters["task.vwd"][p.target] = "$(task.keep)/%s/%s" % (vwd.portable_data_hash(), p.target) script_parameters["task.env"] = {"TMPDIR": "$(task.tmpdir)"} if self.environment: script_parameters["task.env"].update(self.environment) if self.stdin: - script_parameters["task.stdin"] = self.pathmapper.mapper(self.stdin)[1] + script_parameters["task.stdin"] = self.stdin if self.stdout: script_parameters["task.stdout"] = self.stdout + if self.stderr: + script_parameters["task.stderr"] = self.stderr + + if self.successCodes: + script_parameters["task.successCodes"] = self.successCodes + if self.temporaryFailCodes: + script_parameters["task.temporaryFailCodes"] = self.temporaryFailCodes + if self.permanentFailCodes: + script_parameters["task.permanentFailCodes"] = self.permanentFailCodes + (docker_req, docker_is_req) = get_feature(self, "DockerRequirement") if docker_req and kwargs.get("use_container") is not False: runtime_constraints["docker_image"] = arv_docker_get_image(self.arvrunner.api, docker_req, pull_image, self.arvrunner.project_uuid) @@ -90,7 +104,7 @@ class ArvadosJob(object): find_or_create=kwargs.get("enable_reuse", True) ).execute(num_retries=self.arvrunner.num_retries) - self.arvrunner.jobs[response["uuid"]] = self + self.arvrunner.processes[response["uuid"]] = self self.update_pipeline_component(response) @@ -171,7 +185,7 @@ class ArvadosJob(object): self.output_callback(outputs, processStatus) finally: - del self.arvrunner.jobs[record["uuid"]] + del self.arvrunner.processes[record["uuid"]] class RunnerJob(Runner): @@ -208,7 +222,7 @@ class RunnerJob(Runner): ).execute(num_retries=self.arvrunner.num_retries) self.uuid = response["uuid"] - self.arvrunner.jobs[self.uuid] = self + self.arvrunner.processes[self.uuid] = self logger.info("Submitted job %s", response["uuid"]) @@ -283,7 +297,7 @@ class RunnerTemplate(object): # Title and description... title = param.pop('label', '') - descr = param.pop('description', '').rstrip('\n') + descr = param.pop('doc', '').rstrip('\n') if title: param['title'] = title if descr: @@ -296,8 +310,8 @@ class RunnerTemplate(object): pass elif not isinstance(value, dict): param['value'] = value - elif param.get('dataclass') == 'File' and value.get('path'): - param['value'] = value['path'] + elif param.get('dataclass') == 'File' and value.get('location'): + param['value'] = value['location'] spec['script_parameters'][param_id] = param spec['script_parameters']['cwl:tool'] = job_params['cwl:tool']