Merge branch '11345-nodemanager-retry-after' refs #11345
[arvados.git] / services / keep-balance / integration_test.go
1 package main
2
3 import (
4         "bytes"
5         "log"
6         "os"
7         "strings"
8         "testing"
9         "time"
10
11         "git.curoverse.com/arvados.git/sdk/go/arvados"
12         "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
13         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
14         "git.curoverse.com/arvados.git/sdk/go/keepclient"
15
16         check "gopkg.in/check.v1"
17 )
18
19 var _ = check.Suite(&integrationSuite{})
20
21 type integrationSuite struct {
22         config     Config
23         keepClient *keepclient.KeepClient
24 }
25
26 func (s *integrationSuite) SetUpSuite(c *check.C) {
27         if testing.Short() {
28                 c.Skip("-short")
29         }
30         arvadostest.ResetEnv()
31         arvadostest.StartAPI()
32         arvadostest.StartKeep(4, true)
33
34         arv, err := arvadosclient.MakeArvadosClient()
35         arv.ApiToken = arvadostest.DataManagerToken
36         c.Assert(err, check.IsNil)
37
38         s.keepClient, err = keepclient.MakeKeepClient(arv)
39         c.Assert(err, check.IsNil)
40         s.putReplicas(c, "foo", 4)
41         s.putReplicas(c, "bar", 1)
42 }
43
44 func (s *integrationSuite) putReplicas(c *check.C, data string, replicas int) {
45         s.keepClient.Want_replicas = replicas
46         _, _, err := s.keepClient.PutB([]byte(data))
47         c.Assert(err, check.IsNil)
48 }
49
50 func (s *integrationSuite) TearDownSuite(c *check.C) {
51         if testing.Short() {
52                 c.Skip("-short")
53         }
54         arvadostest.StopKeep(4)
55         arvadostest.StopAPI()
56 }
57
58 func (s *integrationSuite) SetUpTest(c *check.C) {
59         s.config = Config{
60                 Client: arvados.Client{
61                         APIHost:   os.Getenv("ARVADOS_API_HOST"),
62                         AuthToken: arvadostest.DataManagerToken,
63                         Insecure:  true,
64                 },
65                 KeepServiceTypes: []string{"disk"},
66         }
67 }
68
69 func (s *integrationSuite) TestBalanceAPIFixtures(c *check.C) {
70         var logBuf *bytes.Buffer
71         for iter := 0; iter < 20; iter++ {
72                 logBuf := &bytes.Buffer{}
73                 opts := RunOptions{
74                         CommitPulls: true,
75                         CommitTrash: true,
76                         Logger:      log.New(logBuf, "", log.LstdFlags),
77                 }
78                 nextOpts, err := (&Balancer{}).Run(s.config, opts)
79                 c.Check(err, check.IsNil)
80                 c.Check(nextOpts.SafeRendezvousState, check.Not(check.Equals), "")
81                 c.Check(nextOpts.CommitPulls, check.Equals, true)
82                 if iter == 0 {
83                         c.Check(logBuf.String(), check.Matches, `(?ms).*ChangeSet{Pulls:1.*`)
84                         c.Check(logBuf.String(), check.Not(check.Matches), `(?ms).*ChangeSet{.*Trashes:[^0]}*`)
85                 } else if strings.Contains(logBuf.String(), "ChangeSet{Pulls:0") {
86                         break
87                 }
88                 time.Sleep(200 * time.Millisecond)
89         }
90         c.Check(logBuf.String(), check.Not(check.Matches), `(?ms).*0 replicas (0 blocks, 0 bytes) underreplicated.*`)
91 }