8 from schema_salad.ref_resolver import Loader
10 if not os.getenv('ARVADOS_DEBUG'):
11 logging.getLogger('arvados.cwl-runner').setLevel(logging.WARN)
12 logging.getLogger('arvados.arv-run').setLevel(logging.WARN)
15 class TestContainer(unittest.TestCase):
17 # The test passes no builder.resources
18 # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
19 @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
20 def test_run(self, keepdocker):
21 runner = mock.MagicMock()
22 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
23 runner.ignore_docker_for_reuse = False
25 keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
26 runner.api.collections().get().execute.return_value = {
27 "portable_data_hash": "99999999999999999999999999999993+99"}
29 document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("draft-3")
35 "arguments": [{"valueFrom": "$(runtime.outdir)"}]
37 make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
38 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers", avsc_names=avsc_names,
39 basedir="", make_fs_access=make_fs_access, loader=Loader({}))
40 arvtool.formatgraph = None
41 for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_run",
42 make_fs_access=make_fs_access, tmpdir="/tmp"):
44 runner.api.container_requests().create.assert_called_with(
47 'HOME': '/var/spool/cwl',
51 'runtime_constraints': {
56 '/var/spool/cwl': {'kind': 'tmp'}
59 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
60 'output_path': '/var/spool/cwl',
61 'container_image': '99999999999999999999999999999993+99',
62 'command': ['ls', '/var/spool/cwl'],
63 'cwd': '/var/spool/cwl'
66 # The test passes some fields in builder.resources
67 # For the remaining fields, the defaults will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
68 @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
69 def test_resource_requirements(self, keepdocker):
70 runner = mock.MagicMock()
71 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
72 runner.ignore_docker_for_reuse = False
73 document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("draft-3")
75 keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
76 runner.api.collections().get().execute.return_value = {
77 "portable_data_hash": "99999999999999999999999999999993+99"}
83 "class": "ResourceRequirement",
90 make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
91 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers",
92 avsc_names=avsc_names, make_fs_access=make_fs_access,
94 arvtool.formatgraph = None
95 for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_resource_requirements",
96 make_fs_access=make_fs_access, tmpdir="/tmp"):
99 runner.api.container_requests().create.assert_called_with(
102 'HOME': '/var/spool/cwl',
105 'name': 'test_resource_requirements',
106 'runtime_constraints': {
111 '/var/spool/cwl': {'kind': 'tmp'}
113 'state': 'Committed',
114 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
115 'output_path': '/var/spool/cwl',
116 'container_image': '99999999999999999999999999999993+99',
118 'cwd': '/var/spool/cwl'
121 @mock.patch("arvados.collection.Collection")
122 def test_done(self, col):
123 api = mock.MagicMock()
125 runner = mock.MagicMock()
127 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
128 runner.num_retries = 0
129 runner.ignore_docker_for_reuse = False
131 col().open.return_value = []
132 api.collections().list().execute.side_effect = ({"items": []},
133 {"items": [{"manifest_text": "XYZ"}]})
135 arvjob = arvados_cwl.ArvadosContainer(runner)
136 arvjob.name = "testjob"
137 arvjob.builder = mock.MagicMock()
138 arvjob.output_callback = mock.MagicMock()
139 arvjob.collect_outputs = mock.MagicMock()
140 arvjob.successCodes = [0]
141 arvjob.outdir = "/var/spool/cwl"
145 "output": "99999999999999999999999999999993+99",
146 "log": "99999999999999999999999999999994+99",
147 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz",
151 api.collections().list.assert_has_calls([
153 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
154 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
155 ['name', '=', 'Output 9999999 of testjob']]),
156 mock.call().execute(num_retries=0),
157 mock.call(limit=1, filters=[['portable_data_hash', '=', '99999999999999999999999999999993+99']],
158 select=['manifest_text']),
159 mock.call().execute(num_retries=0)])
161 api.collections().create.assert_called_with(
162 ensure_unique_name=True,
163 body={'portable_data_hash': '99999999999999999999999999999993+99',
164 'manifest_text': 'XYZ',
165 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
166 'name': 'Output 9999999 of testjob'})
168 @mock.patch("arvados.collection.Collection")
169 def test_done_use_existing_collection(self, col):
170 api = mock.MagicMock()
172 runner = mock.MagicMock()
174 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
175 runner.num_retries = 0
177 col().open.return_value = []
178 api.collections().list().execute.side_effect = ({"items": [{"uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz2"}]},)
180 arvjob = arvados_cwl.ArvadosContainer(runner)
181 arvjob.name = "testjob"
182 arvjob.builder = mock.MagicMock()
183 arvjob.output_callback = mock.MagicMock()
184 arvjob.collect_outputs = mock.MagicMock()
185 arvjob.successCodes = [0]
186 arvjob.outdir = "/var/spool/cwl"
190 "output": "99999999999999999999999999999993+99",
191 "log": "99999999999999999999999999999994+99",
192 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz",
196 api.collections().list.assert_has_calls([
198 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
199 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
200 ['name', '=', 'Output 9999999 of testjob']]),
201 mock.call().execute(num_retries=0)])
203 self.assertFalse(api.collections().create.called)