9 if not os.getenv('ARVADOS_DEBUG'):
10 logging.getLogger('arvados.cwl-runner').setLevel(logging.WARN)
11 logging.getLogger('arvados.arv-run').setLevel(logging.WARN)
14 class TestContainer(unittest.TestCase):
16 # The test passes no builder.resources
17 # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
18 @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
19 def test_run(self, keepdocker):
20 runner = mock.MagicMock()
21 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
22 runner.ignore_docker_for_reuse = False
24 keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
25 runner.api.collections().get().execute.return_value = {
26 "portable_data_hash": "99999999999999999999999999999993+99"}
28 document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("draft-3")
34 "arguments": [{"valueFrom": "$(runtime.outdir)"}]
36 make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
37 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers", avsc_names=avsc_names,
38 basedir="", make_fs_access=make_fs_access)
39 arvtool.formatgraph = None
40 for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_run",
41 make_fs_access=make_fs_access, tmpdir="/tmp"):
43 runner.api.container_requests().create.assert_called_with(
46 'HOME': '/var/spool/cwl',
50 'runtime_constraints': {
55 '/var/spool/cwl': {'kind': 'tmp'}
58 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
59 'output_path': '/var/spool/cwl',
60 'container_image': '99999999999999999999999999999993+99',
61 'command': ['ls', '/var/spool/cwl'],
62 'cwd': '/var/spool/cwl'
65 # The test passes some fields in builder.resources
66 # For the remaining fields, the defaults will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
67 @mock.patch("arvados.commands.keepdocker.list_images_in_arv")
68 def test_resource_requirements(self, keepdocker):
69 runner = mock.MagicMock()
70 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
71 runner.ignore_docker_for_reuse = False
72 document_loader, avsc_names, schema_metadata, metaschema_loader = cwltool.process.get_schema("draft-3")
74 keepdocker.return_value = [("zzzzz-4zz18-zzzzzzzzzzzzzz3", "")]
75 runner.api.collections().get().execute.return_value = {
76 "portable_data_hash": "99999999999999999999999999999993+99"}
82 "class": "ResourceRequirement",
89 make_fs_access=functools.partial(arvados_cwl.CollectionFsAccess, api_client=runner.api)
90 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool, work_api="containers",
91 avsc_names=avsc_names, make_fs_access=make_fs_access)
92 arvtool.formatgraph = None
93 for j in arvtool.job({}, mock.MagicMock(), basedir="", name="test_resource_requirements",
94 make_fs_access=make_fs_access, tmpdir="/tmp"):
97 runner.api.container_requests().create.assert_called_with(
100 'HOME': '/var/spool/cwl',
103 'name': 'test_resource_requirements',
104 'runtime_constraints': {
109 '/var/spool/cwl': {'kind': 'tmp'}
111 'state': 'Committed',
112 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
113 'output_path': '/var/spool/cwl',
114 'container_image': '99999999999999999999999999999993+99',
116 'cwd': '/var/spool/cwl'
119 @mock.patch("arvados.collection.Collection")
120 def test_done(self, col):
121 api = mock.MagicMock()
123 runner = mock.MagicMock()
125 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
126 runner.num_retries = 0
127 runner.ignore_docker_for_reuse = False
129 col().open.return_value = []
130 api.collections().list().execute.side_effect = ({"items": []},
131 {"items": [{"manifest_text": "XYZ"}]})
133 arvjob = arvados_cwl.ArvadosContainer(runner)
134 arvjob.name = "testjob"
135 arvjob.builder = mock.MagicMock()
136 arvjob.output_callback = mock.MagicMock()
137 arvjob.collect_outputs = mock.MagicMock()
138 arvjob.successCodes = [0]
139 arvjob.outdir = "/var/spool/cwl"
143 "output": "99999999999999999999999999999993+99",
144 "log": "99999999999999999999999999999994+99",
145 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz",
149 api.collections().list.assert_has_calls([
151 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
152 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
153 ['name', '=', 'Output 9999999 of testjob']]),
154 mock.call().execute(num_retries=0),
155 mock.call(limit=1, filters=[['portable_data_hash', '=', '99999999999999999999999999999993+99']],
156 select=['manifest_text']),
157 mock.call().execute(num_retries=0)])
159 api.collections().create.assert_called_with(
160 ensure_unique_name=True,
161 body={'portable_data_hash': '99999999999999999999999999999993+99',
162 'manifest_text': 'XYZ',
163 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
164 'name': 'Output 9999999 of testjob'})
166 @mock.patch("arvados.collection.Collection")
167 def test_done_use_existing_collection(self, col):
168 api = mock.MagicMock()
170 runner = mock.MagicMock()
172 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
173 runner.num_retries = 0
175 col().open.return_value = []
176 api.collections().list().execute.side_effect = ({"items": [{"uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz2"}]},)
178 arvjob = arvados_cwl.ArvadosContainer(runner)
179 arvjob.name = "testjob"
180 arvjob.builder = mock.MagicMock()
181 arvjob.output_callback = mock.MagicMock()
182 arvjob.collect_outputs = mock.MagicMock()
183 arvjob.successCodes = [0]
184 arvjob.outdir = "/var/spool/cwl"
188 "output": "99999999999999999999999999999993+99",
189 "log": "99999999999999999999999999999994+99",
190 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz",
194 api.collections().list.assert_has_calls([
196 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
197 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
198 ['name', '=', 'Output 9999999 of testjob']]),
199 mock.call().execute(num_retries=0)])
201 self.assertFalse(api.collections().create.called)