X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b29c13b372bd39075eabda49ea57b0cb6d5a8452..79a9d03d3470ef013a908051a2bccddc680ecb5c:/sdk/go/arvados/config.go diff --git a/sdk/go/arvados/config.go b/sdk/go/arvados/config.go index 0225736c2d..c723be7d10 100644 --- a/sdk/go/arvados/config.go +++ b/sdk/go/arvados/config.go @@ -5,6 +5,8 @@ package arvados import ( + "encoding/json" + "errors" "fmt" "os" @@ -48,18 +50,25 @@ func (sc *Config) GetCluster(clusterID string) (*Cluster, error) { } } +type RequestLimits struct { + MaxItemsPerResponse int + MultiClusterRequestConcurrency int +} + type Cluster struct { ClusterID string `json:"-"` ManagementToken string NodeProfiles map[string]NodeProfile - InstanceTypes []InstanceType + InstanceTypes InstanceTypeMap HTTPRequestTimeout Duration RemoteClusters map[string]RemoteCluster PostgreSQL PostgreSQL + RequestLimits RequestLimits } type PostgreSQL struct { - Connection PostgreSQLConnection + Connection PostgreSQLConnection + ConnectionPool int } type PostgreSQLConnection map[string]string @@ -80,12 +89,52 @@ type InstanceType struct { Name string ProviderType string VCPUs int - RAM int64 - Scratch int64 + RAM ByteSize + Scratch ByteSize Price float64 Preemptible bool } +type InstanceTypeMap map[string]InstanceType + +var errDuplicateInstanceTypeName = errors.New("duplicate instance type name") + +// UnmarshalJSON handles old config files that provide an array of +// instance types instead of a hash. +func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error { + if len(data) > 0 && data[0] == '[' { + var arr []InstanceType + err := json.Unmarshal(data, &arr) + if err != nil { + return err + } + if len(arr) == 0 { + *it = nil + return nil + } + *it = make(map[string]InstanceType, len(arr)) + for _, t := range arr { + if _, ok := (*it)[t.Name]; ok { + return errDuplicateInstanceTypeName + } + (*it)[t.Name] = t + } + return nil + } + var hash map[string]InstanceType + err := json.Unmarshal(data, &hash) + if err != nil { + return err + } + // Fill in Name field using hash key. + *it = InstanceTypeMap(hash) + for name, t := range *it { + t.Name = name + (*it)[name] = t + } + return nil +} + // GetNodeProfile returns a NodeProfile for the given hostname. An // error is returned if the appropriate configuration can't be // determined (e.g., this does not appear to be a system node). If @@ -149,6 +198,20 @@ func (np *NodeProfile) ServicePorts() map[ServiceName]string { } } +func (h RequestLimits) GetMultiClusterRequestConcurrency() int { + if h.MultiClusterRequestConcurrency == 0 { + return 4 + } + return h.MultiClusterRequestConcurrency +} + +func (h RequestLimits) GetMaxItemsPerResponse() int { + if h.MaxItemsPerResponse == 0 { + return 1000 + } + return h.MaxItemsPerResponse +} + type SystemServiceInstance struct { Listen string TLS bool