9 from schema_salad.ref_resolver import Loader
11 if not os.getenv('ARVADOS_DEBUG'):
12 logging.getLogger('arvados.cwl-runner').setLevel(logging.WARN)
13 logging.getLogger('arvados.arv-run').setLevel(logging.WARN)
16 class TestContainer(unittest.TestCase):
18 # The test passes no builder.resources
19 # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
20 @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
21 def test_run(self, keepdocker):
22 runner = mock.MagicMock()
23 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
24 runner.ignore_docker_for_reuse = False
26 keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
27 runner.api.collections().get().execute.return_value = {
28 "portable_data_hash": "99999999999999999999999999999993+99"}
30 document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("draft-3")
36 "arguments": [{"valueFrom": "$(runtime.outdir)"}]
38 make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
39 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers", avsc_names=avsc_names,
40 basedir="", make_fs_access=make_fs_access, loader=Loader({}))
41 arvtool.formatgraph = None
42 for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_run",
43 make_fs_access=make_fs_access, tmpdir="/tmp"):
45 runner.api.container_requests().create.assert_called_with(
48 'HOME': '/var/spool/cwl',
52 'runtime_constraints': {
57 '/var/spool/cwl': {'kind': 'tmp'}
60 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
61 'output_path': '/var/spool/cwl',
62 'container_image': '99999999999999999999999999999993+99',
63 'command': ['ls', '/var/spool/cwl'],
64 'cwd': '/var/spool/cwl'
67 # The test passes some fields in builder.resources
68 # For the remaining fields, the defaults will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
69 @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
70 def test_resource_requirements(self, keepdocker):
71 runner = mock.MagicMock()
72 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
73 runner.ignore_docker_for_reuse = False
74 document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("draft-3")
76 keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
77 runner.api.collections().get().execute.return_value = {
78 "portable_data_hash": "99999999999999999999999999999993+99"}
84 "class": "ResourceRequirement",
91 make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
92 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers",
93 avsc_names=avsc_names, make_fs_access=make_fs_access,
95 arvtool.formatgraph = None
96 for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_resource_requirements",
97 make_fs_access=make_fs_access, tmpdir="/tmp"):
100 runner.api.container_requests().create.assert_called_with(
103 'HOME': '/var/spool/cwl',
106 'name': 'test_resource_requirements',
107 'runtime_constraints': {
112 '/var/spool/cwl': {'kind': 'tmp'}
114 'state': 'Committed',
115 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
116 'output_path': '/var/spool/cwl',
117 'container_image': '99999999999999999999999999999993+99',
119 'cwd': '/var/spool/cwl'
122 @mock.patch("arvados.collection.Collection")
123 def test_done(self, col):
124 api = mock.MagicMock()
126 runner = mock.MagicMock()
128 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
129 runner.num_retries = 0
130 runner.ignore_docker_for_reuse = False
132 col().open.return_value = []
133 api.collections().list().execute.side_effect = ({"items": []},
134 {"items": [{"manifest_text": "XYZ"}]})
136 arvjob = arvados_cwl.ArvadosContainer(runner)
137 arvjob.name = "testjob"
138 arvjob.builder = mock.MagicMock()
139 arvjob.output_callback = mock.MagicMock()
140 arvjob.collect_outputs = mock.MagicMock()
141 arvjob.successCodes = [0]
142 arvjob.outdir = "/var/spool/cwl"
146 "output": "99999999999999999999999999999993+99",
147 "log": "99999999999999999999999999999994+99",
148 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz",
152 api.collections().list.assert_has_calls([
154 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
155 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
156 ['name', '=', 'Output 9999999 of testjob']]),
157 mock.call().execute(num_retries=0),
158 mock.call(limit=1, filters=[['portable_data_hash', '=', '99999999999999999999999999999993+99']],
159 select=['manifest_text']),
160 mock.call().execute(num_retries=0)])
162 api.collections().create.assert_called_with(
163 ensure_unique_name=True,
164 body={'portable_data_hash': '99999999999999999999999999999993+99',
165 'manifest_text': 'XYZ',
166 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
167 'name': 'Output 9999999 of testjob'})
169 @mock.patch("arvados.collection.Collection")
170 def test_done_use_existing_collection(self, col):
171 api = mock.MagicMock()
173 runner = mock.MagicMock()
175 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
176 runner.num_retries = 0
178 col().open.return_value = []
179 api.collections().list().execute.side_effect = ({"items": [{"uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz2"}]},)
181 arvjob = arvados_cwl.ArvadosContainer(runner)
182 arvjob.name = "testjob"
183 arvjob.builder = mock.MagicMock()
184 arvjob.output_callback = mock.MagicMock()
185 arvjob.collect_outputs = mock.MagicMock()
186 arvjob.successCodes = [0]
187 arvjob.outdir = "/var/spool/cwl"
191 "output": "99999999999999999999999999999993+99",
192 "log": "99999999999999999999999999999994+99",
193 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz",
197 api.collections().list.assert_has_calls([
199 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
200 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
201 ['name', '=', 'Output 9999999 of testjob']]),
202 mock.call().execute(num_retries=0)])
204 self.assertFalse(api.collections().create.called)