18947: Refactor arv-git-httpd as an arvados-server subcommand.
[arvados.git] / sdk / go / arvados / config.go
index 7ab8d9e1f64e0260125a010be633062cb4305fa9..1295350a4dd066d8960566cf854ebb69117d6839 100644 (file)
@@ -17,9 +17,8 @@ import (
 var DefaultConfigFile = func() string {
        if path := os.Getenv("ARVADOS_CONFIG"); path != "" {
                return path
-       } else {
-               return "/etc/arvados/config.yml"
        }
+       return "/etc/arvados/config.yml"
 }()
 
 type Config struct {
@@ -50,12 +49,12 @@ func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
                        }
                }
        }
-       if cc, ok := sc.Clusters[clusterID]; !ok {
+       cc, ok := sc.Clusters[clusterID]
+       if !ok {
                return nil, fmt.Errorf("cluster %q is not configured", clusterID)
-       } else {
-               cc.ClusterID = clusterID
-               return &cc, nil
        }
+       cc.ClusterID = clusterID
+       return &cc, nil
 }
 
 type WebDAVCacheConfig struct {
@@ -64,8 +63,24 @@ type WebDAVCacheConfig struct {
        MaxBlockEntries      int
        MaxCollectionEntries int
        MaxCollectionBytes   int64
-       MaxPermissionEntries int
        MaxUUIDEntries       int
+       MaxSessions          int
+}
+
+type UploadDownloadPermission struct {
+       Upload   bool
+       Download bool
+}
+
+type UploadDownloadRolePermissions struct {
+       User  UploadDownloadPermission
+       Admin UploadDownloadPermission
+}
+
+type ManagedProperties map[string]struct {
+       Value     interface{}
+       Function  string
+       Protected bool
 }
 
 type Cluster struct {
@@ -79,20 +94,24 @@ type Cluster struct {
        PostgreSQL      PostgreSQL
 
        API struct {
-               AsyncPermissionsUpdateInterval Duration
-               DisabledAPIs                   StringSet
-               MaxIndexDatabaseRead           int
-               MaxItemsPerResponse            int
-               MaxConcurrentRequests          int
-               MaxKeepBlobBuffers             int
-               MaxRequestAmplification        int
-               MaxRequestSize                 int
-               RailsSessionSecretToken        string
-               RequestTimeout                 Duration
-               SendTimeout                    Duration
-               WebsocketClientEventQueue      int
-               WebsocketServerEventQueue      int
-               KeepServiceRequestTimeout      Duration
+               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
+               FreezeProjectRequiresDescription bool
+               FreezeProjectRequiresProperties  StringSet
+               UnfreezeProjectRequiresAdmin     bool
        }
        AuditLogs struct {
                MaxAge             Duration
@@ -100,34 +119,37 @@ type Cluster struct {
                UnloggedAttributes StringSet
        }
        Collections struct {
-               BlobSigning              bool
-               BlobSigningKey           string
-               BlobSigningTTL           Duration
-               BlobTrash                bool
-               BlobTrashLifetime        Duration
-               BlobTrashCheckInterval   Duration
-               BlobTrashConcurrency     int
-               BlobDeleteConcurrency    int
-               BlobReplicateConcurrency int
-               CollectionVersioning     bool
-               DefaultTrashLifetime     Duration
-               DefaultReplication       int
-               ManagedProperties        map[string]struct {
-                       Value     interface{}
-                       Function  string
-                       Protected bool
-               }
+               BlobSigning                  bool
+               BlobSigningKey               string
+               BlobSigningTTL               Duration
+               BlobTrash                    bool
+               BlobTrashLifetime            Duration
+               BlobTrashCheckInterval       Duration
+               BlobTrashConcurrency         int
+               BlobDeleteConcurrency        int
+               BlobReplicateConcurrency     int
+               CollectionVersioning         bool
+               DefaultTrashLifetime         Duration
+               DefaultReplication           int
+               ManagedProperties            ManagedProperties
                PreserveVersionIfIdle        Duration
                TrashSweepInterval           Duration
                TrustAllContent              bool
                ForwardSlashNameSubstitution string
+               S3FolderObjects              bool
 
                BlobMissingReport        string
                BalancePeriod            Duration
                BalanceCollectionBatch   int
                BalanceCollectionBuffers int
+               BalanceTimeout           Duration
+               BalanceUpdateLimit       int
 
                WebDAVCache WebDAVCacheConfig
+
+               KeepproxyPermission UploadDownloadRolePermissions
+               WebDAVPermission    UploadDownloadRolePermissions
+               WebDAVLogEvents     bool
        }
        Git struct {
                GitCommand   string
@@ -151,23 +173,38 @@ type Cluster struct {
                        UsernameAttribute  string
                }
                Google struct {
-                       Enable                  bool
-                       ClientID                string
-                       ClientSecret            string
-                       AlternateEmailAddresses bool
+                       Enable                          bool
+                       ClientID                        string
+                       ClientSecret                    string
+                       AlternateEmailAddresses         bool
+                       AuthenticationRequestParameters map[string]string
+               }
+               OpenIDConnect struct {
+                       Enable                          bool
+                       Issuer                          string
+                       ClientID                        string
+                       ClientSecret                    string
+                       EmailClaim                      string
+                       EmailVerifiedClaim              string
+                       UsernameClaim                   string
+                       AcceptAccessToken               bool
+                       AcceptAccessTokenScope          string
+                       AuthenticationRequestParameters map[string]string
                }
                PAM struct {
                        Enable             bool
                        Service            string
                        DefaultEmailDomain string
                }
-               SSO struct {
-                       Enable            bool
-                       ProviderAppID     string
-                       ProviderAppSecret string
+               Test struct {
+                       Enable bool
+                       Users  map[string]TestUser
                }
                LoginCluster       string
                RemoteTokenRefresh Duration
+               TokenLifetime      Duration
+               TrustedClients     map[string]struct{}
+               IssueTrustedTokens bool
        }
        Mail struct {
                MailchimpAPIKey                string
@@ -189,6 +226,7 @@ type Cluster struct {
                Insecure    bool
        }
        Users struct {
+               ActivatedUsersAreVisibleToOthers      bool
                AnonymousUserToken                    string
                AdminNotifierEmailFrom                string
                AutoAdminFirstUser                    bool
@@ -202,11 +240,15 @@ type Cluster struct {
                NewUserNotificationRecipients         StringSet
                NewUsersAreActive                     bool
                UserNotifierEmailFrom                 string
+               UserNotifierEmailBcc                  StringSet
                UserProfileNotificationAddress        string
                PreferDomainForUsername               string
+               UserSetupMailText                     string
+               RoleGroupsVisibleToAll                bool
        }
-       Volumes   map[string]Volume
-       Workbench struct {
+       StorageClasses map[string]StorageClassConfig
+       Volumes        map[string]Volume
+       Workbench      struct {
                ActivationContactLink            string
                APIClientConnectTimeout          Duration
                APIClientReceiveTimeout          Duration
@@ -239,14 +281,17 @@ type Cluster struct {
                        Options              map[string]struct{}
                }
                UserProfileFormMessage string
-               VocabularyURL          string
                WelcomePageHTML        string
                InactivePageHTML       string
                SSHHelpPageHTML        string
                SSHHelpHostSuffix      string
+               IdleTimeout            Duration
        }
+}
 
-       ForceLegacyAPI14 bool
+type StorageClassConfig struct {
+       Default  bool
+       Priority int
 }
 
 type Volume struct {
@@ -259,17 +304,21 @@ type Volume struct {
 }
 
 type S3VolumeDriverParameters struct {
-       AccessKey          string
-       SecretKey          string
+       IAMRole            string
+       AccessKeyID        string
+       SecretAccessKey    string
        Endpoint           string
        Region             string
        Bucket             string
        LocationConstraint bool
+       V2Signature        bool
+       UseAWSS3v2Driver   bool
        IndexPageSize      int
        ConnectTimeout     Duration
        ReadTimeout        Duration
        RaceWindow         Duration
        UnsafeDelete       bool
+       PrefixLength       int
 }
 
 type AzureVolumeDriverParameters struct {
@@ -295,15 +344,14 @@ type Services struct {
        Composer       Service
        Controller     Service
        DispatchCloud  Service
+       DispatchLSF    Service
        GitHTTP        Service
        GitSSH         Service
        Health         Service
        Keepbalance    Service
        Keepproxy      Service
        Keepstore      Service
-       Nodemanager    Service
        RailsAPI       Service
-       SSO            Service
        WebDAVDownload Service
        WebDAV         Service
        WebShell       Service
@@ -317,6 +365,11 @@ type Service struct {
        ExternalURL  URL
 }
 
+type TestUser struct {
+       Email    string
+       Password string
+}
+
 // URL is a url.URL that is also usable as a JSON key/value.
 type URL url.URL
 
@@ -326,6 +379,10 @@ func (su *URL) UnmarshalText(text []byte) error {
        u, err := url.Parse(string(text))
        if err == nil {
                *su = URL(*u)
+               if su.Path == "" && su.Host != "" {
+                       // http://example really means http://example/
+                       su.Path = "/"
+               }
        }
        return err
 }
@@ -357,6 +414,12 @@ type RemoteCluster struct {
        ActivateUsers bool
 }
 
+type CUDAFeatures struct {
+       DriverVersion      string
+       HardwareCapability string
+       DeviceCount        int
+}
+
 type InstanceType struct {
        Name            string
        ProviderType    string
@@ -367,23 +430,28 @@ type InstanceType struct {
        AddedScratch    ByteSize
        Price           float64
        Preemptible     bool
+       CUDA            CUDAFeatures
 }
 
 type ContainersConfig struct {
-       CloudVMs                    CloudVMsConfig
-       CrunchRunCommand            string
-       CrunchRunArgumentsList      []string
-       DefaultKeepCacheRAM         ByteSize
-       DispatchPrivateKey          string
-       LogReuseDecisions           bool
-       MaxComputeVMs               int
-       MaxDispatchAttempts         int
-       MaxRetryAttempts            int
-       MinRetryPeriod              Duration
-       ReserveExtraRAM             ByteSize
-       StaleLockTimeout            Duration
-       SupportedDockerImageFormats StringSet
-       UsePreemptibleInstances     bool
+       CloudVMs                      CloudVMsConfig
+       CrunchRunCommand              string
+       CrunchRunArgumentsList        []string
+       DefaultKeepCacheRAM           ByteSize
+       DispatchPrivateKey            string
+       LogReuseDecisions             bool
+       MaxComputeVMs                 int
+       MaxDispatchAttempts           int
+       MaxRetryAttempts              int
+       MinRetryPeriod                Duration
+       ReserveExtraRAM               ByteSize
+       StaleLockTimeout              Duration
+       SupportedDockerImageFormats   StringSet
+       AlwaysUsePreemptibleInstances bool
+       PreemptiblePriceFactor        float64
+       RuntimeEngine                 string
+       LocalKeepBlobBuffersPerVCPU   int
+       LocalKeepLogsToContainerLog   string
 
        JobsAPI struct {
                Enable         string
@@ -401,6 +469,10 @@ type ContainersConfig struct {
                LogUpdatePeriod              Duration
                LogUpdateSize                ByteSize
        }
+       ShellAccess struct {
+               Admin bool
+               User  bool
+       }
        SLURM struct {
                PrioritySpread             int64
                SbatchArgumentsList        []string
@@ -415,28 +487,35 @@ type ContainersConfig struct {
                        AssignNodeHostname     string
                }
        }
+       LSF struct {
+               BsubSudoUser      string
+               BsubArgumentsList []string
+               BsubCUDAArguments []string
+       }
 }
 
 type CloudVMsConfig struct {
        Enable bool
 
-       BootProbeCommand     string
-       DeployRunnerBinary   string
-       ImageID              string
-       MaxCloudOpsPerSecond int
-       MaxProbesPerSecond   int
-       PollInterval         Duration
-       ProbeInterval        Duration
-       SSHPort              string
-       SyncInterval         Duration
-       TimeoutBooting       Duration
-       TimeoutIdle          Duration
-       TimeoutProbe         Duration
-       TimeoutShutdown      Duration
-       TimeoutSignal        Duration
-       TimeoutTERM          Duration
-       ResourceTags         map[string]string
-       TagKeyPrefix         string
+       BootProbeCommand               string
+       DeployRunnerBinary             string
+       ImageID                        string
+       MaxCloudOpsPerSecond           int
+       MaxProbesPerSecond             int
+       MaxConcurrentInstanceCreateOps int
+       PollInterval                   Duration
+       ProbeInterval                  Duration
+       SSHPort                        string
+       SyncInterval                   Duration
+       TimeoutBooting                 Duration
+       TimeoutIdle                    Duration
+       TimeoutProbe                   Duration
+       TimeoutShutdown                Duration
+       TimeoutSignal                  Duration
+       TimeoutStaleRunLock            Duration
+       TimeoutTERM                    Duration
+       ResourceTags                   map[string]string
+       TagKeyPrefix                   string
 
        Driver           string
        DriverParameters json.RawMessage
@@ -536,7 +615,7 @@ func (ss *StringSet) UnmarshalJSON(data []byte) error {
                return err
        }
        *ss = make(map[string]struct{}, len(hash))
-       for t, _ := range hash {
+       for t := range hash {
                (*ss)[t] = struct{}{}
        }
 
@@ -546,35 +625,37 @@ 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"
+       ServiceNameGitHTTP       ServiceName = "arvados-git-httpd"
        ServiceNameHealth        ServiceName = "arvados-health"
-       ServiceNameNodemanager   ServiceName = "arvados-node-manager"
-       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,
+               ServiceNameGitHTTP:       svcs.GitHTTP,
                ServiceNameHealth:        svcs.Health,
-               ServiceNameNodemanager:   svcs.Nodemanager,
-               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,
        }
 }