Skip to content

Commit 047e69b

Browse files
authored
Merge pull request #981 from common-workflow-language/add_cwltool-requirements_inputfield
cwl:requirements needs cwlVersion >= v1.1
2 parents e5a2f80 + c16cd88 commit 047e69b

7 files changed

+82
-15
lines changed

cwltool/executors.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ def run_jobs(self,
5151
runtime_context # type: RuntimeContext
5252
): # type: (...) -> None
5353
""" Execute the jobs for the given Process. """
54-
pass
5554

5655
def execute(self,
5756
process, # type: Process
@@ -78,10 +77,22 @@ def execute(self,
7877

7978
job_reqs = None
8079
if "https://w3id.org/cwl/cwl#requirements" in job_order_object:
80+
if process.metadata["cwlVersion"] == 'v1.0':
81+
raise WorkflowException(
82+
"`cwl:requirements` in the input object is not part of CWL "
83+
"v1.0. You can adjust to use `cwltool:overrides` instead; or you "
84+
"can set the cwlVersion to v1.1.0-dev1 or greater and re-run with "
85+
"--enable-dev.")
8186
job_reqs = job_order_object["https://w3id.org/cwl/cwl#requirements"]
8287
elif ("cwl:defaults" in process.metadata
8388
and "https://w3id.org/cwl/cwl#requirements"
8489
in process.metadata["cwl:defaults"]):
90+
if process.metadata["cwlVersion"] == 'v1.0':
91+
raise WorkflowException(
92+
"`cwl:requirements` in the input object is not part of CWL "
93+
"v1.0. You can adjust to use `cwltool:overrides` instead; or you "
94+
"can set the cwlVersion to v1.1.0-dev1 or greater and re-run with "
95+
"--enable-dev.")
8596
job_reqs = process.metadata["cwl:defaults"]["https://w3id.org/cwl/cwl#requirements"]
8697
if job_reqs is not None:
8798
for req in job_reqs:
@@ -233,10 +244,11 @@ def run_job(self,
233244
while self.pending_jobs:
234245
with self.pending_jobs_lock:
235246
job = self.pending_jobs[0]
236-
if isinstance(job, JobBase) and \
247+
if isinstance(job, JobBase) \
248+
and \
237249
((self.allocated_ram + job.builder.resources["ram"])
238-
> self.max_ram or
239-
(self.allocated_cores + job.builder.resources["cores"])
250+
> self.max_ram
251+
or (self.allocated_cores + job.builder.resources["cores"])
240252
> self.max_cores):
241253
_logger.warning(
242254
'Job "%s" requested more resources (%s) than are '

cwltool/extensions.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ $graph:
5656
refScope: 0
5757

5858

59-
- type: record
60-
name: TimeLimit
59+
- name: TimeLimit
60+
type: record
6161
inVocab: false
6262
extends: cwl:ProcessRequirement
6363
doc: |
@@ -79,8 +79,8 @@ $graph:
7979
time limit. Negative time limits are an error.
8080
8181
82-
- type: record
83-
name: WorkReuse
82+
- name: WorkReuse
83+
type: record
8484
inVocab: false
8585
extends: cwl:ProcessRequirement
8686
doc: |
@@ -105,8 +105,8 @@ $graph:
105105
#default: true
106106

107107

108-
- type: record
109-
name: NetworkAccess
108+
- name: NetworkAccess
109+
type: record
110110
inVocab: false
111111
extends: cwl:ProcessRequirement
112112
doc: |

tests/override/env-tool_requirement_override_default.yaml renamed to tests/override/env-tool_cwl-requirement_override_default.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
in: "hello test env"
2-
cwl:tool: env-tool.cwl
2+
cwl:tool: env-tool_v1.1.0-dev1.cwl
33
cwl:requirements:
44
- class: EnvVarRequirement
55
envDef:
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
in: "hello test env"
2+
cwl:tool: env-tool.cwl
3+
cwl:requirements: # prefixed, private extension
4+
- class: EnvVarRequirement
5+
envDef:
6+
- envName: TEST_ENV
7+
envValue: $(inputs.in)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class: CommandLineTool
2+
cwlVersion: v1.1.0-dev1
3+
inputs:
4+
in: string
5+
outputs:
6+
value: string
7+
8+
baseCommand: ["/bin/bash", "-c", 'echo {\"value\": \"$TEST_ENV\"}']
9+
10+
stdout: cwl.output.json

tests/test_override.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pytest
66

77
from cwltool.main import main
8-
8+
from cwltool import load_tool
99
from .util import get_data, needs_docker
1010

1111
override_parameters = [
@@ -44,19 +44,57 @@
4444
get_data('tests/override/echo-job.yml')],
4545
{"out": "zing hello6\n"}
4646
),
47-
([get_data('tests/override/env-tool.cwl'),
48-
get_data('tests/override/env-tool_requirement_override.yaml')],
47+
(["--enable-dev", get_data('tests/override/env-tool_v1.1.0-dev1.cwl'),
48+
get_data('tests/override/env-tool_cwl-requirement_override.yaml')],
4949
{"value": "hello test env"}
5050
),
51-
([get_data('tests/override/env-tool_requirement_override_default.yaml')],
51+
(["--enable-dev",
52+
get_data('tests/override/env-tool_cwl-requirement_override_default.yaml')],
5253
{"value": "hello test env"}
5354
),
5455
]
5556

5657
@needs_docker
5758
@pytest.mark.parametrize('parameters,result', override_parameters)
5859
def test_overrides(parameters, result):
60+
load_tool.loaders = {}
5961
sio = StringIO()
6062

6163
assert main(parameters, stdout=sio) == 0
6264
assert json.loads(sio.getvalue()) == result
65+
66+
67+
failing_override_parameters = [
68+
([get_data('tests/override/env-tool.cwl'),
69+
get_data('tests/override/env-tool_cwl-requirement_override.yaml')],
70+
"`cwl:requirements` in the input object is not part of CWL v1.0. You can "
71+
"adjust to use `cwltool:overrides` instead; or you can set the cwlVersion to "
72+
"v1.1.0-dev1 or greater and re-run with --enable-dev."
73+
),
74+
([get_data('tests/override/env-tool_v1.1.0-dev1.cwl'),
75+
get_data('tests/override/env-tool_cwl-requirement_override.yaml')],
76+
"Version 'v1.1.0-dev1' is a development or deprecated version.\n"
77+
" Update your document to a stable version (v1.0) or use --enable-dev to "
78+
"enable support for development and deprecated versions."
79+
),
80+
([get_data('tests/override/env-tool_cwl-requirement_override_default_wrongver.yaml')],
81+
"`cwl:requirements` in the input object is not part of CWL v1.0. You can "
82+
"adjust to use `cwltool:overrides` instead; or you can set the cwlVersion to "
83+
"v1.1.0-dev1 or greater and re-run with --enable-dev."
84+
),
85+
([get_data('tests/override/env-tool_cwl-requirement_override_default.yaml')],
86+
"Version 'v1.1.0-dev1' is a development or deprecated version.\n"
87+
" Update your document to a stable version (v1.0) or use --enable-dev to "
88+
"enable support for development and deprecated versions."
89+
),
90+
]
91+
92+
@needs_docker
93+
@pytest.mark.parametrize('parameters,expected_error', failing_override_parameters)
94+
def test_overrides_fails(parameters, expected_error):
95+
load_tool.loaders = {}
96+
sio = StringIO()
97+
98+
assert main(parameters, stderr=sio) == 1
99+
stderr = sio.getvalue()
100+
assert expected_error in stderr, stderr

0 commit comments

Comments
 (0)