Merge branch 'master' into 1969-persistent-switch
[arvados.git] / services / api / test / functional / arvados / v1 / job_reuse_controller_test.rb
1 require 'test_helper'
2 load 'test/functional/arvados/v1/git_setup.rb'
3
4 class Arvados::V1::JobReuseControllerTest < ActionController::TestCase
5   fixtures :repositories, :users, :jobs, :links, :collections
6
7   # See git_setup.rb for the commit log for test.git.tar
8   include GitSetup
9
10   setup do
11     @controller = Arvados::V1::JobsController.new
12     authorize_with :active
13   end
14
15   test "reuse job with no_reuse=false" do
16     post :create, job: {
17       no_reuse: false,
18       script: "hash",
19       script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
20       repository: "foo",
21       script_parameters: {
22         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
23         an_integer: '1'
24       }
25     }
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']
31   end
32
33   test "reuse job with find_or_create=true" do
34     post :create, {
35       job: {
36         script: "hash",
37         script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
38         repository: "foo",
39         script_parameters: {
40           input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
41           an_integer: '1'
42         }
43       },
44       find_or_create: true
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']
51   end
52
53   test "do not reuse job because no_reuse=true" do
54     post :create, {
55       job: {
56         no_reuse: true,
57         script: "hash",
58         script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
59         repository: "foo",
60         script_parameters: {
61           input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
62           an_integer: '1'
63         }
64       }
65     }
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']
71   end
72
73   test "do not reuse job because find_or_create=false" do
74     post :create, {
75       job: {
76         script: "hash",
77         script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
78         repository: "foo",
79         script_parameters: {
80           input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
81           an_integer: '1'
82         }
83       },
84       find_or_create: false
85     }
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']
91   end
92
93   test "test_cannot_reuse_job_no_output" do
94     post :create, job: {
95       no_reuse: false,
96       script: "hash",
97       script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
98       repository: "foo",
99       script_parameters: {
100         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
101         an_integer: '2'
102       }
103     }
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']
108   end
109
110   test "test_reuse_job_range" do
111     post :create, job: {
112       no_reuse: false,
113       script: "hash",
114       minimum_script_version: "tag1",
115       script_version: "master",
116       repository: "foo",
117       script_parameters: {
118         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
119         an_integer: '1'
120       }
121     }
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']
127   end
128
129   test "cannot_reuse_job_no_minimum_given_so_must_use_specified_commit" do
130     post :create, job: {
131       no_reuse: false,
132       script: "hash",
133       script_version: "master",
134       repository: "foo",
135       script_parameters: {
136         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
137         an_integer: '1'
138       }
139     }
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']
145   end
146
147   test "test_cannot_reuse_job_different_input" do
148     post :create, job: {
149       no_reuse: false,
150       script: "hash",
151       script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
152       repository: "foo",
153       script_parameters: {
154         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
155         an_integer: '2'
156       }
157     }
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']
163   end
164
165   test "test_cannot_reuse_job_different_version" do
166     post :create, job: {
167       no_reuse: false,
168       script: "hash",
169       script_version: "master",
170       repository: "foo",
171       script_parameters: {
172         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
173         an_integer: '2'
174       }
175     }
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']
181   end
182
183   test "test_can_reuse_job_submitted_nondeterministic" do
184     post :create, job: {
185       no_reuse: false,
186       script: "hash",
187       script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
188       repository: "foo",
189       script_parameters: {
190         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
191         an_integer: '1'
192       },
193       nondeterministic: true
194     }
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']
200   end
201
202   test "test_cannot_reuse_job_past_nondeterministic" do
203     post :create, job: {
204       no_reuse: false,
205       script: "hash2",
206       script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
207       repository: "foo",
208       script_parameters: {
209         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
210         an_integer: '1'
211       }
212     }
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']
218   end
219
220   test "test_cannot_reuse_job_no_permission" do
221     authorize_with :spectator
222     post :create, job: {
223       no_reuse: false,
224       script: "hash",
225       script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
226       repository: "foo",
227       script_parameters: {
228         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
229         an_integer: '1'
230       }
231     }
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']
237   end
238
239   test "test_cannot_reuse_job_excluded" do
240     post :create, job: {
241       no_reuse: false,
242       script: "hash",
243       minimum_script_version: "31ce37fe365b3dc204300a3e4c396ad333ed0556",
244       script_version: "master",
245       repository: "foo",
246       exclude_script_versions: ["tag1"],
247       script_parameters: {
248         input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
249         an_integer: '1'
250       }
251     }
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']
257   end
258
259   test "cannot reuse job with find_or_create but excluded version" do
260     post :create, {
261       job: {
262         script: "hash",
263         script_version: "master",
264         repository: "foo",
265         script_parameters: {
266           input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
267           an_integer: '1'
268         }
269       },
270       find_or_create: true,
271       minimum_script_version: "31ce37fe365b3dc204300a3e4c396ad333ed0556",
272       exclude_script_versions: ["tag1"],
273     }
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']
279   end
280
281 end