X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5155ef0eaae5a3cdef3d8c3490d138dfcbeaa736..e1ed6272d0e8ecf96aeb6905328498d023d34e0e:/lib/dispatchcloud/worker/pool_test.go diff --git a/lib/dispatchcloud/worker/pool_test.go b/lib/dispatchcloud/worker/pool_test.go index 300b4730fc..d437668aad 100644 --- a/lib/dispatchcloud/worker/pool_test.go +++ b/lib/dispatchcloud/worker/pool_test.go @@ -9,10 +9,10 @@ import ( "strings" "time" - "git.curoverse.com/arvados.git/lib/cloud" - "git.curoverse.com/arvados.git/lib/dispatchcloud/test" - "git.curoverse.com/arvados.git/sdk/go/arvados" - "git.curoverse.com/arvados.git/sdk/go/ctxlog" + "git.arvados.org/arvados.git/lib/cloud" + "git.arvados.org/arvados.git/lib/dispatchcloud/test" + "git.arvados.org/arvados.git/sdk/go/arvados" + "git.arvados.org/arvados.git/sdk/go/ctxlog" "github.com/prometheus/client_golang/prometheus" check "gopkg.in/check.v1" ) @@ -66,13 +66,15 @@ func (suite *PoolSuite) TestResumeAfterRestart(c *check.C) { logger := ctxlog.TestLogger(c) driver := &test.StubDriver{} instanceSetID := cloud.InstanceSetID("test-instance-set-id") - is, err := driver.InstanceSet(nil, instanceSetID, logger) + is, err := driver.InstanceSet(nil, instanceSetID, nil, logger) c.Assert(err, check.IsNil) newExecutor := func(cloud.Instance) Executor { - return stubExecutor{ - "crunch-run --list": stubResp{}, - "true": stubResp{}, + return &stubExecutor{ + response: map[string]stubResp{ + "crunch-run --list": {}, + "true": {}, + }, } } @@ -144,10 +146,70 @@ func (suite *PoolSuite) TestResumeAfterRestart(c *check.C) { pool2.Stop() } +func (suite *PoolSuite) TestDrain(c *check.C) { + logger := ctxlog.TestLogger(c) + driver := test.StubDriver{HoldCloudOps: true} + instanceSet, err := driver.InstanceSet(nil, "test-instance-set-id", nil, logger) + c.Assert(err, check.IsNil) + + ac := arvados.NewClientFromEnv() + + type1 := arvados.InstanceType{Name: "a1s", ProviderType: "a1.small", VCPUs: 1, RAM: 1 * GiB, Price: .01} + pool := &Pool{ + arvClient: ac, + logger: logger, + newExecutor: func(cloud.Instance) Executor { return &stubExecutor{} }, + instanceSet: &throttledInstanceSet{InstanceSet: instanceSet}, + instanceTypes: arvados.InstanceTypeMap{ + type1.Name: type1, + }, + } + notify := pool.Subscribe() + defer pool.Unsubscribe(notify) + + c.Check(pool.Unallocated()[type1], check.Equals, 0) + pool.Create(type1) + c.Check(pool.Unallocated()[type1], check.Equals, 1) + + // Unblock the pending Create call. + go driver.ReleaseCloudOps(1) + + // Wait for the instance to either return from its Create + // call, or show up in a poll. + suite.wait(c, pool, notify, func() bool { + pool.mtx.RLock() + defer pool.mtx.RUnlock() + return len(pool.workers) == 1 + }) + + tests := []struct { + state State + idleBehavior IdleBehavior + result bool + }{ + {StateIdle, IdleBehaviorHold, false}, + {StateIdle, IdleBehaviorDrain, false}, + {StateIdle, IdleBehaviorRun, true}, + } + + for _, test := range tests { + for _, wkr := range pool.workers { + if wkr.instType == type1 { + wkr.state = test.state + wkr.idleBehavior = test.idleBehavior + } + } + + // Try to start another container + started := pool.StartContainer(type1, arvados.Container{UUID: "testcontainer"}) + c.Check(started, check.Equals, test.result) + } +} + func (suite *PoolSuite) TestCreateUnallocShutdown(c *check.C) { logger := ctxlog.TestLogger(c) driver := test.StubDriver{HoldCloudOps: true} - instanceSet, err := driver.InstanceSet(nil, "", logger) + instanceSet, err := driver.InstanceSet(nil, "test-instance-set-id", nil, logger) c.Assert(err, check.IsNil) type1 := arvados.InstanceType{Name: "a1s", ProviderType: "a1.small", VCPUs: 1, RAM: 1 * GiB, Price: .01} @@ -155,7 +217,7 @@ func (suite *PoolSuite) TestCreateUnallocShutdown(c *check.C) { type3 := arvados.InstanceType{Name: "a2l", ProviderType: "a2.large", VCPUs: 4, RAM: 4 * GiB, Price: .04} pool := &Pool{ logger: logger, - newExecutor: func(cloud.Instance) Executor { return stubExecutor{} }, + newExecutor: func(cloud.Instance) Executor { return &stubExecutor{} }, instanceSet: &throttledInstanceSet{InstanceSet: instanceSet}, instanceTypes: arvados.InstanceTypeMap{ type1.Name: type1,