X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e838828374ceed5ef6da260939251e86f72b6f27..7bdffdeb9ccec113d1d9b848423be60d85a501ed:/sdk/cwl/arvados_cwl/arvtool.py diff --git a/sdk/cwl/arvados_cwl/arvtool.py b/sdk/cwl/arvados_cwl/arvtool.py index 4fc02a0166..86fecc0a1d 100644 --- a/sdk/cwl/arvados_cwl/arvtool.py +++ b/sdk/cwl/arvados_cwl/arvtool.py @@ -3,20 +3,36 @@ # SPDX-License-Identifier: Apache-2.0 from cwltool.command_line_tool import CommandLineTool, ExpressionTool -from .arvjob import ArvadosJob from .arvcontainer import ArvadosContainer from .pathmapper import ArvPathMapper from .runner import make_builder +from ._version import __version__ from functools import partial from schema_salad.sourceline import SourceLine from cwltool.errors import WorkflowException +from arvados.util import portable_data_hash_pattern def validate_cluster_target(arvrunner, runtimeContext): if (runtimeContext.submit_runner_cluster and runtimeContext.submit_runner_cluster not in arvrunner.api._rootDesc["remoteHosts"] and runtimeContext.submit_runner_cluster != arvrunner.api._rootDesc["uuidPrefix"]): raise WorkflowException("Unknown or invalid cluster id '%s' known remote clusters are %s" % (runtimeContext.submit_runner_cluster, - ", ".join(list(arvrunner.api._rootDesc["remoteHosts"].keys())))) + ", ".join(list(arvrunner.api._rootDesc["remoteHosts"].keys())))) + if runtimeContext.project_uuid: + cluster_target = runtimeContext.submit_runner_cluster or arvrunner.api._rootDesc["uuidPrefix"] + if not runtimeContext.project_uuid.startswith(cluster_target): + raise WorkflowException("Project uuid '%s' should start with id of target cluster '%s'" % (runtimeContext.project_uuid, cluster_target)) + + try: + if runtimeContext.project_uuid[5:12] == '-tpzed-': + arvrunner.api.users().get(uuid=runtimeContext.project_uuid).execute() + else: + proj = arvrunner.api.groups().get(uuid=runtimeContext.project_uuid).execute() + if proj["group_class"] != "project": + raise Exception("not a project, group_class is '%s'" % (proj["group_class"])) + except Exception as e: + raise WorkflowException("Invalid project uuid '%s': %s" % (runtimeContext.project_uuid, e)) + def set_cluster_target(tool, arvrunner, builder, runtimeContext): cluster_target_req = None for field in ("hints", "requirements"): @@ -43,13 +59,21 @@ class ArvadosCommandTool(CommandLineTool): def __init__(self, arvrunner, toolpath_object, loadingContext): super(ArvadosCommandTool, self).__init__(toolpath_object, loadingContext) + + (docker_req, docker_is_req) = self.get_requirement("DockerRequirement") + if not docker_req: + if portable_data_hash_pattern.match(loadingContext.default_docker_image): + self.hints.append({"class": "DockerRequirement", + "http://arvados.org/cwl#dockerCollectionPDH": loadingContext.default_docker_image}) + else: + self.hints.append({"class": "DockerRequirement", + "dockerPull": loadingContext.default_docker_image}) + self.arvrunner = arvrunner def make_job_runner(self, runtimeContext): if runtimeContext.work_api == "containers": return partial(ArvadosContainer, self.arvrunner, runtimeContext) - elif runtimeContext.work_api == "jobs": - return partial(ArvadosJob, self.arvrunner) else: raise Exception("Unsupported work_api %s", runtimeContext.work_api) @@ -58,13 +82,9 @@ class ArvadosCommandTool(CommandLineTool): return ArvPathMapper(self.arvrunner, reffiles+runtimeContext.extra_reffiles, runtimeContext.basedir, "/keep/%s", "/keep/%s/%s") - elif runtimeContext.work_api == "jobs": - return ArvPathMapper(self.arvrunner, reffiles, runtimeContext.basedir, - "$(task.keep)/%s", - "$(task.keep)/%s/%s") def job(self, joborder, output_callback, runtimeContext): - builder = make_builder(joborder, self.hints, self.requirements, runtimeContext) + builder = make_builder(joborder, self.hints, self.requirements, runtimeContext, self.metadata) runtimeContext = set_cluster_target(self.tool, self.arvrunner, builder, runtimeContext) if runtimeContext.work_api == "containers": @@ -75,11 +95,6 @@ class ArvadosCommandTool(CommandLineTool): else: runtimeContext.outdir = "/var/spool/cwl" runtimeContext.docker_outdir = "/var/spool/cwl" - elif runtimeContext.work_api == "jobs": - runtimeContext.outdir = "$(task.outdir)" - runtimeContext.docker_outdir = "$(task.outdir)" - runtimeContext.tmpdir = "$(task.tmpdir)" - runtimeContext.docker_tmpdir = "$(task.tmpdir)" return super(ArvadosCommandTool, self).job(joborder, output_callback, runtimeContext) class ArvadosExpressionTool(ExpressionTool):