2 load 'test/functional/arvados/v1/git_setup.rb'
4 class Arvados::V1::JobReuseControllerTest < ActionController::TestCase
5 fixtures :repositories, :users, :jobs, :links, :collections
7 # See git_setup.rb for the commit log for test.git.tar
11 @controller = Arvados::V1::JobsController.new
12 authorize_with :active
15 test "reuse job with no_reuse=false" do
19 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
22 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
26 assert_response :success
27 assert_not_nil assigns(:object)
28 new_job = JSON.parse(@response.body)
29 assert_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
30 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
33 test "reuse job with find_or_create=true" do
37 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
40 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
46 assert_response :success
47 assert_not_nil assigns(:object)
48 new_job = JSON.parse(@response.body)
49 assert_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
50 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
53 test "do not reuse job because no_reuse=true" do
58 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
61 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
66 assert_response :success
67 assert_not_nil assigns(:object)
68 new_job = JSON.parse(@response.body)
69 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
70 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
73 test "do not reuse job because find_or_create=false" do
77 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
80 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
86 assert_response :success
87 assert_not_nil assigns(:object)
88 new_job = JSON.parse(@response.body)
89 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
90 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
93 test "test_cannot_reuse_job_no_output" do
97 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
100 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
104 assert_response :success
105 assert_not_nil assigns(:object)
106 new_job = JSON.parse(@response.body)
107 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykppp', new_job['uuid']
110 test "test_reuse_job_range" do
114 minimum_script_version: "tag1",
115 script_version: "master",
118 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
122 assert_response :success
123 assert_not_nil assigns(:object)
124 new_job = JSON.parse(@response.body)
125 assert_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
126 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
129 test "cannot_reuse_job_no_minimum_given_so_must_use_specified_commit" do
133 script_version: "master",
136 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
140 assert_response :success
141 assert_not_nil assigns(:object)
142 new_job = JSON.parse(@response.body)
143 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
144 assert_equal '077ba2ad3ea24a929091a9e6ce545c93199b8e57', new_job['script_version']
147 test "test_cannot_reuse_job_different_input" do
151 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
154 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
158 assert_response :success
159 assert_not_nil assigns(:object)
160 new_job = JSON.parse(@response.body)
161 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
162 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
165 test "test_cannot_reuse_job_different_version" do
169 script_version: "master",
172 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
176 assert_response :success
177 assert_not_nil assigns(:object)
178 new_job = JSON.parse(@response.body)
179 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
180 assert_equal '077ba2ad3ea24a929091a9e6ce545c93199b8e57', new_job['script_version']
183 test "test_can_reuse_job_submitted_nondeterministic" do
187 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
190 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
193 nondeterministic: true
195 assert_response :success
196 assert_not_nil assigns(:object)
197 new_job = JSON.parse(@response.body)
198 assert_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
199 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
202 test "test_cannot_reuse_job_past_nondeterministic" do
206 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
209 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
213 assert_response :success
214 assert_not_nil assigns(:object)
215 new_job = JSON.parse(@response.body)
216 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykyyy', new_job['uuid']
217 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
220 test "test_cannot_reuse_job_no_permission" do
221 authorize_with :spectator
225 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
228 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
232 assert_response :success
233 assert_not_nil assigns(:object)
234 new_job = JSON.parse(@response.body)
235 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
236 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
239 test "test_cannot_reuse_job_excluded" do
243 minimum_script_version: "31ce37fe365b3dc204300a3e4c396ad333ed0556",
244 script_version: "master",
246 exclude_script_versions: ["tag1"],
248 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
252 assert_response :success
253 assert_not_nil assigns(:object)
254 new_job = JSON.parse(@response.body)
255 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
256 assert_equal '077ba2ad3ea24a929091a9e6ce545c93199b8e57', new_job['script_version']
259 test "cannot reuse job with find_or_create but excluded version" do
263 script_version: "master",
266 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
270 find_or_create: true,
271 minimum_script_version: "31ce37fe365b3dc204300a3e4c396ad333ed0556",
272 exclude_script_versions: ["tag1"],
274 assert_response :success
275 assert_not_nil assigns(:object)
276 new_job = JSON.parse(@response.body)
277 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
278 assert_equal '077ba2ad3ea24a929091a9e6ce545c93199b8e57', new_job['script_version']
281 test "can reuse a Job based on filters" do
285 script_version: "master",
288 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
292 filters: [["script_version", "in range", "tag1"]],
293 find_or_create: true,
295 assert_response :success
296 assert_not_nil assigns(:object)
297 new_job = JSON.parse(@response.body)
298 assert_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
299 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
302 test "can not reuse a Job based on filters" do
306 script_version: "master",
309 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
313 filters: [["script_version", "in range",
314 "31ce37fe365b3dc204300a3e4c396ad333ed0556"],
315 ["script_version", "not in", ["tag1"]]],
316 find_or_create: true,
318 assert_response :success
319 assert_not_nil assigns(:object)
320 new_job = JSON.parse(@response.body)
321 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
322 assert_equal '077ba2ad3ea24a929091a9e6ce545c93199b8e57', new_job['script_version']
325 test "can not reuse a Job based on arbitrary filters" do
329 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
332 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
336 filters: [["created_at", "<", "2010-01-01T00:00:00Z"]],
337 find_or_create: true,
339 assert_response :success
340 assert_not_nil assigns(:object)
341 new_job = JSON.parse(@response.body)
342 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
343 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
346 test "can reuse a Job with a Docker image" do
350 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
353 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
356 runtime_constraints: {
357 docker_image: 'arvados/apitestfixture',
360 find_or_create: true,
362 assert_response :success
363 new_job = assigns(:object)
364 assert_not_nil new_job
365 target_job = jobs(:previous_docker_job_run)
366 [:uuid, :script_version, :docker_image_locator].each do |attr|
367 assert_equal(target_job.send(attr), new_job.send(attr))
371 test "can reuse a Job with a Docker image hash filter" do
375 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
378 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
382 filters: [["docker_image_locator", "in range",
383 links(:docker_image_collection_hash).name]],
384 find_or_create: true,
386 assert_response :success
387 new_job = assigns(:object)
388 assert_not_nil new_job
389 target_job = jobs(:previous_docker_job_run)
390 [:uuid, :script_version, :docker_image_locator].each do |attr|
391 assert_equal(target_job.send(attr), new_job.send(attr))
395 test "new job with unknown Docker image filter" do
399 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
402 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
406 filters: [["docker_image_locator", "in range", "_nonexistentname_"]],
407 find_or_create: true,
409 assert_response :success
410 new_job = assigns(:object)
411 assert_not_nil new_job
412 assert_not_equal(jobs(:previous_docker_job_run).uuid, new_job.uuid)