3 class ContainerTest < ActiveSupport::TestCase
7 command: ['echo', 'foo'],
8 container_image: 'img',
11 runtime_constraints: {"vcpus" => 1, "ram" => 1},
14 def minimal_new attrs={}
15 cr = ContainerRequest.new DEFAULT_ATTRS.merge(attrs)
16 act_as_user users(:active) do
19 c = Container.new DEFAULT_ATTRS.merge(attrs)
22 assert cr.update_attributes(container_uuid: c.uuid,
23 state: ContainerRequest::Committed,
29 def check_illegal_updates c, bad_updates
30 bad_updates.each do |u|
31 refute c.update_attributes(u), u.inspect
32 refute c.valid?, u.inspect
37 def check_illegal_modify c
38 check_illegal_updates c, [{command: ["echo", "bar"]},
39 {container_image: "img2"},
41 {environment: {"FOO" => "BAR"}},
42 {mounts: {"FOO" => "BAR"}},
43 {output_path: "/tmp3"},
44 {locked_by_uuid: "zzzzz-gj3su-027z32aux8dg2s1"},
45 {auth_uuid: "zzzzz-gj3su-017z32aux8dg2s1"},
46 {runtime_constraints: {"FOO" => "BAR"}}]
49 def check_bogus_states c
50 check_illegal_updates c, [{state: nil},
54 def check_no_change_from_cancelled c
55 check_illegal_modify c
57 check_illegal_updates c, [{ priority: 3 },
58 { state: Container::Queued },
59 { state: Container::Locked },
60 { state: Container::Running },
61 { state: Container::Complete }]
64 test "Container create" do
66 c, _ = minimal_new(environment: {},
67 mounts: {"BAR" => "FOO"},
70 runtime_constraints: {"vcpus" => 1, "ram" => 1})
72 check_illegal_modify c
81 test "Container running" do
82 c, _ = minimal_new priority: 1
84 set_user_from_auth :dispatch1
85 check_illegal_updates c, [{state: Container::Running},
86 {state: Container::Complete}]
89 c.update_attributes! state: Container::Running
91 check_illegal_modify c
94 check_illegal_updates c, [{state: Container::Queued}]
97 c.update_attributes! priority: 3
100 test "Lock and unlock" do
101 c, cr = minimal_new priority: 0
103 set_user_from_auth :dispatch1
104 assert_equal Container::Queued, c.state
106 assert_raise(ActiveRecord::RecordInvalid) {c.lock} # "no priority"
108 assert cr.update_attributes priority: 1
110 refute c.update_attributes(state: Container::Running), "not locked"
112 refute c.update_attributes(state: Container::Complete), "not locked"
115 assert c.lock, show_errors(c)
116 assert c.locked_by_uuid
119 assert_raise(ArvadosModel::AlreadyLockedError) {c.lock}
122 assert c.unlock, show_errors(c)
123 refute c.locked_by_uuid
126 refute c.update_attributes(state: Container::Running), "not locked"
128 refute c.locked_by_uuid
131 assert c.lock, show_errors(c)
132 assert c.update_attributes(state: Container::Running), show_errors(c)
133 assert c.locked_by_uuid
136 auth_uuid_was = c.auth_uuid
138 assert_raise(ActiveRecord::RecordInvalid) {c.lock} # Running to Locked is not allowed
140 assert_raise(ActiveRecord::RecordInvalid) {c.unlock} # Running to Queued is not allowed
143 assert c.update_attributes(state: Container::Complete), show_errors(c)
144 refute c.locked_by_uuid
147 auth_exp = ApiClientAuthorization.find_by_uuid(auth_uuid_was).expires_at
148 assert_operator auth_exp, :<, db_current_time
151 test "Container queued cancel" do
153 set_user_from_auth :dispatch1
154 assert c.update_attributes(state: Container::Cancelled), show_errors(c)
155 check_no_change_from_cancelled c
158 test "Container locked cancel" do
160 set_user_from_auth :dispatch1
161 assert c.lock, show_errors(c)
162 assert c.update_attributes(state: Container::Cancelled), show_errors(c)
163 check_no_change_from_cancelled c
166 test "Container running cancel" do
168 set_user_from_auth :dispatch1
170 c.update_attributes! state: Container::Running
171 c.update_attributes! state: Container::Cancelled
172 check_no_change_from_cancelled c
175 test "Container create forbidden for non-admin" do
176 set_user_from_auth :active_trustedclient
177 c = Container.new DEFAULT_ATTRS
179 c.mounts = {"BAR" => "FOO"}
180 c.output_path = "/tmp"
182 c.runtime_constraints = {}
183 assert_raises(ArvadosModel::PermissionDeniedError) do
188 test "Container only set exit code on complete" do
190 set_user_from_auth :dispatch1
192 c.update_attributes! state: Container::Running
194 check_illegal_updates c, [{exit_code: 1},
195 {exit_code: 1, state: Container::Cancelled}]
197 assert c.update_attributes(exit_code: 1, state: Container::Complete)