15003: Fix warnings about site-specific keys.
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 23 May 2019 04:24:14 +0000 (00:24 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 23 May 2019 04:24:14 +0000 (00:24 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

lib/config/config.default.yml
lib/config/generated_config.go
lib/config/load.go
lib/config/load_test.go

index 16d6c61b5e83c49086f163a53ba98dc23793865f..363d7eb02957142f7792edf286e90e539d3eff2a 100644 (file)
@@ -457,3 +457,9 @@ Clusters:
       "*":
         Proxy: false
         ActivateUsers: false
+      SAMPLE:
+        Host: sample.arvadosapi.com
+        Proxy: false
+        Scheme: https
+        Insecure: false
+        ActivateUsers: false
index 5ee62ee82e7801af4dece12e33a2ab9f76f57f67..e26f5f41a7dc8a5975fc7466dfed2b28aaf9529b 100644 (file)
@@ -463,4 +463,10 @@ Clusters:
       "*":
         Proxy: false
         ActivateUsers: false
+      SAMPLE:
+        Host: sample.arvadosapi.com
+        Proxy: false
+        Scheme: https
+        Insecure: false
+        ActivateUsers: false
 `)
index 526a050fbbdf923a076faab9ad4ce9b7954a1487..3ed2b9928f6ef734cf9f739250e0d891d1664727 100644 (file)
@@ -79,6 +79,7 @@ func load(rdr io.Reader, log logger, useDeprecated bool) (*arvados.Config, error
                return nil, fmt.Errorf("loading config data: %s", err)
        }
        logExtraKeys(log, merged, src, "")
+       removeSampleKeys(merged)
        err = mergo.Merge(&merged, src, mergo.WithOverride)
        if err != nil {
                return nil, fmt.Errorf("merging config data: %s", err)
@@ -129,14 +130,32 @@ func checkKeyConflict(label string, m map[string]string) error {
        return nil
 }
 
+func removeSampleKeys(m map[string]interface{}) {
+       delete(m, "SAMPLE")
+       for _, v := range m {
+               if v, _ := v.(map[string]interface{}); v != nil {
+                       removeSampleKeys(v)
+               }
+       }
+}
+
 func logExtraKeys(log logger, expected, supplied map[string]interface{}, prefix string) {
        if log == nil {
                return
        }
+       allowed := map[string]interface{}{}
+       for k, v := range expected {
+               allowed[strings.ToLower(k)] = v
+       }
        for k, vsupp := range supplied {
-               if vexp, ok := expected[k]; !ok {
+               vexp, ok := allowed[strings.ToLower(k)]
+               if !ok && expected["SAMPLE"] != nil {
+                       vexp = expected["SAMPLE"]
+               } else if !ok {
                        log.Warnf("deprecated or unknown config entry: %s%s", prefix, k)
-               } else if vsupp, ok := vsupp.(map[string]interface{}); !ok {
+                       continue
+               }
+               if vsupp, ok := vsupp.(map[string]interface{}); !ok {
                        // if vsupp is a map but vexp isn't map, this
                        // will be caught elsewhere; see TestBadType.
                        continue
index 2bf341fe1deda02369930e52427463ec160e70cc..bbcc45a3f3714e3de346a82125e16bc0fb5054ac 100644 (file)
@@ -9,10 +9,13 @@ import (
        "io"
        "os"
        "os/exec"
+       "strings"
        "testing"
 
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
        "git.curoverse.com/arvados.git/sdk/go/ctxlog"
        "github.com/ghodss/yaml"
+       "github.com/sirupsen/logrus"
        check "gopkg.in/check.v1"
 )
 
@@ -42,6 +45,23 @@ func (s *LoadSuite) TestNoConfigs(c *check.C) {
        c.Check(cc.API.MaxItemsPerResponse, check.Equals, 1000)
 }
 
+func (s *LoadSuite) TestSampleKeys(c *check.C) {
+       for _, yaml := range []string{
+               `{"Clusters":{"z1111":{}}}`,
+               `{"Clusters":{"z1111":{"InstanceTypes":{"Foo":{"RAM": "12345M"}}}}}`,
+       } {
+               cfg, err := Load(bytes.NewBufferString(yaml), ctxlog.TestLogger(c))
+               c.Assert(err, check.IsNil)
+               cc, err := cfg.GetCluster("z1111")
+               _, hasSample := cc.InstanceTypes["SAMPLE"]
+               c.Check(hasSample, check.Equals, false)
+               if strings.Contains(yaml, "Foo") {
+                       c.Check(cc.InstanceTypes["Foo"].RAM, check.Equals, arvados.ByteSize(12345000000))
+                       c.Check(cc.InstanceTypes["Foo"].Price, check.Equals, 0.0)
+               }
+       }
+}
+
 func (s *LoadSuite) TestMultipleClusters(c *check.C) {
        cfg, err := Load(bytes.NewBufferString(`{"Clusters":{"z1111":{},"z2222":{}}}`), ctxlog.TestLogger(c))
        c.Assert(err, check.IsNil)
@@ -53,6 +73,30 @@ func (s *LoadSuite) TestMultipleClusters(c *check.C) {
        c.Check(c2.ClusterID, check.Equals, "z2222")
 }
 
+func (s *LoadSuite) TestDeprecatedOrUnknownWarning(c *check.C) {
+       var logbuf bytes.Buffer
+       logger := logrus.New()
+       logger.Out = &logbuf
+       _, err := Load(bytes.NewBufferString(`
+Clusters:
+  zzzzz:
+    postgresql: {}
+    BadKey: {}
+    Containers: {}
+    RemoteClusters:
+      z2222:
+        Host: z2222.arvadosapi.com
+        Proxy: true
+        BadKey: badValue
+`), logger)
+       c.Assert(err, check.IsNil)
+       logs := strings.Split(strings.TrimSuffix(logbuf.String(), "\n"), "\n")
+       for _, log := range logs {
+               c.Check(log, check.Matches, `.*deprecated or unknown config entry:.*BadKey.*`)
+       }
+       c.Check(logs, check.HasLen, 2)
+}
+
 func (s *LoadSuite) TestPostgreSQLKeyConflict(c *check.C) {
        _, err := Load(bytes.NewBufferString(`
 Clusters: