18679: if a config file contains a key with a null value, do not
authorWard Vandewege <ward@curii.com>
Wed, 2 Feb 2022 22:02:43 +0000 (17:02 -0500)
committerWard Vandewege <ward@curii.com>
Wed, 2 Feb 2022 22:02:43 +0000 (17:02 -0500)
       override the default value for that key.

Arvados-DCO-1.1-Signed-off-by: Ward Vandewege <ward@curii.com>

lib/config/load.go
lib/config/load_test.go

index b4a34335b6ddc060984b4b12bfa137a88c54ab87..c2eb55554488f465a7dc990b87ad6da450459a4d 100644 (file)
@@ -230,6 +230,9 @@ func (ldr *Loader) Load() (*arvados.Config, error) {
        }
        ldr.logExtraKeys(merged, src, "")
        removeSampleKeys(merged)
+       // We merge the loaded config into the default, overriding any existing keys.
+       // Make sure we do not override a default with a key that has a 'null' value.
+       removeNullKeys(src)
        err = mergo.Merge(&merged, src, mergo.WithOverride)
        if err != nil {
                return nil, fmt.Errorf("merging config data: %s", err)
@@ -435,6 +438,17 @@ func checkKeyConflict(label string, m map[string]string) error {
        return nil
 }
 
+func removeNullKeys(m map[string]interface{}) {
+       for k, v := range m {
+               if v == nil {
+                       delete(m, k)
+               }
+               if v, _ := v.(map[string]interface{}); v != nil {
+                       removeNullKeys(v)
+               }
+       }
+}
+
 func removeSampleKeys(m map[string]interface{}) {
        delete(m, "SAMPLE")
        for _, v := range m {
index d4896c39cb19c2aa782a36389d9d92af728f04f5..1ede805b0085a668b40169af458243a304c12e93 100644 (file)
@@ -71,6 +71,18 @@ func (s *LoadSuite) TestNoConfigs(c *check.C) {
        c.Check(cc.API.MaxItemsPerResponse, check.Equals, 1000)
 }
 
+func (s *LoadSuite) TestNullKeyDoesNotOverrideDefault(c *check.C) {
+       ldr := testLoader(c, `{"Clusters":{"z1111":{"API":}}}`, nil)
+       ldr.SkipDeprecated = true
+       cfg, err := ldr.Load()
+       c.Assert(err, check.IsNil)
+       c1, err := cfg.GetCluster("z1111")
+       c.Assert(err, check.IsNil)
+       c.Check(c1.ClusterID, check.Equals, "z1111")
+       c.Check(c1.API.MaxRequestAmplification, check.Equals, 4)
+       c.Check(c1.API.MaxItemsPerResponse, check.Equals, 1000)
+}
+
 func (s *LoadSuite) TestMungeLegacyConfigArgs(c *check.C) {
        f, err := ioutil.TempFile("", "")
        c.Check(err, check.IsNil)