Merge branch '9017-apiserver-short-tests'
[arvados.git] / services / api / test / unit / container_test.rb
index c635af32cf26f846732bd38d2012982a1ac6e6ab..0cac6acd936332eaa3b76eb28fad3c84479b1f5a 100644 (file)
@@ -2,62 +2,90 @@ require 'test_helper'
 
 class ContainerTest < ActiveSupport::TestCase
   def check_illegal_modify c
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.command = ["echo", "bar"]
-        c.save!
-      end
-
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.container_image = "img2"
-        c.save!
-      end
+    c.reload
+    c.command = ["echo", "bar"]
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
 
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.cwd = "/tmp2"
-        c.save!
-      end
+    c.reload
+    c.container_image = "img2"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
 
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.environment = {"FOO" => "BAR"}
-        c.save!
-      end
+    c.reload
+    c.cwd = "/tmp2"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
 
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.mounts = {"FOO" => "BAR"}
-        c.save!
-      end
+    c.reload
+    c.environment = {"FOO" => "BAR"}
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
 
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.output_path = "/tmp3"
-        c.save!
-      end
+    c.reload
+    c.mounts = {"FOO" => "BAR"}
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
 
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.runtime_constraints = {"FOO" => "BAR"}
-        c.save!
-      end
+    c.reload
+    c.output_path = "/tmp3"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
 
+    c.reload
+    c.runtime_constraints = {"FOO" => "BAR"}
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
   end
 
   def check_bogus_states c
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.state = nil
-        c.save!
-      end
+    c.reload
+    c.state = nil
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
 
-      assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.state = "Flubber"
-        c.save!
-      end
+    c.reload
+    c.state = "Flubber"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+  end
+
+  def check_no_change_from_complete c
+    check_illegal_modify c
+    check_bogus_states c
+
+    c.reload
+    c.priority = 3
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.state = "Queued"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.state = "Running"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
+
+    c.reload
+    c.state = "Complete"
+    assert_raises(ActiveRecord::RecordInvalid) do
+      c.save!
+    end
   end
 
   test "Container create" do
@@ -67,7 +95,7 @@ class ContainerTest < ActiveSupport::TestCase
       c.container_image = "img"
       c.cwd = "/tmp"
       c.environment = {}
-      c.mounts = {}
+      c.mounts = {"BAR" => "FOO"}
       c.output_path = "/tmp"
       c.priority = 1
       c.runtime_constraints = {}
@@ -79,6 +107,22 @@ class ContainerTest < ActiveSupport::TestCase
       c.reload
       c.priority = 2
       c.save!
+    end
+  end
+
+  test "Container running" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Complete"
+      assert_raises(ActiveRecord::RecordInvalid) do
+        c.save!
+      end
 
       c.reload
       c.state = "Running"
@@ -87,16 +131,99 @@ class ContainerTest < ActiveSupport::TestCase
       check_illegal_modify c
       check_bogus_states c
 
+      c.reload
+      c.state = "Queued"
       assert_raises(ActiveRecord::RecordInvalid) do
-        c.reload
-        c.state = "Queued"
         c.save!
       end
 
       c.reload
       c.priority = 3
       c.save!
+    end
+  end
+
+  test "Container queued cancel" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Cancelled"
+      c.save!
+
+      check_no_change_from_complete c
+    end
+  end
+
+  test "Container running cancel" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Running"
+      c.save!
 
+      c.reload
+      c.state = "Cancelled"
+      c.save!
+
+      check_no_change_from_complete c
+    end
+  end
+
+  test "Container create forbidden for non-admin" do
+    set_user_from_auth :active_trustedclient
+    c = Container.new
+    c.command = ["echo", "foo"]
+    c.container_image = "img"
+    c.cwd = "/tmp"
+    c.environment = {}
+    c.mounts = {"BAR" => "FOO"}
+    c.output_path = "/tmp"
+    c.priority = 1
+    c.runtime_constraints = {}
+    assert_raises(ArvadosModel::PermissionDeniedError) do
+      c.save!
+    end
+  end
+
+  test "Container only set exit code on complete" do
+    act_as_system_user do
+      c = Container.new
+      c.command = ["echo", "foo"]
+      c.container_image = "img"
+      c.output_path = "/tmp"
+      c.save!
+
+      c.reload
+      c.state = "Running"
+      c.save!
+
+      c.reload
+      c.exit_code = 1
+      assert_raises(ActiveRecord::RecordInvalid) do
+        c.save!
+      end
+
+      c.reload
+      c.exit_code = 1
+      c.state = "Cancelled"
+      assert_raises(ActiveRecord::RecordInvalid) do
+        c.save!
+      end
+
+      c.reload
+      c.exit_code = 1
+      c.state = "Complete"
+      c.save!
     end
   end
 end