0cac6acd936332eaa3b76eb28fad3c84479b1f5a
[arvados.git] / services / api / test / unit / container_test.rb
1 require 'test_helper'
2
3 class ContainerTest < ActiveSupport::TestCase
4   def check_illegal_modify c
5     c.reload
6     c.command = ["echo", "bar"]
7     assert_raises(ActiveRecord::RecordInvalid) do
8       c.save!
9     end
10
11     c.reload
12     c.container_image = "img2"
13     assert_raises(ActiveRecord::RecordInvalid) do
14       c.save!
15     end
16
17     c.reload
18     c.cwd = "/tmp2"
19     assert_raises(ActiveRecord::RecordInvalid) do
20       c.save!
21     end
22
23     c.reload
24     c.environment = {"FOO" => "BAR"}
25     assert_raises(ActiveRecord::RecordInvalid) do
26       c.save!
27     end
28
29     c.reload
30     c.mounts = {"FOO" => "BAR"}
31     assert_raises(ActiveRecord::RecordInvalid) do
32       c.save!
33     end
34
35     c.reload
36     c.output_path = "/tmp3"
37     assert_raises(ActiveRecord::RecordInvalid) do
38       c.save!
39     end
40
41     c.reload
42     c.runtime_constraints = {"FOO" => "BAR"}
43     assert_raises(ActiveRecord::RecordInvalid) do
44       c.save!
45     end
46   end
47
48   def check_bogus_states c
49     c.reload
50     c.state = nil
51     assert_raises(ActiveRecord::RecordInvalid) do
52       c.save!
53     end
54
55     c.reload
56     c.state = "Flubber"
57     assert_raises(ActiveRecord::RecordInvalid) do
58       c.save!
59     end
60   end
61
62   def check_no_change_from_complete c
63     check_illegal_modify c
64     check_bogus_states c
65
66     c.reload
67     c.priority = 3
68     assert_raises(ActiveRecord::RecordInvalid) do
69       c.save!
70     end
71
72     c.reload
73     c.state = "Queued"
74     assert_raises(ActiveRecord::RecordInvalid) do
75       c.save!
76     end
77
78     c.reload
79     c.state = "Running"
80     assert_raises(ActiveRecord::RecordInvalid) do
81       c.save!
82     end
83
84     c.reload
85     c.state = "Complete"
86     assert_raises(ActiveRecord::RecordInvalid) do
87       c.save!
88     end
89   end
90
91   test "Container create" do
92     act_as_system_user do
93       c = Container.new
94       c.command = ["echo", "foo"]
95       c.container_image = "img"
96       c.cwd = "/tmp"
97       c.environment = {}
98       c.mounts = {"BAR" => "FOO"}
99       c.output_path = "/tmp"
100       c.priority = 1
101       c.runtime_constraints = {}
102       c.save!
103
104       check_illegal_modify c
105       check_bogus_states c
106
107       c.reload
108       c.priority = 2
109       c.save!
110     end
111   end
112
113   test "Container running" do
114     act_as_system_user do
115       c = Container.new
116       c.command = ["echo", "foo"]
117       c.container_image = "img"
118       c.output_path = "/tmp"
119       c.save!
120
121       c.reload
122       c.state = "Complete"
123       assert_raises(ActiveRecord::RecordInvalid) do
124         c.save!
125       end
126
127       c.reload
128       c.state = "Running"
129       c.save!
130
131       check_illegal_modify c
132       check_bogus_states c
133
134       c.reload
135       c.state = "Queued"
136       assert_raises(ActiveRecord::RecordInvalid) do
137         c.save!
138       end
139
140       c.reload
141       c.priority = 3
142       c.save!
143     end
144   end
145
146   test "Container queued cancel" do
147     act_as_system_user do
148       c = Container.new
149       c.command = ["echo", "foo"]
150       c.container_image = "img"
151       c.output_path = "/tmp"
152       c.save!
153
154       c.reload
155       c.state = "Cancelled"
156       c.save!
157
158       check_no_change_from_complete c
159     end
160   end
161
162   test "Container running cancel" do
163     act_as_system_user do
164       c = Container.new
165       c.command = ["echo", "foo"]
166       c.container_image = "img"
167       c.output_path = "/tmp"
168       c.save!
169
170       c.reload
171       c.state = "Running"
172       c.save!
173
174       c.reload
175       c.state = "Cancelled"
176       c.save!
177
178       check_no_change_from_complete c
179     end
180   end
181
182   test "Container create forbidden for non-admin" do
183     set_user_from_auth :active_trustedclient
184     c = Container.new
185     c.command = ["echo", "foo"]
186     c.container_image = "img"
187     c.cwd = "/tmp"
188     c.environment = {}
189     c.mounts = {"BAR" => "FOO"}
190     c.output_path = "/tmp"
191     c.priority = 1
192     c.runtime_constraints = {}
193     assert_raises(ArvadosModel::PermissionDeniedError) do
194       c.save!
195     end
196   end
197
198   test "Container only set exit code on complete" do
199     act_as_system_user do
200       c = Container.new
201       c.command = ["echo", "foo"]
202       c.container_image = "img"
203       c.output_path = "/tmp"
204       c.save!
205
206       c.reload
207       c.state = "Running"
208       c.save!
209
210       c.reload
211       c.exit_code = 1
212       assert_raises(ActiveRecord::RecordInvalid) do
213         c.save!
214       end
215
216       c.reload
217       c.exit_code = 1
218       c.state = "Cancelled"
219       assert_raises(ActiveRecord::RecordInvalid) do
220         c.save!
221       end
222
223       c.reload
224       c.exit_code = 1
225       c.state = "Complete"
226       c.save!
227     end
228   end
229 end