5 class TestJob(unittest.TestCase):
7 # The test passes no builder.resources
8 # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
10 runner = mock.MagicMock()
11 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
12 runner.ignore_docker_for_reuse = False
19 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool)
20 arvtool.formatgraph = None
21 for j in arvtool.job({}, "", mock.MagicMock()):
23 runner.api.jobs().create.assert_called_with(
25 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
26 'runtime_constraints': {},
27 'script_parameters': {
29 'task.env': {'TMPDIR': '$(task.tmpdir)'},
33 'script_version': 'master',
34 'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
35 'repository': 'arvados',
36 'script': 'crunchrunner',
37 'runtime_constraints': {
38 'docker_image': 'arvados/jobs',
39 'min_cores_per_node': 1,
40 'min_ram_mb_per_node': 1024,
41 'min_scratch_mb_per_node': 2048 # tmpdirSize + outdirSize
45 filters=[['repository', '=', 'arvados'],
46 ['script', '=', 'crunchrunner'],
47 ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'],
48 ['docker_image_locator', 'in docker', 'arvados/jobs']]
51 # The test passes some fields in builder.resources
52 # For the remaining fields, the defaults will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
53 def test_resource_requirements(self):
54 runner = mock.MagicMock()
55 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
56 runner.ignore_docker_for_reuse = False
62 "class": "ResourceRequirement",
69 arvtool = arvados_cwl.ArvadosCommandTool(runner, tool)
70 arvtool.formatgraph = None
71 for j in arvtool.job({}, "", mock.MagicMock()):
73 runner.api.jobs().create.assert_called_with(
75 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
76 'runtime_constraints': {},
77 'script_parameters': {
79 'task.env': {'TMPDIR': '$(task.tmpdir)'},
83 'script_version': 'master',
84 'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
85 'repository': 'arvados',
86 'script': 'crunchrunner',
87 'runtime_constraints': {
88 'docker_image': 'arvados/jobs',
89 'min_cores_per_node': 3,
90 'min_ram_mb_per_node': 3000,
91 'min_scratch_mb_per_node': 5024 # tmpdirSize + outdirSize
95 filters=[['repository', '=', 'arvados'],
96 ['script', '=', 'crunchrunner'],
97 ['script_version', 'in git', '9e5b98e8f5f4727856b53447191f9c06e3da2ba6'],
98 ['docker_image_locator', 'in docker', 'arvados/jobs']])
100 @mock.patch("arvados.collection.Collection")
101 def test_done(self, col):
102 api = mock.MagicMock()
104 runner = mock.MagicMock()
106 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
107 runner.num_retries = 0
108 runner.ignore_docker_for_reuse = False
110 col().open.return_value = []
111 api.collections().list().execute.side_effect = ({"items": []},
112 {"items": [{"manifest_text": "XYZ"}]})
114 arvjob = arvados_cwl.ArvadosJob(runner)
115 arvjob.name = "testjob"
116 arvjob.builder = mock.MagicMock()
117 arvjob.output_callback = mock.MagicMock()
118 arvjob.collect_outputs = mock.MagicMock()
122 "output": "99999999999999999999999999999993+99",
123 "log": "99999999999999999999999999999994+99",
124 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
127 api.collections().list.assert_has_calls([
129 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
130 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
131 ['name', '=', 'Output 9999999 of testjob']]),
132 mock.call().execute(num_retries=0),
133 mock.call(limit=1, filters=[['portable_data_hash', '=', '99999999999999999999999999999993+99']],
134 select=['manifest_text']),
135 mock.call().execute(num_retries=0)])
137 api.collections().create.assert_called_with(
138 ensure_unique_name=True,
139 body={'portable_data_hash': '99999999999999999999999999999993+99',
140 'manifest_text': 'XYZ',
141 'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
142 'name': 'Output 9999999 of testjob'})
144 @mock.patch("arvados.collection.Collection")
145 def test_done_use_existing_collection(self, col):
146 api = mock.MagicMock()
148 runner = mock.MagicMock()
150 runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
151 runner.num_retries = 0
153 col().open.return_value = []
154 api.collections().list().execute.side_effect = ({"items": [{"uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz2"}]},)
156 arvjob = arvados_cwl.ArvadosJob(runner)
157 arvjob.name = "testjob"
158 arvjob.builder = mock.MagicMock()
159 arvjob.output_callback = mock.MagicMock()
160 arvjob.collect_outputs = mock.MagicMock()
164 "output": "99999999999999999999999999999993+99",
165 "log": "99999999999999999999999999999994+99",
166 "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
169 api.collections().list.assert_has_calls([
171 mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
172 ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
173 ['name', '=', 'Output 9999999 of testjob']]),
174 mock.call().execute(num_retries=0)])
176 self.assertFalse(api.collections().create.called)