X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2f4429e623199b9820d2296cf3788300caa7394b..3d5a798ef6f4bd3b1a771bacdf0acf70edf6c1f5:/lib/dispatchcloud/driver.go?ds=sidebyside diff --git a/lib/dispatchcloud/driver.go b/lib/dispatchcloud/driver.go index 6162c81b63..44adc23fd3 100644 --- a/lib/dispatchcloud/driver.go +++ b/lib/dispatchcloud/driver.go @@ -8,27 +8,32 @@ import ( "fmt" "time" - "git.curoverse.com/arvados.git/lib/cloud" - "git.curoverse.com/arvados.git/lib/cloud/azure" - "git.curoverse.com/arvados.git/lib/cloud/ec2" - "git.curoverse.com/arvados.git/sdk/go/arvados" + "git.arvados.org/arvados.git/lib/cloud" + "git.arvados.org/arvados.git/lib/cloud/azure" + "git.arvados.org/arvados.git/lib/cloud/ec2" + "git.arvados.org/arvados.git/lib/cloud/loopback" + "git.arvados.org/arvados.git/sdk/go/arvados" "github.com/prometheus/client_golang/prometheus" "github.com/sirupsen/logrus" "golang.org/x/crypto/ssh" ) -var drivers = map[string]cloud.Driver{ - "azure": azure.Driver, - "ec2": ec2.Driver, +// Drivers is a map of available cloud drivers. +// Clusters.*.Containers.CloudVMs.Driver configuration values +// correspond to keys in this map. +var Drivers = map[string]cloud.Driver{ + "azure": azure.Driver, + "ec2": ec2.Driver, + "loopback": loopback.Driver, } func newInstanceSet(cluster *arvados.Cluster, setID cloud.InstanceSetID, logger logrus.FieldLogger, reg *prometheus.Registry) (cloud.InstanceSet, error) { - driver, ok := drivers[cluster.Containers.CloudVMs.Driver] + driver, ok := Drivers[cluster.Containers.CloudVMs.Driver] if !ok { return nil, fmt.Errorf("unsupported cloud driver %q", cluster.Containers.CloudVMs.Driver) } sharedResourceTags := cloud.SharedResourceTags(cluster.Containers.CloudVMs.ResourceTags) - is, err := driver.InstanceSet(cluster.Containers.CloudVMs.DriverParameters, setID, sharedResourceTags, logger) + is, err := driver.InstanceSet(cluster.Containers.CloudVMs.DriverParameters, setID, sharedResourceTags, logger, reg) is = newInstrumentedInstanceSet(is, reg) if maxops := cluster.Containers.CloudVMs.MaxCloudOpsPerSecond; maxops > 0 { is = rateLimitedInstanceSet{ @@ -52,6 +57,15 @@ type rateLimitedInstanceSet struct { ticker *time.Ticker } +func (is rateLimitedInstanceSet) Instances(tags cloud.InstanceTags) ([]cloud.Instance, error) { + <-is.ticker.C + insts, err := is.InstanceSet.Instances(tags) + for i, inst := range insts { + insts[i] = &rateLimitedInstance{inst, is.ticker} + } + return insts, err +} + func (is rateLimitedInstanceSet) Create(it arvados.InstanceType, image cloud.ImageID, tags cloud.InstanceTags, init cloud.InitCommand, pk ssh.PublicKey) (cloud.Instance, error) { <-is.ticker.C inst, err := is.InstanceSet.Create(it, image, tags, init, pk) @@ -68,6 +82,11 @@ func (inst *rateLimitedInstance) Destroy() error { return inst.Instance.Destroy() } +func (inst *rateLimitedInstance) SetTags(tags cloud.InstanceTags) error { + <-inst.ticker.C + return inst.Instance.SetTags(tags) +} + // Adds the specified defaultTags to every Create() call. type defaultTaggingInstanceSet struct { cloud.InstanceSet @@ -85,7 +104,7 @@ func (is defaultTaggingInstanceSet) Create(it arvados.InstanceType, image cloud. return is.InstanceSet.Create(it, image, allTags, init, pk) } -// Filters the instances returned by the wrapped InstanceSet's +// Filter the instances returned by the wrapped InstanceSet's // Instances() method (in case the wrapped InstanceSet didn't do this // itself). type filteringInstanceSet struct { @@ -177,7 +196,6 @@ func (inst instrumentedInstance) SetTags(tags cloud.InstanceTags) error { func boolLabelValue(v bool) string { if v { return "1" - } else { - return "0" } + return "0" }