14325: Test dispatch container queue against controller.
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 17 Jan 2019 21:31:55 +0000 (16:31 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 17 Jan 2019 21:31:55 +0000 (16:31 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

lib/dispatchcloud/container/queue_test.go [new file with mode: 0644]
sdk/go/arvadostest/fixtures.go

diff --git a/lib/dispatchcloud/container/queue_test.go b/lib/dispatchcloud/container/queue_test.go
new file mode 100644 (file)
index 0000000..9d2f830
--- /dev/null
@@ -0,0 +1,82 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package container
+
+import (
+       "sync"
+       "testing"
+       "time"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
+       "git.curoverse.com/arvados.git/sdk/go/arvadostest"
+       "github.com/sirupsen/logrus"
+       check "gopkg.in/check.v1"
+)
+
+// Gocheck boilerplate
+func Test(t *testing.T) {
+       check.TestingT(t)
+}
+
+var _ = check.Suite(&IntegrationSuite{})
+
+type IntegrationSuite struct{}
+
+func (*IntegrationSuite) TestControllerBackedQueue(c *check.C) {
+       client := arvados.NewClientFromEnv()
+       cq := NewQueue(logrus.StandardLogger(), nil, testTypeChooser, client)
+
+       err := cq.Update()
+       c.Check(err, check.IsNil)
+
+       ents, threshold := cq.Entries()
+       c.Check(len(ents), check.Not(check.Equals), 0)
+       c.Check(time.Since(threshold) < time.Minute, check.Equals, true)
+       c.Check(time.Since(threshold) > 0, check.Equals, true)
+
+       _, ok := ents[arvadostest.QueuedContainerUUID]
+       c.Check(ok, check.Equals, true)
+
+       var wg sync.WaitGroup
+       for uuid, ent := range ents {
+               c.Check(ent.Container.UUID, check.Equals, uuid)
+               c.Check(ent.InstanceType.Name, check.Equals, "testType")
+               c.Check(ent.Container.State, check.Equals, arvados.ContainerStateQueued)
+               c.Check(ent.Container.Priority > 0, check.Equals, true)
+
+               ctr, ok := cq.Get(uuid)
+               c.Check(ok, check.Equals, true)
+               c.Check(ctr.UUID, check.Equals, uuid)
+
+               wg.Add(1)
+               go func() {
+                       defer wg.Done()
+                       err := cq.Unlock(uuid)
+                       c.Check(err, check.NotNil)
+                       err = cq.Lock(uuid)
+                       c.Check(err, check.IsNil)
+                       ctr, ok := cq.Get(uuid)
+                       c.Check(ok, check.Equals, true)
+                       c.Check(ctr.State, check.Equals, arvados.ContainerStateLocked)
+                       err = cq.Lock(uuid)
+                       c.Check(err, check.NotNil)
+                       err = cq.Unlock(uuid)
+                       c.Check(err, check.IsNil)
+                       ctr, ok = cq.Get(uuid)
+                       c.Check(ok, check.Equals, true)
+                       c.Check(ctr.State, check.Equals, arvados.ContainerStateQueued)
+                       err = cq.Unlock(uuid)
+                       c.Check(err, check.NotNil)
+               }()
+       }
+       wg.Wait()
+
+       err = cq.Cancel(arvadostest.CompletedContainerUUID)
+       c.Check(err, check.ErrorMatches, `.*State cannot change from Complete to Cancelled.*`)
+}
+
+func testTypeChooser(ctr *arvados.Container) (arvados.InstanceType, error) {
+       return arvados.InstanceType{Name: "testType"}, nil
+}
index e0f2483131a98a64856116bda8c14b4de7bd7051..4f648e9b437e7b5eead7abf4b0db302011725cb7 100644 (file)
@@ -41,6 +41,10 @@ const (
        QueuedContainerRequestUUID = "zzzzz-xvhdp-cr4queuedcontnr"
        QueuedContainerUUID        = "zzzzz-dz642-queuedcontainer"
 
+       RunningContainerUUID = "zzzzz-dz642-runningcontainr"
+
+       CompletedContainerUUID = "zzzzz-dz642-compltcontainer"
+
        ArvadosRepoUUID = "zzzzz-s0uqq-arvadosrepo0123"
        ArvadosRepoName = "arvados"
        FooRepoUUID     = "zzzzz-s0uqq-382brsig8rp3666"