X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2cf1740bfe7e5790752654ce1b7e0220bc194004..81693ee04f18e68558c9206705ef589cca2460b0:/sdk/cwl/arvados_cwl/arvworkflow.py diff --git a/sdk/cwl/arvados_cwl/arvworkflow.py b/sdk/cwl/arvados_cwl/arvworkflow.py index b26bee8247..8e6bff4f04 100644 --- a/sdk/cwl/arvados_cwl/arvworkflow.py +++ b/sdk/cwl/arvados_cwl/arvworkflow.py @@ -2,6 +2,9 @@ # # SPDX-License-Identifier: Apache-2.0 +from past.builtins import basestring +from future.utils import viewitems + import os import json import copy @@ -14,7 +17,6 @@ from cwltool.load_tool import fetch_document from cwltool.process import shortname from cwltool.workflow import Workflow, WorkflowException, WorkflowStep from cwltool.pathmapper import adjustFileObjs, adjustDirObjs, visit_class -from cwltool.builder import Builder from cwltool.context import LoadingContext import ruamel.yaml as yaml @@ -22,7 +24,7 @@ import ruamel.yaml as yaml from .runner import (upload_dependencies, packed_workflow, upload_workflow_collection, trim_anonymous_location, remove_redundant_fields, discover_secondary_files) from .pathmapper import ArvPathMapper, trim_listing -from .arvtool import ArvadosCommandTool, check_cluster_target +from .arvtool import ArvadosCommandTool, set_cluster_target, make_builder from .perf import Perf logger = logging.getLogger('arvados.cwl-runner') @@ -133,10 +135,14 @@ class ArvadosWorkflowStep(WorkflowStep): self.arvrunner = arvrunner def job(self, joborder, output_callback, runtimeContext): - builder = self._init_job({shortname(k): v for k,v in joborder.items()}, runtimeContext) - check_cluster_target(self, builder, runtimeContext) + runtimeContext = runtimeContext.copy() + runtimeContext.toplevel = True # Preserve behavior for #13365 + + builder = make_builder({shortname(k): v for k,v in viewitems(joborder)}, self.hints, self.requirements, runtimeContext) + runtimeContext = set_cluster_target(self.tool, self.arvrunner, builder, runtimeContext) return super(ArvadosWorkflowStep, self).job(joborder, output_callback, runtimeContext) + class ArvadosWorkflow(Workflow): """Wrap cwltool Workflow to override selected methods.""" @@ -148,11 +154,12 @@ class ArvadosWorkflow(Workflow): self.wf_reffiles = [] self.loadingContext = loadingContext super(ArvadosWorkflow, self).__init__(toolpath_object, loadingContext) + self.cluster_target_req, _ = self.get_requirement("http://arvados.org/cwl#ClusterTarget") def job(self, joborder, output_callback, runtimeContext): - builder = self._init_job(joborder, runtimeContext) - check_cluster_target(self, builder, runtimeContext) + builder = make_builder(joborder, self.hints, self.requirements, runtimeContext) + runtimeContext = set_cluster_target(self.tool, self.arvrunner, builder, runtimeContext) req, _ = self.get_requirement("http://arvados.org/cwl#RunInSingleContainer") if not req: @@ -201,6 +208,9 @@ class ArvadosWorkflow(Workflow): raise WorkflowException("Non-top-level ResourceRequirement in single container cannot have expressions") if not dyn: self.static_resource_req.append(req) + if req["class"] == "DockerRequirement": + if "http://arvados.org/cwl#dockerCollectionPDH" in req: + del req["http://arvados.org/cwl#dockerCollectionPDH"] visit_class(packed["$graph"], ("Workflow", "CommandLineTool"), visit)