Merge branch 'master' into 14716-webdav-cluster-config
[arvados.git] / sdk / go / arvados / config.go
index fb01f25f8c7eb3948c68f9ef17497972dfd949be..db4e6dcd89a3e858f67eb7e4ded3531a19f2d3b4 100644 (file)
@@ -9,11 +9,18 @@ import (
        "errors"
        "fmt"
        "net/url"
+       "os"
 
        "git.curoverse.com/arvados.git/sdk/go/config"
 )
 
-const DefaultConfigFile = "/etc/arvados/config.yml"
+var DefaultConfigFile = func() string {
+       if path := os.Getenv("ARVADOS_CONFIG"); path != "" {
+               return path
+       } else {
+               return "/etc/arvados/config.yml"
+       }
+}()
 
 type Config struct {
        Clusters map[string]Cluster
@@ -50,6 +57,14 @@ func (sc *Config) GetCluster(clusterID string) (*Cluster, error) {
        }
 }
 
+type WebDAVCacheConfig struct {
+       TTL                  Duration
+       UUIDTTL              Duration
+       MaxCollectionEntries int
+       MaxCollectionBytes   int64
+       MaxPermissionEntries int
+       MaxUUIDEntries       int
+}
 type Cluster struct {
        ClusterID       string `json:"-"`
        ManagementToken string
@@ -62,28 +77,39 @@ type Cluster struct {
 
        API struct {
                AsyncPermissionsUpdateInterval Duration
-               DisabledAPIs                   []string
+               DisabledAPIs                   StringSet
                MaxIndexDatabaseRead           int
                MaxItemsPerResponse            int
                MaxRequestAmplification        int
                MaxRequestSize                 int
                RailsSessionSecretToken        string
                RequestTimeout                 Duration
+               SendTimeout                    Duration
+               WebsocketClientEventQueue      int
+               WebsocketServerEventQueue      int
        }
        AuditLogs struct {
                MaxAge             Duration
                MaxDeleteBatch     int
-               UnloggedAttributes []string
+               UnloggedAttributes StringSet
        }
        Collections struct {
-               BlobSigning           bool
-               BlobSigningKey        string
-               DefaultReplication    int
-               BlobSigningTTL        Duration
-               DefaultTrashLifetime  Duration
-               TrashSweepInterval    Duration
-               CollectionVersioning  bool
+               BlobSigning          bool
+               BlobSigningKey       string
+               BlobSigningTTL       Duration
+               CollectionVersioning bool
+               DefaultTrashLifetime Duration
+               DefaultReplication   int
+               ManagedProperties    map[string]struct {
+                       Value     interface{}
+                       Function  string
+                       Protected bool
+               }
                PreserveVersionIfIdle Duration
+               TrashSweepInterval    Duration
+               TrustAllContent       bool
+
+               WebDAVCache WebDAVCacheConfig
        }
        Git struct {
                Repositories string
@@ -95,7 +121,7 @@ type Cluster struct {
        Mail struct {
                MailchimpAPIKey                string
                MailchimpListID                string
-               SendUserSetupNotificationEmail string
+               SendUserSetupNotificationEmail bool
                IssueReporterEmailFrom         string
                IssueReporterEmailTo           string
                SupportEmailAddress            string
@@ -112,20 +138,58 @@ type Cluster struct {
                Insecure    bool
        }
        Users struct {
+               AnonymousUserToken                    string
                AdminNotifierEmailFrom                string
                AutoAdminFirstUser                    bool
                AutoAdminUserWithEmail                string
                AutoSetupNewUsers                     bool
                AutoSetupNewUsersWithRepository       bool
                AutoSetupNewUsersWithVmUUID           string
-               AutoSetupUsernameBlacklist            []string
+               AutoSetupUsernameBlacklist            StringSet
                EmailSubjectPrefix                    string
-               NewInactiveUserNotificationRecipients []string
-               NewUserNotificationRecipients         []string
+               NewInactiveUserNotificationRecipients StringSet
+               NewUserNotificationRecipients         StringSet
                NewUsersAreActive                     bool
                UserNotifierEmailFrom                 string
                UserProfileNotificationAddress        string
        }
+       Workbench struct {
+               ActivationContactLink            string
+               APIClientConnectTimeout          Duration
+               APIClientReceiveTimeout          Duration
+               APIResponseCompression           bool
+               ApplicationMimetypesWithViewIcon StringSet
+               ArvadosDocsite                   string
+               ArvadosPublicDataDocURL          string
+               DefaultOpenIdPrefix              string
+               EnableGettingStartedPopup        bool
+               EnablePublicProjectsPage         bool
+               FileViewersConfigURL             string
+               LogViewerMaxBytes                ByteSize
+               MultiSiteSearch                  string
+               ProfilingEnabled                 bool
+               Repositories                     bool
+               RepositoryCache                  string
+               RunningJobLogRecordsToFetch      int
+               SecretKeyBase                    string
+               ShowRecentCollectionsOnDashboard bool
+               ShowUserAgreementInline          bool
+               ShowUserNotifications            bool
+               SiteName                         string
+               Theme                            string
+               UserProfileFormFields            map[string]struct {
+                       Type                 string
+                       FormFieldTitle       string
+                       FormFieldDescription string
+                       Required             bool
+                       Position             int
+                       Options              map[string]struct{}
+               }
+               UserProfileFormMessage string
+               VocabularyURL          string
+       }
+
+       EnableBetaController14287 bool
 }
 
 type Services struct {
@@ -202,24 +266,23 @@ type InstanceType struct {
 
 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 []string
+       SupportedDockerImageFormats StringSet
        UsePreemptibleInstances     bool
 
        JobsAPI struct {
-               Enable                  string
-               GitInternalDir          string
-               DefaultDockerImage      string
-               CrunchJobWrapper        string
-               CrunchJobUser           string
-               CrunchRefreshTrigger    string
-               ReuseJobIfOutputsDiffer bool
+               Enable         string
+               GitInternalDir string
        }
        Logging struct {
                MaxAge                       Duration
@@ -234,13 +297,16 @@ type ContainersConfig struct {
                LogUpdateSize                ByteSize
        }
        SLURM struct {
-               Managed struct {
+               PrioritySpread             int64
+               SbatchArgumentsList        []string
+               SbatchEnvironmentVariables map[string]string
+               Managed                    struct {
                        DNSServerConfDir       string
                        DNSServerConfTemplate  string
                        DNSServerReloadCommand string
                        DNSServerUpdateCommand string
                        ComputeNodeDomain      string
-                       ComputeNodeNameservers []string
+                       ComputeNodeNameservers StringSet
                        AssignNodeHostname     string
                }
        }
@@ -328,6 +394,40 @@ func (it *InstanceTypeMap) UnmarshalJSON(data []byte) error {
        return nil
 }
 
+type StringSet map[string]struct{}
+
+// UnmarshalJSON handles old config files that provide an array of
+// instance types instead of a hash.
+func (ss *StringSet) UnmarshalJSON(data []byte) error {
+       if len(data) > 0 && data[0] == '[' {
+               var arr []string
+               err := json.Unmarshal(data, &arr)
+               if err != nil {
+                       return err
+               }
+               if len(arr) == 0 {
+                       *ss = nil
+                       return nil
+               }
+               *ss = make(map[string]struct{}, len(arr))
+               for _, t := range arr {
+                       (*ss)[t] = struct{}{}
+               }
+               return nil
+       }
+       var hash map[string]struct{}
+       err := json.Unmarshal(data, &hash)
+       if err != nil {
+               return err
+       }
+       *ss = make(map[string]struct{}, len(hash))
+       for t, _ := range hash {
+               (*ss)[t] = struct{}{}
+       }
+
+       return nil
+}
+
 type ServiceName string
 
 const (