Merge branch '9353-retry-http-error' closes #9353
[arvados.git] / services / api / test / unit / container_request_test.rb
1 require 'test_helper'
2
3 class ContainerRequestTest < ActiveSupport::TestCase
4   def check_illegal_modify c
5       assert_raises(ActiveRecord::RecordInvalid) do
6         c.reload
7         c.command = ["echo", "bar"]
8         c.save!
9       end
10
11       assert_raises(ActiveRecord::RecordInvalid) do
12         c.reload
13         c.container_image = "img2"
14         c.save!
15       end
16
17       assert_raises(ActiveRecord::RecordInvalid) do
18         c.reload
19         c.cwd = "/tmp2"
20         c.save!
21       end
22
23       assert_raises(ActiveRecord::RecordInvalid) do
24         c.reload
25         c.environment = {"FOO" => "BAR"}
26         c.save!
27       end
28
29       assert_raises(ActiveRecord::RecordInvalid) do
30         c.reload
31         c.mounts = {"FOO" => "BAR"}
32         c.save!
33       end
34
35       assert_raises(ActiveRecord::RecordInvalid) do
36         c.reload
37         c.output_path = "/tmp3"
38         c.save!
39       end
40
41       assert_raises(ActiveRecord::RecordInvalid) do
42         c.reload
43         c.runtime_constraints = {"FOO" => "BAR"}
44         c.save!
45       end
46
47       assert_raises(ActiveRecord::RecordInvalid) do
48         c.reload
49         c.name = "baz"
50         c.save!
51       end
52
53       assert_raises(ActiveRecord::RecordInvalid) do
54         c.reload
55         c.description = "baz"
56         c.save!
57       end
58
59   end
60
61   def check_bogus_states c
62       assert_raises(ActiveRecord::RecordInvalid) do
63         c.reload
64         c.state = nil
65         c.save!
66       end
67
68       assert_raises(ActiveRecord::RecordInvalid) do
69         c.reload
70         c.state = "Flubber"
71         c.save!
72       end
73   end
74
75   test "Container request create" do
76     set_user_from_auth :active_trustedclient
77     cr = ContainerRequest.new
78     cr.command = ["echo", "foo"]
79     cr.container_image = "img"
80     cr.cwd = "/tmp"
81     cr.environment = {}
82     cr.mounts = {"BAR" => "FOO"}
83     cr.output_path = "/tmpout"
84     cr.runtime_constraints = {}
85     cr.name = "foo"
86     cr.description = "bar"
87     cr.save!
88
89     assert_nil cr.container_uuid
90     assert_nil cr.priority
91
92     check_bogus_states cr
93
94     cr.reload
95     cr.command = ["echo", "foo3"]
96     cr.container_image = "img3"
97     cr.cwd = "/tmp3"
98     cr.environment = {"BUP" => "BOP"}
99     cr.mounts = {"BAR" => "BAZ"}
100     cr.output_path = "/tmp4"
101     cr.priority = 2
102     cr.runtime_constraints = {"X" => "Y"}
103     cr.name = "foo3"
104     cr.description = "bar3"
105     cr.save!
106
107     assert_nil cr.container_uuid
108   end
109
110   test "Container request priority must be non-nil" do
111     set_user_from_auth :active_trustedclient
112     cr = ContainerRequest.new
113     cr.command = ["echo", "foo"]
114     cr.container_image = "img"
115     cr.cwd = "/tmp"
116     cr.environment = {}
117     cr.mounts = {"BAR" => "FOO"}
118     cr.output_path = "/tmpout"
119     cr.runtime_constraints = {}
120     cr.name = "foo"
121     cr.description = "bar"
122     cr.save!
123
124     cr.reload
125     cr.state = "Committed"
126     assert_raises(ActiveRecord::RecordInvalid) do
127       cr.save!
128     end
129   end
130
131   test "Container request commit" do
132     set_user_from_auth :active_trustedclient
133     cr = ContainerRequest.new
134     cr.command = ["echo", "foo"]
135     cr.container_image = "img"
136     cr.cwd = "/tmp"
137     cr.environment = {}
138     cr.mounts = {"BAR" => "FOO"}
139     cr.output_path = "/tmpout"
140     cr.priority = 1
141     cr.runtime_constraints = {}
142     cr.name = "foo"
143     cr.description = "bar"
144     cr.save!
145
146     cr.reload
147     assert_nil cr.container_uuid
148
149     cr.reload
150     cr.state = "Committed"
151     cr.save!
152
153     cr.reload
154
155     c = Container.find_by_uuid cr.container_uuid
156     assert_equal ["echo", "foo"], c.command
157     assert_equal "img", c.container_image
158     assert_equal "/tmp", c.cwd
159     assert_equal({}, c.environment)
160     assert_equal({"BAR" => "FOO"}, c.mounts)
161     assert_equal "/tmpout", c.output_path
162     assert_equal({}, c.runtime_constraints)
163     assert_equal 1, c.priority
164
165     assert_raises(ActiveRecord::RecordInvalid) do
166       cr.priority = nil
167       cr.save!
168     end
169
170     cr.priority = 0
171     cr.save!
172
173     cr.reload
174     c.reload
175     assert_equal 0, cr.priority
176     assert_equal 0, c.priority
177
178   end
179
180
181   test "Container request max priority" do
182     set_user_from_auth :active_trustedclient
183     cr = ContainerRequest.new
184     cr.state = "Committed"
185     cr.container_image = "img"
186     cr.command = ["foo", "bar"]
187     cr.output_path = "/tmp"
188     cr.cwd = "/tmp"
189     cr.priority = 5
190     cr.save!
191
192     c = Container.find_by_uuid cr.container_uuid
193     assert_equal 5, c.priority
194
195     cr2 = ContainerRequest.new
196     cr2.container_image = "img"
197     cr2.command = ["foo", "bar"]
198     cr2.output_path = "/tmp"
199     cr2.cwd = "/tmp"
200     cr2.priority = 10
201     cr2.save!
202
203     act_as_system_user do
204       cr2.state = "Committed"
205       cr2.container_uuid = cr.container_uuid
206       cr2.save!
207     end
208
209     c.reload
210     assert_equal 10, c.priority
211
212     cr2.reload
213     cr2.priority = 0
214     cr2.save!
215
216     c.reload
217     assert_equal 5, c.priority
218
219     cr.reload
220     cr.priority = 0
221     cr.save!
222
223     c.reload
224     assert_equal 0, c.priority
225
226   end
227
228
229   test "Independent container requests" do
230     set_user_from_auth :active_trustedclient
231     cr = ContainerRequest.new
232     cr.state = "Committed"
233     cr.container_image = "img"
234     cr.command = ["foo", "bar"]
235     cr.output_path = "/tmp"
236     cr.cwd = "/tmp"
237     cr.priority = 5
238     cr.save!
239
240     cr2 = ContainerRequest.new
241     cr2.state = "Committed"
242     cr2.container_image = "img"
243     cr2.command = ["foo", "bar"]
244     cr2.output_path = "/tmp"
245     cr2.cwd = "/tmp"
246     cr2.priority = 10
247     cr2.save!
248
249     c = Container.find_by_uuid cr.container_uuid
250     assert_equal 5, c.priority
251
252     c2 = Container.find_by_uuid cr2.container_uuid
253     assert_equal 10, c2.priority
254
255     cr.priority = 0
256     cr.save!
257
258     c.reload
259     assert_equal 0, c.priority
260
261     c2.reload
262     assert_equal 10, c2.priority
263   end
264
265
266   test "Container cancelled finalizes request" do
267     set_user_from_auth :active_trustedclient
268     cr = ContainerRequest.new
269     cr.state = "Committed"
270     cr.container_image = "img"
271     cr.command = ["foo", "bar"]
272     cr.output_path = "/tmp"
273     cr.cwd = "/tmp"
274     cr.priority = 5
275     cr.save!
276
277     cr.reload
278     assert_equal "Committed", cr.state
279
280     c = Container.find_by_uuid cr.container_uuid
281     assert_equal "Queued", c.state
282
283     act_as_system_user do
284       c.state = "Cancelled"
285       c.save!
286     end
287
288     cr.reload
289     assert_equal "Final", cr.state
290
291   end
292
293
294   test "Container complete finalizes request" do
295     set_user_from_auth :active_trustedclient
296     cr = ContainerRequest.new
297     cr.state = "Committed"
298     cr.container_image = "img"
299     cr.command = ["foo", "bar"]
300     cr.output_path = "/tmp"
301     cr.cwd = "/tmp"
302     cr.priority = 5
303     cr.save!
304
305     cr.reload
306     assert_equal "Committed", cr.state
307
308     c = Container.find_by_uuid cr.container_uuid
309     assert_equal Container::Queued, c.state
310
311     act_as_system_user do
312       c.update_attributes! state: Container::Locked
313       c.update_attributes! state: Container::Running
314     end
315
316     cr.reload
317     assert_equal "Committed", cr.state
318
319     act_as_system_user do
320       c.update_attributes! state: Container::Complete
321       c.save!
322     end
323
324     cr.reload
325     assert_equal "Final", cr.state
326
327   end
328
329   test "Container makes container request, then is cancelled" do
330     set_user_from_auth :active_trustedclient
331     cr = ContainerRequest.new
332     cr.state = "Committed"
333     cr.container_image = "img"
334     cr.command = ["foo", "bar"]
335     cr.output_path = "/tmp"
336     cr.cwd = "/tmp"
337     cr.priority = 5
338     cr.save!
339
340     c = Container.find_by_uuid cr.container_uuid
341     assert_equal 5, c.priority
342
343     cr2 = ContainerRequest.new
344     cr2.state = "Committed"
345     cr2.container_image = "img"
346     cr2.command = ["foo", "bar"]
347     cr2.output_path = "/tmp"
348     cr2.cwd = "/tmp"
349     cr2.priority = 10
350     cr2.requesting_container_uuid = c.uuid
351     cr2.save!
352
353     c2 = Container.find_by_uuid cr2.container_uuid
354     assert_equal 10, c2.priority
355
356     act_as_system_user do
357       c.state = "Cancelled"
358       c.save!
359     end
360
361     cr.reload
362     assert_equal "Final", cr.state
363
364     cr2.reload
365     assert_equal 0, cr2.priority
366
367     c2.reload
368     assert_equal 0, c2.priority
369   end
370
371   [
372     ['active', 'zzzzz-dz642-runningcontainr'],
373     ['active_no_prefs', nil],
374   ].each do |token, expected|
375     test "create as #{token} and expect requesting_container_uuid to be #{expected}" do
376       set_user_from_auth token
377       cr = ContainerRequest.create(container_image: "img", output_path: "/tmp", command: ["echo", "foo"])
378       assert_not_nil cr.uuid, 'uuid should be set for newly created container_request'
379       assert_equal expected, cr.requesting_container_uuid
380     end
381   end
382 end