Fix merge conflict. refs #8766
[arvados.git] / sdk / cwl / tests / test_job.py
1 import unittest
2 import mock
3 import arvados_cwl
4
5 class TestJob(unittest.TestCase):
6
7     # The test passes no builder.resources
8     # Hence the default resources will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
9     def test_run(self):
10         runner = mock.MagicMock()
11         runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
12         tool = {
13             "inputs": [],
14             "outputs": [],
15             "baseCommand": "ls"
16         }
17         arvtool = arvados_cwl.ArvadosCommandTool(runner, tool)
18         arvtool.formatgraph = None
19         for j in arvtool.job({}, "", mock.MagicMock()):
20             j.run()
21         runner.api.jobs().create.assert_called_with(body={
22             'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
23             'runtime_constraints': {},
24             'script_parameters': {
25                 'tasks': [{
26                     'task.env': {'TMPDIR': '$(task.tmpdir)'},
27                     'command': ['ls']
28                 }],
29                 'crunchrunner': arvados_cwl.crunchrunner_pdh + '/crunchrunner'
30             },
31             'script_version': 'master',
32             'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
33             'repository': 'arvados',
34             'script': 'crunchrunner',
35             'runtime_constraints': {
36                 'min_cores_per_node': 1,
37                 'min_ram_mb_per_node': 1024,
38                 'min_scratch_mb_per_node': 2048 # tmpdirSize + outdirSize
39             }
40         }, find_or_create=True)
41
42     # The test passes some fields in builder.resources
43     # For the remaining fields, the defaults will apply: {'cores': 1, 'ram': 1024, 'outdirSize': 1024, 'tmpdirSize': 1024}
44     def test_resource_requirements(self):
45         runner = mock.MagicMock()
46         runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
47         tool = {
48             "inputs": [],
49             "outputs": [],
50             "hints": [{
51                 "class": "ResourceRequirement",
52                 "coresMin": 3,
53                 "ramMin": 3000,
54                 "tmpdirMin": 4000
55             }],
56             "baseCommand": "ls"
57         }
58         arvtool = arvados_cwl.ArvadosCommandTool(runner, tool)
59         arvtool.formatgraph = None
60         for j in arvtool.job({}, "", mock.MagicMock()):
61             j.run()
62         runner.api.jobs().create.assert_called_with(body={
63             'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
64             'runtime_constraints': {},
65             'script_parameters': {
66                 'tasks': [{
67                     'task.env': {'TMPDIR': '$(task.tmpdir)'},
68                     'command': ['ls']
69                 }],
70                 'crunchrunner': arvados_cwl.crunchrunner_pdh + '/crunchrunner'
71             },
72             'script_version': 'master',
73             'minimum_script_version': '9e5b98e8f5f4727856b53447191f9c06e3da2ba6',
74             'repository': 'arvados',
75             'script': 'crunchrunner',
76             'runtime_constraints': {
77                 'min_cores_per_node': 3,
78                 'min_ram_mb_per_node': 3000,
79                 'min_scratch_mb_per_node': 5024 # tmpdirSize + outdirSize
80             }
81         }, find_or_create=True)
82
83     @mock.patch("arvados.collection.Collection")
84     def test_done(self, col):
85         api = mock.MagicMock()
86
87         runner = mock.MagicMock()
88         runner.api = api
89         runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
90         runner.num_retries = 0
91
92         col().open.return_value = []
93         api.collections().list().execute.side_effect = ({"items": []},
94                                                         {"items": [{"manifest_text": "XYZ"}]})
95
96         arvjob = arvados_cwl.ArvadosJob(runner)
97         arvjob.name = "testjob"
98         arvjob.builder = mock.MagicMock()
99         arvjob.output_callback = mock.MagicMock()
100         arvjob.collect_outputs = mock.MagicMock()
101
102         arvjob.done({
103             "state": "Complete",
104             "output": "99999999999999999999999999999993+99",
105             "log": "99999999999999999999999999999994+99",
106             "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
107         })
108
109         api.collections().list.assert_has_calls([
110             mock.call(),
111             mock.call(filters=[['owner_uuid', '=', 'zzzzz-8i9sb-zzzzzzzzzzzzzzz'],
112                           ['portable_data_hash', '=', '99999999999999999999999999999993+99'],
113                           ['name', '=', 'Output 9999999 of testjob']]),
114             mock.call().execute(num_retries=0),
115             mock.call(limit=1, filters=[['portable_data_hash', '=', '99999999999999999999999999999993+99']],
116                  select=['manifest_text']),
117             mock.call().execute(num_retries=0)])
118
119         api.collections().create.assert_called_with(
120             ensure_unique_name=True,
121             body={'portable_data_hash': '99999999999999999999999999999993+99',
122                   'manifest_text': 'XYZ',
123                   'owner_uuid': 'zzzzz-8i9sb-zzzzzzzzzzzzzzz',
124                   'name': 'Output 9999999 of testjob'})
125
126     @mock.patch("arvados.collection.Collection")
127     def test_done_use_existing_collection(self, col):
128         api = mock.MagicMock()
129
130         runner = mock.MagicMock()
131         runner.api = api
132         runner.project_uuid = "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
133         runner.num_retries = 0
134
135         col().open.return_value = []
136         api.collections().list().execute.side_effect = ({"items": [{"uuid": "zzzzz-4zz18-zzzzzzzzzzzzzz2"}]},)
137
138         arvjob = arvados_cwl.ArvadosJob(runner)
139         arvjob.name = "testjob"
140         arvjob.builder = mock.MagicMock()
141         arvjob.output_callback = mock.MagicMock()
142         arvjob.collect_outputs = mock.MagicMock()
143
144         arvjob.done({
145             "state": "Complete",
146             "output": "99999999999999999999999999999993+99",
147             "log": "99999999999999999999999999999994+99",
148             "uuid": "zzzzz-8i9sb-zzzzzzzzzzzzzzz"
149         })
150
151         api.collections().list.assert_has_calls([
152             mock.call(),
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
158         self.assertFalse(api.collections().create.called)