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']
282 'repository' => ['=', 'foo'],
283 'script' => ['=', 'hash'],
284 'script_version' => ['in git', 'master'],
285 'docker_image_locator' => ['=', nil],
288 def filters_from_hash(hash)
289 hash.each_pair.map { |name, filter| [name] + filter }
292 test "can reuse a Job based on filters" do
293 filter_h = BASE_FILTERS.
294 merge('script_version' => ['in git', 'tag1'])
298 script_version: "master",
301 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
305 filters: filters_from_hash(filter_h),
306 find_or_create: true,
308 assert_response :success
309 assert_not_nil assigns(:object)
310 new_job = JSON.parse(@response.body)
311 assert_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
312 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
315 test "can not reuse a Job based on filters" do
316 filter_a = filters_from_hash(BASE_FILTERS.reject { |k| k == 'script_version' })
317 filter_a += [["script_version", "in git",
318 "31ce37fe365b3dc204300a3e4c396ad333ed0556"],
319 ["script_version", "not in git", ["tag1"]]]
323 script_version: "master",
326 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
331 find_or_create: true,
333 assert_response :success
334 assert_not_nil assigns(:object)
335 new_job = JSON.parse(@response.body)
336 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
337 assert_equal '077ba2ad3ea24a929091a9e6ce545c93199b8e57', new_job['script_version']
340 test "can not reuse a Job based on arbitrary filters" do
341 filter_h = BASE_FILTERS.
342 merge("created_at" => ["<", "2010-01-01T00:00:00Z"])
346 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
349 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
353 filters: filters_from_hash(filter_h),
354 find_or_create: true,
356 assert_response :success
357 assert_not_nil assigns(:object)
358 new_job = JSON.parse(@response.body)
359 assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqqq', new_job['uuid']
360 assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
363 test "can reuse a Job with a Docker image" do
367 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
370 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
373 runtime_constraints: {
374 docker_image: 'arvados/apitestfixture',
377 find_or_create: true,
379 assert_response :success
380 new_job = assigns(:object)
381 assert_not_nil new_job
382 target_job = jobs(:previous_docker_job_run)
383 [:uuid, :script_version, :docker_image_locator].each do |attr|
384 assert_equal(target_job.send(attr), new_job.send(attr))
388 test "can reuse a Job with a Docker image hash filter" do
389 filter_h = BASE_FILTERS.
390 merge("script_version" =>
391 ["=", "4fe459abe02d9b365932b8f5dc419439ab4e2577"],
392 "docker_image_locator" =>
393 ["in docker", links(:docker_image_collection_hash).name])
397 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
400 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
404 filters: filters_from_hash(filter_h),
405 find_or_create: true,
407 assert_response :success
408 new_job = assigns(:object)
409 assert_not_nil new_job
410 target_job = jobs(:previous_docker_job_run)
411 [:uuid, :script_version, :docker_image_locator].each do |attr|
412 assert_equal(target_job.send(attr), new_job.send(attr))
416 test "new job with unknown Docker image filter" do
417 filter_h = BASE_FILTERS.
418 merge("docker_image_locator" => ["in docker", "_nonesuchname_"])
422 script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
425 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
429 filters: filters_from_hash(filter_h),
430 find_or_create: true,
432 assert_response :success
433 new_job = assigns(:object)
434 assert_not_nil new_job
435 assert_not_equal(jobs(:previous_docker_job_run).uuid, new_job.uuid)
438 ["repository", "script"].each do |skip_key|
439 test "missing #{skip_key} filter raises an error" do
440 filter_a = filters_from_hash(BASE_FILTERS.reject { |k| k == skip_key })
444 script_version: "master",
447 input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
452 find_or_create: true,
454 assert_includes(405..599, @response.code.to_i,
455 "bad status code with missing #{skip_key} filter")