18071: Use dblock to avoid concurrent keep-balance ops.
[arvados.git] / services / keep-balance / integration_test.go
index 43816a213b157c2f293f6d54bc0812005b227a28..42463a002a5ec73652f7f7ef6f00f8a8c4fb44a1 100644 (file)
@@ -2,21 +2,24 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-package main
+package keepbalance
 
 import (
        "bytes"
+       "context"
+       "io"
        "os"
        "strings"
        "testing"
        "time"
 
-       "git.curoverse.com/arvados.git/lib/config"
-       "git.curoverse.com/arvados.git/sdk/go/arvados"
-       "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
-       "git.curoverse.com/arvados.git/sdk/go/arvadostest"
-       "git.curoverse.com/arvados.git/sdk/go/ctxlog"
-       "git.curoverse.com/arvados.git/sdk/go/keepclient"
+       "git.arvados.org/arvados.git/lib/config"
+       "git.arvados.org/arvados.git/sdk/go/arvados"
+       "git.arvados.org/arvados.git/sdk/go/arvadosclient"
+       "git.arvados.org/arvados.git/sdk/go/arvadostest"
+       "git.arvados.org/arvados.git/sdk/go/ctxlog"
+       "git.arvados.org/arvados.git/sdk/go/keepclient"
+       "github.com/jmoiron/sqlx"
        "github.com/prometheus/client_golang/prometheus"
        "github.com/sirupsen/logrus"
        check "gopkg.in/check.v1"
@@ -26,6 +29,7 @@ var _ = check.Suite(&integrationSuite{})
 
 type integrationSuite struct {
        config     *arvados.Cluster
+       db         *sqlx.DB
        client     *arvados.Client
        keepClient *keepclient.KeepClient
 }
@@ -35,7 +39,6 @@ func (s *integrationSuite) SetUpSuite(c *check.C) {
                c.Skip("-short")
        }
        arvadostest.ResetEnv()
-       arvadostest.StartAPI()
        arvadostest.StartKeep(4, true)
 
        arv, err := arvadosclient.MakeArvadosClient()
@@ -59,7 +62,6 @@ func (s *integrationSuite) TearDownSuite(c *check.C) {
                c.Skip("-short")
        }
        arvadostest.StopKeep(4)
-       arvadostest.StopAPI()
 }
 
 func (s *integrationSuite) SetUpTest(c *check.C) {
@@ -67,6 +69,8 @@ func (s *integrationSuite) SetUpTest(c *check.C) {
        c.Assert(err, check.Equals, nil)
        s.config, err = cfg.GetCluster("")
        c.Assert(err, check.Equals, nil)
+       s.db, err = sqlx.Open("postgres", s.config.PostgreSQL.Connection.String())
+       c.Assert(err, check.IsNil)
        s.config.Collections.BalancePeriod = arvados.Duration(time.Second)
 
        s.client = &arvados.Client{
@@ -81,18 +85,20 @@ func (s *integrationSuite) TestBalanceAPIFixtures(c *check.C) {
        for iter := 0; iter < 20; iter++ {
                logBuf.Reset()
                logger := logrus.New()
-               logger.Out = &logBuf
+               logger.Out = io.MultiWriter(&logBuf, os.Stderr)
                opts := RunOptions{
-                       CommitPulls: true,
-                       CommitTrash: true,
-                       Logger:      logger,
+                       CommitPulls:           true,
+                       CommitTrash:           true,
+                       CommitConfirmedFields: true,
+                       Logger:                logger,
                }
 
                bal := &Balancer{
+                       DB:      s.db,
                        Logger:  logger,
                        Metrics: newMetrics(prometheus.NewRegistry()),
                }
-               nextOpts, err := bal.Run(s.client, s.config, opts)
+               nextOpts, err := bal.Run(context.Background(), s.client, s.config, opts)
                c.Check(err, check.IsNil)
                c.Check(nextOpts.SafeRendezvousState, check.Not(check.Equals), "")
                c.Check(nextOpts.CommitPulls, check.Equals, true)
@@ -105,4 +111,23 @@ func (s *integrationSuite) TestBalanceAPIFixtures(c *check.C) {
                time.Sleep(200 * time.Millisecond)
        }
        c.Check(logBuf.String(), check.Not(check.Matches), `(?ms).*0 replicas (0 blocks, 0 bytes) underreplicated.*`)
+
+       for _, trial := range []struct {
+               uuid    string
+               repl    int
+               classes []string
+       }{
+               {arvadostest.EmptyCollectionUUID, 0, []string{}},
+               {arvadostest.FooCollection, 2, []string{"default"}},                                // "foo" blk
+               {arvadostest.StorageClassesDesiredDefaultConfirmedDefault, 2, []string{"default"}}, // "bar" blk
+               {arvadostest.StorageClassesDesiredArchiveConfirmedDefault, 0, []string{}},          // "bar" blk
+       } {
+               c.Logf("%#v", trial)
+               var coll arvados.Collection
+               s.client.RequestAndDecode(&coll, "GET", "arvados/v1/collections/"+trial.uuid, nil, nil)
+               if c.Check(coll.ReplicationConfirmed, check.NotNil) {
+                       c.Check(*coll.ReplicationConfirmed, check.Equals, trial.repl)
+               }
+               c.Check(coll.StorageClassesConfirmed, check.DeepEquals, trial.classes)
+       }
 }