X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3081e02da59e46d5e913a0ec3ea228e57c5c5e00..81693ee04f18e68558c9206705ef589cca2460b0:/sdk/cwl/arvados_cwl/arvtool.py diff --git a/sdk/cwl/arvados_cwl/arvtool.py b/sdk/cwl/arvados_cwl/arvtool.py index 5257645304..31e6be12b5 100644 --- a/sdk/cwl/arvados_cwl/arvtool.py +++ b/sdk/cwl/arvados_cwl/arvtool.py @@ -2,7 +2,8 @@ # # SPDX-License-Identifier: Apache-2.0 -from cwltool.command_line_tool import CommandLineTool +from cwltool.command_line_tool import CommandLineTool, ExpressionTool +from cwltool.builder import Builder from .arvjob import ArvadosJob from .arvcontainer import ArvadosContainer from .pathmapper import ArvPathMapper @@ -15,7 +16,7 @@ def validate_cluster_target(arvrunner, runtimeContext): 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(arvrunner.api._rootDesc["remoteHosts"].keys()))) + ", ".join(list(arvrunner.api._rootDesc["remoteHosts"].keys())))) def set_cluster_target(tool, arvrunner, builder, runtimeContext): cluster_target_req = None for field in ("hints", "requirements"): @@ -36,6 +37,31 @@ def set_cluster_target(tool, arvrunner, builder, runtimeContext): return runtimeContext +def make_builder(joborder, hints, requirements, runtimeContext): + return Builder( + job=joborder, + files=[], # type: List[Dict[Text, Text]] + bindings=[], # type: List[Dict[Text, Any]] + schemaDefs={}, # type: Dict[Text, Dict[Text, Any]] + names=None, # type: Names + requirements=requirements, # type: List[Dict[Text, Any]] + hints=hints, # type: List[Dict[Text, Any]] + resources={}, # type: Dict[str, int] + mutation_manager=None, # type: Optional[MutationManager] + formatgraph=None, # type: Optional[Graph] + make_fs_access=None, # type: Type[StdFsAccess] + fs_access=None, # type: StdFsAccess + job_script_provider=runtimeContext.job_script_provider, # type: Optional[Any] + timeout=runtimeContext.eval_timeout, # type: float + debug=runtimeContext.debug, # type: bool + js_console=runtimeContext.js_console, # type: bool + force_docker_pull=runtimeContext.force_docker_pull, # type: bool + loadListing="", # type: Text + outdir="", # type: Text + tmpdir="", # type: Text + stagedir="", # type: Text + ) + class ArvadosCommandTool(CommandLineTool): """Wrap cwltool CommandLineTool to override selected methods.""" @@ -62,7 +88,7 @@ class ArvadosCommandTool(CommandLineTool): "$(task.keep)/%s/%s") def job(self, joborder, output_callback, runtimeContext): - builder = self._init_job(joborder, runtimeContext) + builder = make_builder(joborder, self.hints, self.requirements, runtimeContext) runtimeContext = set_cluster_target(self.tool, self.arvrunner, builder, runtimeContext) if runtimeContext.work_api == "containers": @@ -79,3 +105,15 @@ class ArvadosCommandTool(CommandLineTool): runtimeContext.tmpdir = "$(task.tmpdir)" runtimeContext.docker_tmpdir = "$(task.tmpdir)" return super(ArvadosCommandTool, self).job(joborder, output_callback, runtimeContext) + +class ArvadosExpressionTool(ExpressionTool): + def __init__(self, arvrunner, toolpath_object, loadingContext): + super(ArvadosExpressionTool, self).__init__(toolpath_object, loadingContext) + self.arvrunner = arvrunner + + def job(self, + job_order, # type: Mapping[Text, Text] + output_callback, # type: Callable[[Any, Any], Any] + runtimeContext # type: RuntimeContext + ): + return super(ArvadosExpressionTool, self).job(job_order, self.arvrunner.get_wrapped_callback(output_callback), runtimeContext)