X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/50d3c3897f0fad1bfcc4fc86096155d15d25483e..dc543546ef67fc3a7aca4b8208cafe64c94f3731:/lib/config/cmd.go diff --git a/lib/config/cmd.go b/lib/config/cmd.go index aa3e3bca12..0351ad02a1 100644 --- a/lib/config/cmd.go +++ b/lib/config/cmd.go @@ -5,15 +5,20 @@ package config import ( + "bytes" + "flag" "fmt" "io" + "io/ioutil" + "os" + "os/exec" - "git.curoverse.com/arvados.git/lib/cmd" + "git.curoverse.com/arvados.git/sdk/go/arvados" "git.curoverse.com/arvados.git/sdk/go/ctxlog" "github.com/ghodss/yaml" ) -var DumpCommand cmd.Handler = dumpCommand{} +var DumpCommand dumpCommand type dumpCommand struct{} @@ -24,12 +29,24 @@ func (dumpCommand) RunCommand(prog string, args []string, stdin io.Reader, stdou fmt.Fprintf(stderr, "%s\n", err) } }() - if len(args) != 0 { - err = fmt.Errorf("usage: %s config-min.yaml", prog) + + flags := flag.NewFlagSet("", flag.ContinueOnError) + flags.SetOutput(stderr) + configFile := flags.String("config", arvados.DefaultConfigFile, "Site configuration `file`") + err = flags.Parse(args) + if err == flag.ErrHelp { + err = nil + return 0 + } else if err != nil { + return 2 + } + + if len(flags.Args()) != 0 { + flags.Usage() return 2 } log := ctxlog.New(stderr, "text", "info") - cfg, err := Load(stdin, log) + cfg, err := loadFileOrStdin(*configFile, stdin, log) if err != nil { return 1 } @@ -43,3 +60,108 @@ func (dumpCommand) RunCommand(prog string, args []string, stdin io.Reader, stdou } return 0 } + +var CheckCommand checkCommand + +type checkCommand struct{} + +func (checkCommand) 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) + } + }() + + flags := flag.NewFlagSet("", flag.ContinueOnError) + flags.SetOutput(stderr) + configFile := flags.String("config", arvados.DefaultConfigFile, "Site configuration `file`") + err = flags.Parse(args) + if err == flag.ErrHelp { + err = nil + return 0 + } else if err != nil { + return 2 + } + + if len(flags.Args()) != 0 { + flags.Usage() + return 2 + } + log := &plainLogger{w: stderr} + var buf []byte + if *configFile == "-" { + buf, err = ioutil.ReadAll(stdin) + } else { + buf, err = ioutil.ReadFile(*configFile) + } + if err != nil { + return 1 + } + withoutDepr, err := load(bytes.NewBuffer(buf), log, false) + if err != nil { + return 1 + } + withDepr, err := load(bytes.NewBuffer(buf), nil, true) + if err != nil { + return 1 + } + cmd := exec.Command("diff", "-u", "--label", "without-deprecated-configs", "--label", "relying-on-deprecated-configs", "/dev/fd/3", "/dev/fd/4") + for _, obj := range []interface{}{withoutDepr, withDepr} { + y, _ := yaml.Marshal(obj) + pr, pw, err := os.Pipe() + if err != nil { + return 1 + } + defer pr.Close() + go func() { + io.Copy(pw, bytes.NewBuffer(y)) + pw.Close() + }() + cmd.ExtraFiles = append(cmd.ExtraFiles, pr) + } + diff, err := cmd.CombinedOutput() + if bytes.HasPrefix(diff, []byte("--- ")) { + fmt.Fprintln(stdout, "Your configuration is relying on deprecated entries. Suggest making the following changes.") + stdout.Write(diff) + return 1 + } else if len(diff) > 0 { + fmt.Fprintf(stderr, "Unexpected diff output:\n%s", diff) + return 1 + } else if err != nil { + return 1 + } + if log.used { + return 1 + } + return 0 +} + +type plainLogger struct { + w io.Writer + used bool +} + +func (pl *plainLogger) Warnf(format string, args ...interface{}) { + pl.used = true + fmt.Fprintf(pl.w, format+"\n", args...) +} + +var DumpDefaultsCommand defaultsCommand + +type defaultsCommand struct{} + +func (defaultsCommand) 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) + } + }() + + _, err = stdout.Write(DefaultYAML) + if err != nil { + return 1 + } + return 0 +}