17803: Warn when config keys are ignored due to case mismatch.
[arvados.git] / lib / config / load.go
index f682359379f747fbbdd571b3653485e3ece87eb4..73f0a244572279a75eabd76f1b151d954b05bfe8 100644 (file)
@@ -241,36 +241,39 @@ func (ldr *Loader) Load() (*arvados.Config, error) {
                return nil, fmt.Errorf("transcoding config data: %s", err)
        }
 
+       var loadFuncs []func(*arvados.Config) error
        if !ldr.SkipDeprecated {
-               err = ldr.applyDeprecatedConfig(&cfg)
-               if err != nil {
-                       return nil, err
-               }
+               loadFuncs = append(loadFuncs,
+                       ldr.applyDeprecatedConfig,
+                       ldr.applyDeprecatedVolumeDriverParameters,
+               )
        }
        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.loadOldEnvironmentVariables(&cfg),
-                       ldr.loadOldKeepstoreConfig(&cfg),
-                       ldr.loadOldKeepWebConfig(&cfg),
-                       ldr.loadOldCrunchDispatchSlurmConfig(&cfg),
-                       ldr.loadOldWebsocketConfig(&cfg),
-                       ldr.loadOldKeepproxyConfig(&cfg),
-                       ldr.loadOldGitHttpdConfig(&cfg),
-                       ldr.loadOldKeepBalanceConfig(&cfg),
-               } {
-                       if err != nil {
-                               return nil, err
-                       }
+               loadFuncs = append(loadFuncs,
+                       ldr.loadOldEnvironmentVariables,
+                       ldr.loadOldKeepstoreConfig,
+                       ldr.loadOldKeepWebConfig,
+                       ldr.loadOldCrunchDispatchSlurmConfig,
+                       ldr.loadOldWebsocketConfig,
+                       ldr.loadOldKeepproxyConfig,
+                       ldr.loadOldGitHttpdConfig,
+                       ldr.loadOldKeepBalanceConfig,
+               )
+       }
+       for _, f := range loadFuncs {
+               err = f(&cfg)
+               if err != nil {
+                       return nil, err
                }
        }
 
        // Check for known mistakes
        for id, cc := range cfg.Clusters {
-               for remote, _ := range cc.RemoteClusters {
+               for remote := range cc.RemoteClusters {
                        if remote == "*" || remote == "SAMPLE" {
                                continue
                        }
@@ -313,11 +316,15 @@ var acceptableTokenLength = 32
 
 func (ldr *Loader) checkToken(label, token string) error {
        if token == "" {
-               ldr.Logger.Warnf("%s: secret token is not set (use %d+ random characters from a-z, A-Z, 0-9)", label, acceptableTokenLength)
+               if ldr.Logger != nil {
+                       ldr.Logger.Warnf("%s: secret token is not set (use %d+ random characters from a-z, A-Z, 0-9)", label, acceptableTokenLength)
+               }
        } else if !acceptableTokenRe.MatchString(token) {
                return fmt.Errorf("%s: unacceptable characters in token (only a-z, A-Z, 0-9 are acceptable)", label)
        } else if len(token) < acceptableTokenLength {
-               ldr.Logger.Warnf("%s: token is too short (should be at least %d characters)", label, acceptableTokenLength)
+               if ldr.Logger != nil {
+                       ldr.Logger.Warnf("%s: token is too short (should be at least %d characters)", label, acceptableTokenLength)
+               }
        }
        return nil
 }
@@ -347,20 +354,24 @@ func (ldr *Loader) logExtraKeys(expected, supplied map[string]interface{}, prefi
        if ldr.Logger == nil {
                return
        }
-       allowed := map[string]interface{}{}
-       for k, v := range expected {
-               allowed[strings.ToLower(k)] = v
-       }
        for k, vsupp := range supplied {
                if k == "SAMPLE" {
                        // entry will be dropped in removeSampleKeys anyway
                        continue
                }
-               vexp, ok := allowed[strings.ToLower(k)]
+               vexp, ok := expected[k]
                if expected["SAMPLE"] != nil {
                        vexp = expected["SAMPLE"]
                } else if !ok {
-                       ldr.Logger.Warnf("deprecated or unknown config entry: %s%s", prefix, k)
+                       // check for a case-insensitive match
+                       hint := ""
+                       for ek := range expected {
+                               if strings.EqualFold(k, ek) {
+                                       hint = " (perhaps you meant " + ek + "?)"
+                                       break
+                               }
+                       }
+                       ldr.Logger.Warnf("deprecated or unknown config entry: %s%s%s", prefix, k, hint)
                        continue
                }
                if vsupp, ok := vsupp.(map[string]interface{}); !ok {