From 22773dcba5c8f59a01a08c1734dd5249517808c9 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Fri, 16 Sep 2016 09:54:45 -0400 Subject: [PATCH] 10081: Add test for recursively calling cwltool when arv:RunInSingleContainer is provided. --- sdk/cwl/arvados_cwl/arvjob.py | 3 +- sdk/cwl/arvados_cwl/arvworkflow.py | 2 +- sdk/cwl/tests/scatter2.cwl | 60 ++++++++++++++++++++++++++++++ sdk/cwl/tests/test_job.py | 56 ++++++++++++++++++++++++++-- 4 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 sdk/cwl/tests/scatter2.cwl diff --git a/sdk/cwl/arvados_cwl/arvjob.py b/sdk/cwl/arvados_cwl/arvjob.py index 7cde2736c6..78bca6e0e1 100644 --- a/sdk/cwl/arvados_cwl/arvjob.py +++ b/sdk/cwl/arvados_cwl/arvjob.py @@ -40,7 +40,6 @@ class ArvadosJob(object): if self.generatefiles["listing"]: vwd = arvados.collection.Collection() script_parameters["task.vwd"] = {} - logger.debug("generatefiles is %s", json.dumps(self.generatefiles, indent=4)) generatemapper = InitialWorkDirPathMapper([self.generatefiles], "", "", separateDirs=False) for f, p in generatemapper.items(): @@ -187,9 +186,11 @@ class ArvadosJob(object): except WorkflowException as e: logger.error("Error while collecting job outputs:\n%s", e, exc_info=(e if self.arvrunner.debug else False)) processStatus = "permanentFail" + outputs = None except Exception as e: logger.exception("Got unknown exception while collecting job outputs:") processStatus = "permanentFail" + outputs = None self.output_callback(outputs, processStatus) finally: diff --git a/sdk/cwl/arvados_cwl/arvworkflow.py b/sdk/cwl/arvados_cwl/arvworkflow.py index c20bffa2f4..eed4711a23 100644 --- a/sdk/cwl/arvados_cwl/arvworkflow.py +++ b/sdk/cwl/arvados_cwl/arvworkflow.py @@ -80,7 +80,7 @@ class ArvadosWorkflow(Workflow): }] }], "hints": workflowobj["hints"], - "arguments": ["workflow.json", "cwl.input.json"] + "arguments": ["--no-container", "--move-outputs", "workflow.json", "cwl.input.json"] } kwargs["loader"] = self.doc_loader kwargs["avsc_names"] = self.doc_schema diff --git a/sdk/cwl/tests/scatter2.cwl b/sdk/cwl/tests/scatter2.cwl new file mode 100644 index 0000000000..29529839eb --- /dev/null +++ b/sdk/cwl/tests/scatter2.cwl @@ -0,0 +1,60 @@ +class: Workflow +cwlVersion: v1.0 +$namespaces: + arv: "http://arvados.org/cwl#" +inputs: + sleeptime: + type: int[] + default: [44, 29, 14] +outputs: [] +requirements: + SubworkflowFeatureRequirement: {} + ScatterFeatureRequirement: {} + InlineJavascriptRequirement: {} + StepInputExpressionRequirement: {} +steps: + scatterstep: + in: + sleeptime: sleeptime + out: [] + scatter: sleeptime + hints: + - class: arv:RunInSingleContainer + run: + class: Workflow + id: mysub + inputs: + sleeptime: int + outputs: [] + steps: + sleep1: + in: + sleeptime: sleeptime + out: [out] + run: + class: CommandLineTool + inputs: + sleeptime: + type: int + inputBinding: {position: 1} + outputs: + out: + type: string + outputBinding: + outputEval: "out" + baseCommand: sleep + sleep2: + in: + sleeptime: + source: sleeptime + valueFrom: $(self+1) + dep: sleep1/out + out: [] + run: + class: CommandLineTool + inputs: + sleeptime: + type: int + inputBinding: {position: 1} + outputs: [] + baseCommand: sleep diff --git a/sdk/cwl/tests/test_job.py b/sdk/cwl/tests/test_job.py index 6189a2de35..324e2c3d23 100644 --- a/sdk/cwl/tests/test_job.py +++ b/sdk/cwl/tests/test_job.py @@ -1,12 +1,13 @@ -import arvados_cwl + import logging import mock import unittest import os import functools -import cwltool.process -from schema_salad.ref_resolver import Loader +import json +import arvados_cwl +import cwltool.process from schema_salad.ref_resolver import Loader if not os.getenv('ARVADOS_DEBUG'): @@ -193,3 +194,52 @@ class TestJob(unittest.TestCase): mock.call().execute(num_retries=0)]) self.assertFalse(api.collections().create.called) + + +class TestWorkflow(unittest.TestCase): + # The test passes no builder.resources + # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024} + def test_run(self): + runner = arvados_cwl.ArvCwlRunner(mock.MagicMock()) + runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz" + runner.ignore_docker_for_reuse = False + document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("v1.0") + + tool, metadata = document_loader.resolve_ref("tests/wf/scatter2.cwl") + metadata["cwlVersion"] = tool["cwlVersion"] + + make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api) + arvtool = arvados_cwl.ArvadosWorkflow(runner, tool, work_api="jobs", avsc_names=avsc_names, + basedir="", make_fs_access=make_fs_access, loader=document_loader, + makeTool=runner.arv_make_tool, metadata=metadata) + arvtool.formatgraph = None + for j in arvtool.job({}, mock.MagicMock(), basedir="", make_fs_access=make_fs_access): + j.run() + runner.api.jobs().create.assert_called_with( + body={ + 'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6', + 'repository': 'arvados', + 'script_version': 'master', + 'script': 'crunchrunner', + 'script_parameters': { + 'tasks': [{'task.env': { + 'HOME': '$(task.outdir)', + 'TMPDIR': '$(task.tmpdir)'}, + 'task.vwd': { + 'workflow.json': '$(task.keep)/f101400a398097d4398cdb3eb5d1a7ca+118/workflow.json', + 'cwl.input.json': '$(task.keep)/f101400a398097d4398cdb3eb5d1a7ca+118/cwl.input.json' + }, + 'command': [u'cwltool', u'--no-container', u'--move-outputs', u'workflow.json', u'cwl.input.json'], + 'task.stdout': 'cwl.output.json'}]}, + 'runtime_constraints': { + 'min_scratch_mb_per_node': 2048, + 'min_cores_per_node': 1, + 'docker_image': 'arvados/jobs', + 'min_ram_mb_per_node': 1024 + }, + 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'}, + filters=[['repository', '=', 'arvados'], + ['script', '=', 'crunchrunner'], + ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'], + ['docker_image_locator', 'in docker', 'arvados/jobs']], + find_or_create=True) -- 2.30.2