15003: Add 'arvados-server dump-config' command.
authorTom Clegg <tclegg@veritasgenetics.com>
Tue, 16 Apr 2019 19:33:33 +0000 (15:33 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Tue, 23 Apr 2019 14:32:20 +0000 (10:32 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

cmd/arvados-server/cmd.go
lib/config/cmd.go [new file with mode: 0644]
lib/config/cmd_test.go [new file with mode: 0644]

index cd15d25dda760a41c427b8bfd4b621fb43e2130a..cad540c91b4123eb9534dd03fac4b577ca7d2bd1 100644 (file)
@@ -8,6 +8,7 @@ import (
        "os"
 
        "git.curoverse.com/arvados.git/lib/cmd"
+       "git.curoverse.com/arvados.git/lib/config"
        "git.curoverse.com/arvados.git/lib/controller"
        "git.curoverse.com/arvados.git/lib/dispatchcloud"
 )
@@ -21,6 +22,7 @@ var (
 
                "controller":     controller.Command,
                "dispatch-cloud": dispatchcloud.Command,
+               "dump-config":    config.DumpCommand,
        })
 )
 
diff --git a/lib/config/cmd.go b/lib/config/cmd.go
new file mode 100644 (file)
index 0000000..aa3e3bc
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package config
+
+import (
+       "fmt"
+       "io"
+
+       "git.curoverse.com/arvados.git/lib/cmd"
+       "git.curoverse.com/arvados.git/sdk/go/ctxlog"
+       "github.com/ghodss/yaml"
+)
+
+var DumpCommand cmd.Handler = dumpCommand{}
+
+type dumpCommand struct{}
+
+func (dumpCommand) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
+       var err error
+       defer func() {
+               if err != nil {
+                       fmt.Fprintf(stderr, "%s\n", err)
+               }
+       }()
+       if len(args) != 0 {
+               err = fmt.Errorf("usage: %s <config-src.yaml >config-min.yaml", prog)
+               return 2
+       }
+       log := ctxlog.New(stderr, "text", "info")
+       cfg, err := Load(stdin, log)
+       if err != nil {
+               return 1
+       }
+       out, err := yaml.Marshal(cfg)
+       if err != nil {
+               return 1
+       }
+       _, err = stdout.Write(out)
+       if err != nil {
+               return 1
+       }
+       return 0
+}
diff --git a/lib/config/cmd_test.go b/lib/config/cmd_test.go
new file mode 100644 (file)
index 0000000..0a60c25
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package config
+
+import (
+       "bytes"
+
+       check "gopkg.in/check.v1"
+)
+
+var _ = check.Suite(&CommandSuite{})
+
+type CommandSuite struct{}
+
+func (s *CommandSuite) TestBadArg(c *check.C) {
+       var stderr bytes.Buffer
+       code := DumpCommand.RunCommand("arvados dump-config", []string{"-badarg"}, bytes.NewBuffer(nil), bytes.NewBuffer(nil), &stderr)
+       c.Check(code, check.Equals, 2)
+       c.Check(stderr.String(), check.Matches, `(?ms)usage: .*`)
+}
+
+func (s *CommandSuite) TestEmptyInput(c *check.C) {
+       var stdout, stderr bytes.Buffer
+       code := DumpCommand.RunCommand("arvados dump-config", nil, &bytes.Buffer{}, &stdout, &stderr)
+       c.Check(code, check.Equals, 1)
+       c.Check(stderr.String(), check.Matches, `config does not define any clusters\n`)
+}
+
+func (s *CommandSuite) TestUnknownKey(c *check.C) {
+       var stdout, stderr bytes.Buffer
+       in := `
+Clusters:
+ z1234:
+  UnknownKey: foobar
+  ManagementToken: secret
+`
+       code := DumpCommand.RunCommand("arvados dump-config", nil, bytes.NewBufferString(in), &stdout, &stderr)
+       c.Check(code, check.Equals, 0)
+       c.Check(stdout.String(), check.Matches, `(?ms)Clusters:\n  z1234:\n.*`)
+       c.Check(stdout.String(), check.Matches, `(?ms).*\n *ManagementToken: secret\n.*`)
+       c.Check(stdout.String(), check.Not(check.Matches), `(?ms).*UnknownKey.*`)
+}