13647: Check ARVADOS_* env vars when loading config.
[arvados.git] / lib / config / load.go
index f9ee6989d22842dd98133ed66b51875e806628a4..61d80a3c58f535733ad65b9053b55283c9d08510 100644 (file)
@@ -26,18 +26,17 @@ var ErrNoClustersDefined = errors.New("config does not define any clusters")
 type Loader struct {
        Stdin          io.Reader
        Logger         logrus.FieldLogger
-       SkipDeprecated bool // Don't load legacy/deprecated config keys/files
+       SkipDeprecated bool // Don't load deprecated config keys
+       SkipLegacy     bool // Don't load legacy config files
+       SkipAPICalls   bool // Don't do checks that call RailsAPI/controller
 
        Path                    string
        KeepstorePath           string
+       KeepWebPath             string
        CrunchDispatchSlurmPath string
        WebsocketPath           string
-
-       // Legacy config file for the current component (will be the
-       // same as one of the above files).  If set, not being able to
-       // load the 'main' config.yml will not be a fatal error, but
-       // the the legacy file will be required instead.
-       LegacyComponentConfig string
+       KeepproxyPath           string
+       GitHttpdPath            string
 
        configdata []byte
 }
@@ -65,8 +64,12 @@ func NewLoader(stdin io.Reader, logger logrus.FieldLogger) *Loader {
 func (ldr *Loader) SetupFlags(flagset *flag.FlagSet) {
        flagset.StringVar(&ldr.Path, "config", arvados.DefaultConfigFile, "Site configuration `file` (default may be overridden by setting an ARVADOS_CONFIG environment variable)")
        flagset.StringVar(&ldr.KeepstorePath, "legacy-keepstore-config", defaultKeepstoreConfigPath, "Legacy keepstore configuration `file`")
+       flagset.StringVar(&ldr.KeepWebPath, "legacy-keepweb-config", defaultKeepWebConfigPath, "Legacy keep-web configuration `file`")
        flagset.StringVar(&ldr.CrunchDispatchSlurmPath, "legacy-crunch-dispatch-slurm-config", defaultCrunchDispatchSlurmConfigPath, "Legacy crunch-dispatch-slurm configuration `file`")
        flagset.StringVar(&ldr.WebsocketPath, "legacy-ws-config", defaultWebsocketConfigPath, "Legacy arvados-ws configuration `file`")
+       flagset.StringVar(&ldr.KeepproxyPath, "legacy-keepproxy-config", defaultKeepproxyConfigPath, "Legacy keepproxy configuration `file`")
+       flagset.StringVar(&ldr.GitHttpdPath, "legacy-git-httpd-config", defaultGitHttpdConfigPath, "Legacy arv-git-httpd configuration `file`")
+       flagset.BoolVar(&ldr.SkipLegacy, "skip-legacy", false, "Don't load legacy config files")
 }
 
 // MungeLegacyConfigArgs checks args for a -config flag whose argument
@@ -125,6 +128,28 @@ func (ldr *Loader) MungeLegacyConfigArgs(lgr logrus.FieldLogger, args []string,
                        }
                }
        }
+
+       // Disable legacy config loading for components other than the
+       // one that was specified
+       if legacyConfigArg != "-legacy-keepstore-config" {
+               ldr.KeepstorePath = ""
+       }
+       if legacyConfigArg != "-legacy-crunch-dispatch-slurm-config" {
+               ldr.CrunchDispatchSlurmPath = ""
+       }
+       if legacyConfigArg != "-legacy-ws-config" {
+               ldr.WebsocketPath = ""
+       }
+       if legacyConfigArg != "-legacy-keepweb-config" {
+               ldr.KeepWebPath = ""
+       }
+       if legacyConfigArg != "-legacy-keepproxy-config" {
+               ldr.KeepproxyPath = ""
+       }
+       if legacyConfigArg != "-legacy-git-httpd-config" {
+               ldr.GitHttpdPath = ""
+       }
+
        return munged
 }
 
@@ -144,15 +169,10 @@ func (ldr *Loader) Load() (*arvados.Config, error) {
        if ldr.configdata == nil {
                buf, err := ldr.loadBytes(ldr.Path)
                if err != nil {
-                       if ldr.LegacyComponentConfig != "" && os.IsNotExist(err) && !ldr.SkipDeprecated {
-                               buf = []byte(`Clusters: {zzzzz: {}}`)
-                       } else {
-                               return nil, err
-                       }
+                       return nil, err
                }
                ldr.configdata = buf
        }
-       noConfigLoaded := bytes.Compare(ldr.configdata, []byte(`Clusters: {zzzzz: {}}`)) == 0
 
        // Load the config into a dummy map to get the cluster ID
        // keys, discarding the values; then set up defaults for each
@@ -218,19 +238,20 @@ func (ldr *Loader) Load() (*arvados.Config, error) {
                if err != nil {
                        return nil, err
                }
+       }
+       if !ldr.SkipLegacy {
                // legacy file is required when either:
                // * a non-default location was specified
                // * no primary config was loaded, and this is the
                // legacy config file for the current component
                for _, err := range []error{
-                       ldr.loadOldKeepstoreConfig(&cfg, (ldr.KeepstorePath != defaultKeepstoreConfigPath) ||
-                               (noConfigLoaded && ldr.LegacyComponentConfig == ldr.KeepstorePath)),
-
-                       ldr.loadOldCrunchDispatchSlurmConfig(&cfg, (ldr.CrunchDispatchSlurmPath != defaultCrunchDispatchSlurmConfigPath) ||
-                               (noConfigLoaded && ldr.LegacyComponentConfig == ldr.CrunchDispatchSlurmPath)),
-
-                       ldr.loadOldWebsocketConfig(&cfg, (ldr.WebsocketPath != defaultWebsocketConfigPath) ||
-                               (noConfigLoaded && ldr.LegacyComponentConfig == ldr.WebsocketPath)),
+                       ldr.loadOldEnvironmentVariables(&cfg),
+                       ldr.loadOldKeepstoreConfig(&cfg),
+                       ldr.loadOldKeepWebConfig(&cfg),
+                       ldr.loadOldCrunchDispatchSlurmConfig(&cfg),
+                       ldr.loadOldWebsocketConfig(&cfg),
+                       ldr.loadOldKeepproxyConfig(&cfg),
+                       ldr.loadOldGitHttpdConfig(&cfg),
                } {
                        if err != nil {
                                return nil, err
@@ -240,9 +261,14 @@ func (ldr *Loader) Load() (*arvados.Config, error) {
 
        // Check for known mistakes
        for id, cc := range cfg.Clusters {
-               err = checkKeyConflict(fmt.Sprintf("Clusters.%s.PostgreSQL.Connection", id), cc.PostgreSQL.Connection)
-               if err != nil {
-                       return nil, err
+               for _, err = range []error{
+                       checkKeyConflict(fmt.Sprintf("Clusters.%s.PostgreSQL.Connection", id), cc.PostgreSQL.Connection),
+                       ldr.checkEmptyKeepstores(cc),
+                       ldr.checkUnlistedKeepstores(cc),
+               } {
+                       if err != nil {
+                               return nil, err
+                       }
                }
        }
        return &cfg, nil