14325: Test dispatch container queue against controller.
[arvados.git] / lib / dispatchcloud / container / queue_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package container
6
7 import (
8         "sync"
9         "testing"
10         "time"
11
12         "git.curoverse.com/arvados.git/sdk/go/arvados"
13         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
14         "github.com/sirupsen/logrus"
15         check "gopkg.in/check.v1"
16 )
17
18 // Gocheck boilerplate
19 func Test(t *testing.T) {
20         check.TestingT(t)
21 }
22
23 var _ = check.Suite(&IntegrationSuite{})
24
25 type IntegrationSuite struct{}
26
27 func (*IntegrationSuite) TestControllerBackedQueue(c *check.C) {
28         client := arvados.NewClientFromEnv()
29         cq := NewQueue(logrus.StandardLogger(), nil, testTypeChooser, client)
30
31         err := cq.Update()
32         c.Check(err, check.IsNil)
33
34         ents, threshold := cq.Entries()
35         c.Check(len(ents), check.Not(check.Equals), 0)
36         c.Check(time.Since(threshold) < time.Minute, check.Equals, true)
37         c.Check(time.Since(threshold) > 0, check.Equals, true)
38
39         _, ok := ents[arvadostest.QueuedContainerUUID]
40         c.Check(ok, check.Equals, true)
41
42         var wg sync.WaitGroup
43         for uuid, ent := range ents {
44                 c.Check(ent.Container.UUID, check.Equals, uuid)
45                 c.Check(ent.InstanceType.Name, check.Equals, "testType")
46                 c.Check(ent.Container.State, check.Equals, arvados.ContainerStateQueued)
47                 c.Check(ent.Container.Priority > 0, check.Equals, true)
48
49                 ctr, ok := cq.Get(uuid)
50                 c.Check(ok, check.Equals, true)
51                 c.Check(ctr.UUID, check.Equals, uuid)
52
53                 wg.Add(1)
54                 go func() {
55                         defer wg.Done()
56                         err := cq.Unlock(uuid)
57                         c.Check(err, check.NotNil)
58                         err = cq.Lock(uuid)
59                         c.Check(err, check.IsNil)
60                         ctr, ok := cq.Get(uuid)
61                         c.Check(ok, check.Equals, true)
62                         c.Check(ctr.State, check.Equals, arvados.ContainerStateLocked)
63                         err = cq.Lock(uuid)
64                         c.Check(err, check.NotNil)
65                         err = cq.Unlock(uuid)
66                         c.Check(err, check.IsNil)
67                         ctr, ok = cq.Get(uuid)
68                         c.Check(ok, check.Equals, true)
69                         c.Check(ctr.State, check.Equals, arvados.ContainerStateQueued)
70                         err = cq.Unlock(uuid)
71                         c.Check(err, check.NotNil)
72                 }()
73         }
74         wg.Wait()
75
76         err = cq.Cancel(arvadostest.CompletedContainerUUID)
77         c.Check(err, check.ErrorMatches, `.*State cannot change from Complete to Cancelled.*`)
78 }
79
80 func testTypeChooser(ctr *arvados.Container) (arvados.InstanceType, error) {
81         return arvados.InstanceType{Name: "testType"}, nil
82 }