X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/97e0090ec440c3322053d7635d883cf8af6633ca..7a556ab282e43101c7c5cbaee534f5f3062e8878:/sdk/cwl/arvados_cwl/arvcontainer.py diff --git a/sdk/cwl/arvados_cwl/arvcontainer.py b/sdk/cwl/arvados_cwl/arvcontainer.py index 3065e1a7cd..e2c2f2e67b 100644 --- a/sdk/cwl/arvados_cwl/arvcontainer.py +++ b/sdk/cwl/arvados_cwl/arvcontainer.py @@ -57,7 +57,13 @@ class ArvadosContainer(JobBase): def update_pipeline_component(self, r): pass - def run(self, runtimeContext): + def _required_env(self): + env = {} + env["HOME"] = self.outdir + env["TMPDIR"] = self.tmpdir + return env + + def run(self, toplevelRuntimeContext): # ArvadosCommandTool subclasses from cwltool.CommandLineTool, # which calls makeJobRunner() to get a new ArvadosContainer # object. The fields that define execution such as @@ -234,15 +240,14 @@ class ArvadosContainer(JobBase): "path": "%s/%s" % (self.outdir, self.stdout)} (docker_req, docker_is_req) = self.get_requirement("DockerRequirement") - if not docker_req: - docker_req = {"dockerImageId": "arvados/jobs:"+__version__} container_request["container_image"] = arv_docker_get_image(self.arvrunner.api, docker_req, runtimeContext.pull_image, runtimeContext.project_uuid, runtimeContext.force_docker_pull, - runtimeContext.tmp_outdir_prefix) + runtimeContext.tmp_outdir_prefix, + runtimeContext.match_local_docker) network_req, _ = self.get_requirement("NetworkAccess") if network_req: @@ -279,11 +284,32 @@ class ArvadosContainer(JobBase): if self.output_ttl < 0: raise WorkflowException("Invalid value %d for output_ttl, cannot be less than zero" % container_request["output_ttl"]) - storage_class_req, _ = self.get_requirement("http://arvados.org/cwl#OutputStorageClass") - if storage_class_req and storage_class_req.get("intermediateStorageClass"): - container_request["output_storage_classes"] = aslist(storage_class_req["intermediateStorageClass"]) + + if self.arvrunner.api._rootDesc["revision"] >= "20210628": + storage_class_req, _ = self.get_requirement("http://arvados.org/cwl#OutputStorageClass") + if storage_class_req and storage_class_req.get("intermediateStorageClass"): + container_request["output_storage_classes"] = aslist(storage_class_req["intermediateStorageClass"]) + else: + container_request["output_storage_classes"] = runtimeContext.intermediate_storage_classes.strip().split(",") + + cuda_req, _ = self.get_requirement("http://commonwl.org/cwltool#CUDARequirement") + if cuda_req: + runtime_constraints["cuda"] = { + "device_count": resources.get("cudaDeviceCount", 1), + "driver_version": cuda_req["cudaVersionMin"], + "hardware_capability": aslist(cuda_req["cudaComputeCapability"])[0] + } + + if runtimeContext.enable_preemptible is False: + scheduling_parameters["preemptible"] = False else: - container_request["output_storage_classes"] = runtimeContext.intermediate_storage_classes.strip().split(",") + preemptible_req, _ = self.get_requirement("http://arvados.org/cwl#UsePreemptible") + if preemptible_req: + scheduling_parameters["preemptible"] = preemptible_req["usePreemptible"] + elif runtimeContext.enable_preemptible is True: + scheduling_parameters["preemptible"] = True + elif runtimeContext.enable_preemptible is None: + pass if self.timelimit is not None and self.timelimit > 0: scheduling_parameters["max_run_time"] = self.timelimit @@ -482,9 +508,7 @@ class RunnerContainer(Runner): properties_req, _ = self.embedded_tool.get_requirement("http://arvados.org/cwl#ProcessProperties") if properties_req: builder = make_builder(self.job_order, self.embedded_tool.hints, self.embedded_tool.requirements, runtimeContext, self.embedded_tool.metadata) - print("ZZZZZZ", properties_req["processProperties"]) for pr in properties_req["processProperties"]: - print("ZZZZZZ", pr) container_req["properties"][pr["propertyName"]] = builder.do_eval(pr["propertyValue"]) # --local means execute the workflow instead of submitting a container request @@ -516,10 +540,10 @@ class RunnerContainer(Runner): if runtimeContext.debug: command.append("--debug") - if runtimeContext.storage_classes != "default": + if runtimeContext.storage_classes != "default" and runtimeContext.storage_classes: command.append("--storage-classes=" + runtimeContext.storage_classes) - if runtimeContext.intermediate_storage_classes != "default": + if runtimeContext.intermediate_storage_classes != "default" and runtimeContext.intermediate_storage_classes: command.append("--intermediate-storage-classes=" + runtimeContext.intermediate_storage_classes) if self.on_error: @@ -537,6 +561,12 @@ class RunnerContainer(Runner): if self.enable_dev: command.append("--enable-dev") + if runtimeContext.enable_preemptible is True: + command.append("--enable-preemptible") + + if runtimeContext.enable_preemptible is False: + command.append("--disable-preemptible") + command.extend([workflowpath, "/var/lib/cwl/cwl.input.json"]) container_req["command"] = command