14325: Document Running() return value.
[arvados.git] / lib / dispatchcloud / dispatcher_test.go
index 7d3ab79309567bb853d07daed11b6820dc3cdfca..9ef170e46d12a35e5a4574c439c441937383f2e2 100644 (file)
@@ -16,7 +16,7 @@ import (
 
        "git.curoverse.com/arvados.git/lib/dispatchcloud/test"
        "git.curoverse.com/arvados.git/sdk/go/arvados"
-       "github.com/Sirupsen/logrus"
+       "github.com/sirupsen/logrus"
        "golang.org/x/crypto/ssh"
        check "gopkg.in/check.v1"
 )
@@ -43,17 +43,18 @@ func (s *DispatcherSuite) SetUpTest(c *check.C) {
 
        _, hostpriv := test.LoadTestKey(c, "test/sshkey_vm")
        s.stubDriver = &test.StubDriver{
-               HostKey:          hostpriv,
-               AuthorizedKeys:   []ssh.PublicKey{dispatchpub},
-               ErrorRateDestroy: 0.1,
+               HostKey:                   hostpriv,
+               AuthorizedKeys:            []ssh.PublicKey{dispatchpub},
+               ErrorRateDestroy:          0.1,
+               MinTimeBetweenCreateCalls: time.Millisecond,
        }
 
        s.cluster = &arvados.Cluster{
                CloudVMs: arvados.CloudVMs{
                        Driver:          "test",
                        SyncInterval:    arvados.Duration(10 * time.Millisecond),
-                       TimeoutIdle:     arvados.Duration(30 * time.Millisecond),
-                       TimeoutBooting:  arvados.Duration(30 * time.Millisecond),
+                       TimeoutIdle:     arvados.Duration(150 * time.Millisecond),
+                       TimeoutBooting:  arvados.Duration(150 * time.Millisecond),
                        TimeoutProbe:    arvados.Duration(15 * time.Millisecond),
                        TimeoutShutdown: arvados.Duration(5 * time.Millisecond),
                },
@@ -121,16 +122,18 @@ func (s *DispatcherSuite) TestDispatchToStubDriver(c *check.C) {
        for _, ctr := range queue.Containers {
                waiting[ctr.UUID] = struct{}{}
        }
-       onComplete := func(uuid string) {
+       executeContainer := func(ctr arvados.Container) int {
                mtx.Lock()
                defer mtx.Unlock()
-               if _, ok := waiting[uuid]; !ok {
-                       c.Logf("container completed twice: %s -- perhaps completed after stub instance was killed?", uuid)
+               if _, ok := waiting[ctr.UUID]; !ok {
+                       c.Logf("container completed twice: %s -- perhaps completed after stub instance was killed?", ctr.UUID)
+                       return 1
                }
-               delete(waiting, uuid)
+               delete(waiting, ctr.UUID)
                if len(waiting) == 0 {
                        close(done)
                }
+               return int(rand.Uint32() & 0x3)
        }
        n := 0
        s.stubDriver.Queue = queue
@@ -138,7 +141,7 @@ func (s *DispatcherSuite) TestDispatchToStubDriver(c *check.C) {
                n++
                stubvm.Boot = time.Now().Add(time.Duration(rand.Int63n(int64(5 * time.Millisecond))))
                stubvm.CrunchRunDetachDelay = time.Duration(rand.Int63n(int64(10 * time.Millisecond)))
-               stubvm.CtrExit = int(rand.Uint32() & 0x3)
+               stubvm.ExecuteContainer = executeContainer
                switch n % 7 {
                case 0:
                        stubvm.Broken = time.Now().Add(time.Duration(rand.Int63n(90)) * time.Millisecond)
@@ -147,8 +150,6 @@ func (s *DispatcherSuite) TestDispatchToStubDriver(c *check.C) {
                default:
                        stubvm.CrunchRunCrashRate = 0.1
                }
-               stubvm.OnComplete = onComplete
-               stubvm.OnCancel = onComplete
        }
 
        start := time.Now()
@@ -179,8 +180,12 @@ func (s *DispatcherSuite) TestDispatchToStubDriver(c *check.C) {
 }
 
 func (s *DispatcherSuite) TestAPIPermissions(c *check.C) {
-       drivers["test"] = s.stubDriver
        s.cluster.ManagementToken = "abcdefgh"
+       drivers["test"] = s.stubDriver
+       s.disp.setupOnce.Do(s.disp.initialize)
+       s.disp.queue = &test.Queue{}
+       go s.disp.run()
+
        for _, token := range []string{"abc", ""} {
                req := httptest.NewRequest("GET", "/arvados/v1/dispatch/instances", nil)
                if token != "" {
@@ -197,8 +202,12 @@ func (s *DispatcherSuite) TestAPIPermissions(c *check.C) {
 }
 
 func (s *DispatcherSuite) TestAPIDisabled(c *check.C) {
-       drivers["test"] = s.stubDriver
        s.cluster.ManagementToken = ""
+       drivers["test"] = s.stubDriver
+       s.disp.setupOnce.Do(s.disp.initialize)
+       s.disp.queue = &test.Queue{}
+       go s.disp.run()
+
        for _, token := range []string{"abc", ""} {
                req := httptest.NewRequest("GET", "/arvados/v1/dispatch/instances", nil)
                if token != "" {
@@ -214,14 +223,17 @@ func (s *DispatcherSuite) TestInstancesAPI(c *check.C) {
        s.cluster.ManagementToken = "abcdefgh"
        s.cluster.CloudVMs.TimeoutBooting = arvados.Duration(time.Second)
        drivers["test"] = s.stubDriver
+       s.disp.setupOnce.Do(s.disp.initialize)
+       s.disp.queue = &test.Queue{}
+       go s.disp.run()
 
        type instance struct {
                Instance             string
-               WorkerState          string
+               WorkerState          string `json:"worker_state"`
                Price                float64
-               LastContainerUUID    string
-               ArvadosInstanceType  string
-               ProviderInstanceType string
+               LastContainerUUID    string `json:"last_container_uuid"`
+               ArvadosInstanceType  string `json:"arvados_instance_type"`
+               ProviderInstanceType string `json:"provider_instance_type"`
        }
        type instancesResponse struct {
                Items []instance
@@ -243,8 +255,8 @@ func (s *DispatcherSuite) TestInstancesAPI(c *check.C) {
 
        ch := s.disp.pool.Subscribe()
        defer s.disp.pool.Unsubscribe(ch)
-       err := s.disp.pool.Create(test.InstanceType(1))
-       c.Check(err, check.IsNil)
+       ok := s.disp.pool.Create(test.InstanceType(1))
+       c.Check(ok, check.Equals, true)
        <-ch
 
        sr = getInstances()