X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/44c93373e97da98645d41ae8f09c6eef6788bb26..f0cc5e25d9f8b93405994f86f6eb74250622056f:/sdk/go/arvados/config.go diff --git a/sdk/go/arvados/config.go b/sdk/go/arvados/config.go index e0750bd8c5..677706c082 100644 --- a/sdk/go/arvados/config.go +++ b/sdk/go/arvados/config.go @@ -5,11 +5,13 @@ package arvados import ( + "crypto/tls" "encoding/json" "errors" "fmt" "net/url" "os" + "time" "git.arvados.org/arvados.git/sdk/go/config" ) @@ -24,6 +26,8 @@ var DefaultConfigFile = func() string { type Config struct { Clusters map[string]Cluster AutoReloadConfig bool + SourceTimestamp time.Time + SourceSHA256 string } // GetConfig returns the current system config, loading it from @@ -58,13 +62,10 @@ func (sc *Config) GetCluster(clusterID string) (*Cluster, error) { } type WebDAVCacheConfig struct { - TTL Duration - UUIDTTL Duration - MaxBlockEntries int - MaxCollectionEntries int - MaxCollectionBytes int64 - MaxUUIDEntries int - MaxSessions int + TTL Duration + MaxBlockEntries int + MaxCollectionBytes int64 + MaxSessions int } type UploadDownloadPermission struct { @@ -112,6 +113,7 @@ type Cluster struct { FreezeProjectRequiresDescription bool FreezeProjectRequiresProperties StringSet UnfreezeProjectRequiresAdmin bool + LockBeforeUpdate bool } AuditLogs struct { MaxAge Duration @@ -162,6 +164,7 @@ type Cluster struct { URL URL StartTLS bool InsecureTLS bool + MinTLSVersion TLSVersion StripDomain string AppendDomain string SearchAttribute string @@ -200,11 +203,12 @@ type Cluster struct { Enable bool Users map[string]TestUser } - LoginCluster string - RemoteTokenRefresh Duration - TokenLifetime Duration - TrustedClients map[string]struct{} - IssueTrustedTokens bool + LoginCluster string + RemoteTokenRefresh Duration + TokenLifetime Duration + TrustedClients map[URL]struct{} + TrustPrivateNetworks bool + IssueTrustedTokens bool } Mail struct { MailchimpAPIKey string @@ -224,6 +228,9 @@ type Cluster struct { Certificate string Key string Insecure bool + ACME struct { + Server string + } } Users struct { ActivatedUsersAreVisibleToOthers bool @@ -245,6 +252,8 @@ type Cluster struct { PreferDomainForUsername string UserSetupMailText string RoleGroupsVisibleToAll bool + CanCreateRoleGroups bool + ActivityLoggingPeriod Duration } StorageClasses map[string]StorageClassConfig Volumes map[string]Volume @@ -257,6 +266,7 @@ type Cluster struct { ArvadosDocsite string ArvadosPublicDataDocURL string DefaultOpenIdPrefix string + DisableSharingURLsUI bool EnableGettingStartedPopup bool EnablePublicProjectsPage bool FileViewersConfigURL string @@ -286,6 +296,7 @@ type Cluster struct { SSHHelpPageHTML string SSHHelpHostSuffix string IdleTimeout Duration + BannerURL string } } @@ -345,6 +356,7 @@ type Services struct { Controller Service DispatchCloud Service DispatchLSF Service + DispatchSLURM Service GitHTTP Service GitSSH Service Health Service @@ -388,14 +400,60 @@ func (su *URL) UnmarshalText(text []byte) error { } func (su URL) MarshalText() ([]byte, error) { - return []byte(fmt.Sprintf("%s", (*url.URL)(&su).String())), nil + return []byte(su.String()), nil } func (su URL) String() string { return (*url.URL)(&su).String() } +type TLSVersion uint16 + +func (v TLSVersion) MarshalText() ([]byte, error) { + switch v { + case 0: + return []byte{}, nil + case tls.VersionTLS10: + return []byte("1.0"), nil + case tls.VersionTLS11: + return []byte("1.1"), nil + case tls.VersionTLS12: + return []byte("1.2"), nil + case tls.VersionTLS13: + return []byte("1.3"), nil + default: + return nil, fmt.Errorf("unsupported TLSVersion %x", v) + } +} + +func (v *TLSVersion) UnmarshalJSON(text []byte) error { + if len(text) > 0 && text[0] == '"' { + var s string + err := json.Unmarshal(text, &s) + if err != nil { + return err + } + text = []byte(s) + } + switch string(text) { + case "": + *v = 0 + case "1.0": + *v = tls.VersionTLS10 + case "1.1": + *v = tls.VersionTLS11 + case "1.2": + *v = tls.VersionTLS12 + case "1.3": + *v = tls.VersionTLS13 + default: + return fmt.Errorf("unsupported TLSVersion %q", text) + } + return nil +} + type ServiceInstance struct { + ListenURL URL Rendezvous string `json:",omitempty"` } @@ -421,11 +479,11 @@ type CUDAFeatures struct { } type InstanceType struct { - Name string + Name string `json:"-"` ProviderType string VCPUs int RAM ByteSize - Scratch ByteSize + Scratch ByteSize `json:"-"` IncludedScratch ByteSize AddedScratch ByteSize Price float64 @@ -440,7 +498,6 @@ type ContainersConfig struct { DefaultKeepCacheRAM ByteSize DispatchPrivateKey string LogReuseDecisions bool - MaxComputeVMs int MaxDispatchAttempts int MaxRetryAttempts int MinRetryPeriod Duration @@ -448,6 +505,7 @@ type ContainersConfig struct { StaleLockTimeout Duration SupportedDockerImageFormats StringSet AlwaysUsePreemptibleInstances bool + PreemptiblePriceFactor float64 RuntimeEngine string LocalKeepBlobBuffersPerVCPU int LocalKeepLogsToContainerLog string @@ -458,6 +516,7 @@ type ContainersConfig struct { } Logging struct { MaxAge Duration + SweepInterval Duration LogBytesPerEvent int LogSecondsBetweenEvents Duration LogThrottlePeriod Duration @@ -502,6 +561,7 @@ type CloudVMsConfig struct { MaxCloudOpsPerSecond int MaxProbesPerSecond int MaxConcurrentInstanceCreateOps int + MaxInstances int PollInterval Duration ProbeInterval Duration SSHPort string @@ -524,49 +584,25 @@ 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. +// UnmarshalJSON does special handling of InstanceTypes: +// +// - populate computed fields (Name and Scratch) +// +// - error out if InstancesTypes are populated as an array, which was +// deprecated in Arvados 1.2.0 func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error { fixup := func(t InstanceType) (InstanceType, error) { if t.ProviderType == "" { t.ProviderType = t.Name } - if t.Scratch == 0 { - t.Scratch = t.IncludedScratch + t.AddedScratch - } else if t.AddedScratch == 0 { - t.AddedScratch = t.Scratch - t.IncludedScratch - } else if t.IncludedScratch == 0 { - t.IncludedScratch = t.Scratch - t.AddedScratch - } - - if t.Scratch != (t.IncludedScratch + t.AddedScratch) { - return t, fmt.Errorf("InstanceType %q: Scratch != (IncludedScratch + AddedScratch)", t.Name) - } + // If t.Scratch is set in the configuration file, it will be ignored and overwritten. + // It will also generate a "deprecated or unknown config entry" warning. + t.Scratch = t.IncludedScratch + t.AddedScratch return t, nil } 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 - } - t, err := fixup(t) - if err != nil { - return err - } - (*it)[t.Name] = t - } - return nil + return fmt.Errorf("InstanceTypes must be specified as a map, not an array, see https://doc.arvados.org/admin/config.html") } var hash map[string]InstanceType err := json.Unmarshal(data, &hash) @@ -624,35 +660,39 @@ func (ss *StringSet) UnmarshalJSON(data []byte) error { type ServiceName string const ( - ServiceNameRailsAPI ServiceName = "arvados-api-server" ServiceNameController ServiceName = "arvados-controller" ServiceNameDispatchCloud ServiceName = "arvados-dispatch-cloud" ServiceNameDispatchLSF ServiceName = "arvados-dispatch-lsf" + ServiceNameDispatchSLURM ServiceName = "crunch-dispatch-slurm" + ServiceNameGitHTTP ServiceName = "arvados-git-httpd" ServiceNameHealth ServiceName = "arvados-health" - ServiceNameWorkbench1 ServiceName = "arvados-workbench1" - ServiceNameWorkbench2 ServiceName = "arvados-workbench2" - ServiceNameWebsocket ServiceName = "arvados-ws" ServiceNameKeepbalance ServiceName = "keep-balance" - ServiceNameKeepweb ServiceName = "keep-web" ServiceNameKeepproxy ServiceName = "keepproxy" ServiceNameKeepstore ServiceName = "keepstore" + ServiceNameKeepweb ServiceName = "keep-web" + ServiceNameRailsAPI ServiceName = "arvados-api-server" + ServiceNameWebsocket ServiceName = "arvados-ws" + ServiceNameWorkbench1 ServiceName = "arvados-workbench1" + ServiceNameWorkbench2 ServiceName = "arvados-workbench2" ) // Map returns all services as a map, suitable for iterating over all // services or looking up a service by name. func (svcs Services) Map() map[ServiceName]Service { return map[ServiceName]Service{ - ServiceNameRailsAPI: svcs.RailsAPI, ServiceNameController: svcs.Controller, ServiceNameDispatchCloud: svcs.DispatchCloud, ServiceNameDispatchLSF: svcs.DispatchLSF, + ServiceNameDispatchSLURM: svcs.DispatchSLURM, + ServiceNameGitHTTP: svcs.GitHTTP, ServiceNameHealth: svcs.Health, - ServiceNameWorkbench1: svcs.Workbench1, - ServiceNameWorkbench2: svcs.Workbench2, - ServiceNameWebsocket: svcs.Websocket, ServiceNameKeepbalance: svcs.Keepbalance, - ServiceNameKeepweb: svcs.WebDAV, ServiceNameKeepproxy: svcs.Keepproxy, ServiceNameKeepstore: svcs.Keepstore, + ServiceNameKeepweb: svcs.WebDAV, + ServiceNameRailsAPI: svcs.RailsAPI, + ServiceNameWebsocket: svcs.Websocket, + ServiceNameWorkbench1: svcs.Workbench1, + ServiceNameWorkbench2: svcs.Workbench2, } }