X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/8052381fb4e7aceb52497e8378b596178cf5af7c..b8b6fb68a54f0f81d8ad6a75cad2650179108d66:/lib/dispatchcloud/container/queue_test.go diff --git a/lib/dispatchcloud/container/queue_test.go b/lib/dispatchcloud/container/queue_test.go index a84497424a..0075ee324e 100644 --- a/lib/dispatchcloud/container/queue_test.go +++ b/lib/dispatchcloud/container/queue_test.go @@ -6,12 +6,13 @@ package container import ( "errors" + "os" "sync" "testing" "time" - "git.curoverse.com/arvados.git/sdk/go/arvados" - "git.curoverse.com/arvados.git/sdk/go/arvadostest" + "git.arvados.org/arvados.git/sdk/go/arvados" + "git.arvados.org/arvados.git/sdk/go/arvadostest" "github.com/sirupsen/logrus" check "gopkg.in/check.v1" ) @@ -23,6 +24,14 @@ func Test(t *testing.T) { var _ = check.Suite(&IntegrationSuite{}) +func logger() logrus.FieldLogger { + logger := logrus.StandardLogger() + if os.Getenv("ARVADOS_DEBUG") != "" { + logger.SetLevel(logrus.DebugLevel) + } + return logger +} + type IntegrationSuite struct{} func (suite *IntegrationSuite) TearDownTest(c *check.C) { @@ -36,7 +45,7 @@ func (suite *IntegrationSuite) TestGetLockUnlockCancel(c *check.C) { } client := arvados.NewClientFromEnv() - cq := NewQueue(logrus.StandardLogger(), nil, typeChooser, client) + cq := NewQueue(logger(), nil, typeChooser, client) err := cq.Update() c.Check(err, check.IsNil) @@ -61,10 +70,12 @@ func (suite *IntegrationSuite) TestGetLockUnlockCancel(c *check.C) { c.Check(ctr.UUID, check.Equals, uuid) wg.Add(1) - go func() { + go func(uuid string) { defer wg.Done() err := cq.Unlock(uuid) c.Check(err, check.NotNil) + c.Check(err, check.ErrorMatches, ".*cannot unlock when Queued.*") + err = cq.Lock(uuid) c.Check(err, check.IsNil) ctr, ok := cq.Get(uuid) @@ -72,6 +83,7 @@ func (suite *IntegrationSuite) TestGetLockUnlockCancel(c *check.C) { 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) @@ -79,28 +91,57 @@ func (suite *IntegrationSuite) TestGetLockUnlockCancel(c *check.C) { c.Check(ctr.State, check.Equals, arvados.ContainerStateQueued) err = cq.Unlock(uuid) c.Check(err, check.NotNil) - }() + + err = cq.Cancel(uuid) + c.Check(err, check.IsNil) + ctr, ok = cq.Get(uuid) + c.Check(ok, check.Equals, true) + c.Check(ctr.State, check.Equals, arvados.ContainerStateCancelled) + err = cq.Lock(uuid) + c.Check(err, check.NotNil) + }(uuid) } wg.Wait() - - err = cq.Cancel(arvadostest.CompletedContainerUUID) - c.Check(err, check.ErrorMatches, `.*State cannot change from Complete to Cancelled.*`) } func (suite *IntegrationSuite) TestCancelIfNoInstanceType(c *check.C) { errorTypeChooser := func(ctr *arvados.Container) (arvados.InstanceType, error) { + // Make sure the relevant container fields are + // actually populated. + c.Check(ctr.ContainerImage, check.Equals, "test") + c.Check(ctr.RuntimeConstraints.VCPUs, check.Equals, 4) + c.Check(ctr.RuntimeConstraints.RAM, check.Equals, int64(12000000000)) + c.Check(ctr.Mounts["/tmp"].Capacity, check.Equals, int64(24000000000)) + c.Check(ctr.Mounts["/var/spool/cwl"].Capacity, check.Equals, int64(24000000000)) return arvados.InstanceType{}, errors.New("no suitable instance type") } client := arvados.NewClientFromEnv() - cq := NewQueue(logrus.StandardLogger(), nil, errorTypeChooser, client) + cq := NewQueue(logger(), nil, errorTypeChooser, client) + + ch := cq.Subscribe() + go func() { + defer cq.Unsubscribe(ch) + for range ch { + // Container should never be added to + // queue. Note that polling the queue this way + // doesn't guarantee a bug (container being + // incorrectly added to the queue) will cause + // a test failure. + _, ok := cq.Get(arvadostest.QueuedContainerUUID) + if !c.Check(ok, check.Equals, false) { + // Don't spam the log with more failures + break + } + } + }() var ctr arvados.Container err := client.RequestAndDecode(&ctr, "GET", "arvados/v1/containers/"+arvadostest.QueuedContainerUUID, nil, nil) c.Check(err, check.IsNil) c.Check(ctr.State, check.Equals, arvados.ContainerStateQueued) - cq.Update() + go cq.Update() // Wait for the cancel operation to take effect. Container // will have state=Cancelled or just disappear from the queue.