Merge branch '21201-doc-bundle-update'
[arvados.git] / sdk / go / arvados / config.go
index b8c8269f12acba74feb00edc07ec7949e0db5fc4..e2ad7b089db80a14191b89470985bd2a56759b19 100644 (file)
@@ -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 {
@@ -94,21 +95,29 @@ type Cluster struct {
        PostgreSQL      PostgreSQL
 
        API struct {
-               AsyncPermissionsUpdateInterval Duration
-               DisabledAPIs                   StringSet
-               MaxIndexDatabaseRead           int
-               MaxItemsPerResponse            int
-               MaxConcurrentRequests          int
-               MaxKeepBlobBuffers             int
-               MaxRequestAmplification        int
-               MaxRequestSize                 int
-               MaxTokenLifetime               Duration
-               RequestTimeout                 Duration
-               SendTimeout                    Duration
-               WebsocketClientEventQueue      int
-               WebsocketServerEventQueue      int
-               KeepServiceRequestTimeout      Duration
-               VocabularyPath                 string
+               AsyncPermissionsUpdateInterval   Duration
+               DisabledAPIs                     StringSet
+               MaxIndexDatabaseRead             int
+               MaxItemsPerResponse              int
+               MaxConcurrentRailsRequests       int
+               MaxConcurrentRequests            int
+               MaxQueuedRequests                int
+               MaxQueueTimeForLockRequests      Duration
+               LogCreateRequestFraction         float64
+               MaxKeepBlobBuffers               int
+               MaxRequestAmplification          int
+               MaxRequestSize                   int
+               MaxTokenLifetime                 Duration
+               RequestTimeout                   Duration
+               SendTimeout                      Duration
+               WebsocketClientEventQueue        int
+               WebsocketServerEventQueue        int
+               KeepServiceRequestTimeout        Duration
+               VocabularyPath                   string
+               FreezeProjectRequiresDescription bool
+               FreezeProjectRequiresProperties  StringSet
+               UnfreezeProjectRequiresAdmin     bool
+               LockBeforeUpdate                 bool
        }
        AuditLogs struct {
                MaxAge             Duration
@@ -141,6 +150,8 @@ type Cluster struct {
                BalanceCollectionBuffers int
                BalanceTimeout           Duration
                BalanceUpdateLimit       int
+               BalancePullLimit         int
+               BalanceTrashLimit        int
 
                WebDAVCache WebDAVCacheConfig
 
@@ -159,6 +170,7 @@ type Cluster struct {
                        URL                URL
                        StartTLS           bool
                        InsecureTLS        bool
+                       MinTLSVersion      TLSVersion
                        StripDomain        string
                        AppendDomain       string
                        SearchAttribute    string
@@ -197,11 +209,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
@@ -213,14 +226,18 @@ type Cluster struct {
                EmailFrom                      string
        }
        SystemLogs struct {
-               LogLevel                string
-               Format                  string
-               MaxRequestLogParamsSize int
+               LogLevel                  string
+               Format                    string
+               MaxRequestLogParamsSize   int
+               RequestQueueDumpDirectory string
        }
        TLS struct {
                Certificate string
                Key         string
                Insecure    bool
+               ACME        struct {
+                       Server string
+               }
        }
        Users struct {
                ActivatedUsersAreVisibleToOthers      bool
@@ -242,6 +259,14 @@ type Cluster struct {
                PreferDomainForUsername               string
                UserSetupMailText                     string
                RoleGroupsVisibleToAll                bool
+               CanCreateRoleGroups                   bool
+               ActivityLoggingPeriod                 Duration
+               SyncIgnoredGroups                     []string
+               SyncRequiredGroups                    []string
+               SyncUserAccounts                      bool
+               SyncUserAPITokens                     bool
+               SyncUserGroups                        bool
+               SyncUserSSHKeys                       bool
        }
        StorageClasses map[string]StorageClassConfig
        Volumes        map[string]Volume
@@ -254,6 +279,7 @@ type Cluster struct {
                ArvadosDocsite                   string
                ArvadosPublicDataDocURL          string
                DefaultOpenIdPrefix              string
+               DisableSharingURLsUI             bool
                EnableGettingStartedPopup        bool
                EnablePublicProjectsPage         bool
                FileViewersConfigURL             string
@@ -283,6 +309,7 @@ type Cluster struct {
                SSHHelpPageHTML        string
                SSHHelpHostSuffix      string
                IdleTimeout            Duration
+               BannerUUID             string
        }
 }
 
@@ -292,12 +319,13 @@ type StorageClassConfig struct {
 }
 
 type Volume struct {
-       AccessViaHosts   map[URL]VolumeAccess
-       ReadOnly         bool
-       Replication      int
-       StorageClasses   map[string]bool
-       Driver           string
-       DriverParameters json.RawMessage
+       AccessViaHosts         map[URL]VolumeAccess
+       ReadOnly               bool
+       AllowTrashWhenReadOnly bool
+       Replication            int
+       StorageClasses         map[string]bool
+       Driver                 string
+       DriverParameters       json.RawMessage
 }
 
 type S3VolumeDriverParameters struct {
@@ -309,7 +337,6 @@ type S3VolumeDriverParameters struct {
        Bucket             string
        LocationConstraint bool
        V2Signature        bool
-       UseAWSS3v2Driver   bool
        IndexPageSize      int
        ConnectTimeout     Duration
        ReadTimeout        Duration
@@ -342,6 +369,7 @@ type Services struct {
        Controller     Service
        DispatchCloud  Service
        DispatchLSF    Service
+       DispatchSLURM  Service
        GitHTTP        Service
        GitSSH         Service
        Health         Service
@@ -385,14 +413,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"`
 }
 
@@ -418,11 +492,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
@@ -437,7 +511,6 @@ type ContainersConfig struct {
        DefaultKeepCacheRAM           ByteSize
        DispatchPrivateKey            string
        LogReuseDecisions             bool
-       MaxComputeVMs                 int
        MaxDispatchAttempts           int
        MaxRetryAttempts              int
        MinRetryPeriod                Duration
@@ -445,6 +518,8 @@ type ContainersConfig struct {
        StaleLockTimeout              Duration
        SupportedDockerImageFormats   StringSet
        AlwaysUsePreemptibleInstances bool
+       PreemptiblePriceFactor        float64
+       MaximumPriceFactor            float64
        RuntimeEngine                 string
        LocalKeepBlobBuffersPerVCPU   int
        LocalKeepLogsToContainerLog   string
@@ -455,6 +530,7 @@ type ContainersConfig struct {
        }
        Logging struct {
                MaxAge                       Duration
+               SweepInterval                Duration
                LogBytesPerEvent             int
                LogSecondsBetweenEvents      Duration
                LogThrottlePeriod            Duration
@@ -494,11 +570,16 @@ type CloudVMsConfig struct {
        Enable bool
 
        BootProbeCommand               string
+       InstanceInitCommand            string
        DeployRunnerBinary             string
+       DeployPublicKey                bool
        ImageID                        string
        MaxCloudOpsPerSecond           int
        MaxProbesPerSecond             int
        MaxConcurrentInstanceCreateOps int
+       MaxInstances                   int
+       InitialQuotaEstimate           int
+       SupervisorFraction             float64
        PollInterval                   Duration
        ProbeInterval                  Duration
        SSHPort                        string
@@ -521,49 +602,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)
@@ -621,35 +678,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,
        }
 }