From e5525f804799cedc445c703b665fc5dbd300afe8 Mon Sep 17 00:00:00 2001 From: franklin Date: Thu, 5 Aug 2021 13:00:03 +0200 Subject: [PATCH] feat: add simple status command --- cmd/actions/root.go | 2 +- cmd/actions/status.go | 52 +++++++++++++++++++++++++++++++++++++++++++ squadron.go | 44 +++++++++++++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 cmd/actions/status.go diff --git a/cmd/actions/root.go b/cmd/actions/root.go index 034a32d..d4978f3 100644 --- a/cmd/actions/root.go +++ b/cmd/actions/root.go @@ -41,7 +41,7 @@ func init() { rootCmd.PersistentFlags().BoolVarP(&flagVerbose, "verbose", "v", false, "show more output") rootCmd.PersistentFlags().StringSliceVarP(&flagFiles, "file", "f", []string{"squadron.yaml"}, "specify alternative squadron files") - rootCmd.AddCommand(upCmd, downCmd, buildCmd, pushCmd, listCmd, generateCmd, configCmd, versionCmd, completionCmd, templateCmd) + rootCmd.AddCommand(upCmd, downCmd, buildCmd, pushCmd, listCmd, generateCmd, statusCmd, configCmd, versionCmd, completionCmd, templateCmd) } func Execute() { diff --git a/cmd/actions/status.go b/cmd/actions/status.go new file mode 100644 index 0000000..ec07e78 --- /dev/null +++ b/cmd/actions/status.go @@ -0,0 +1,52 @@ +package actions + +import ( + "github.com/spf13/cobra" + + "github.com/foomo/squadron" +) + +func init() { + statusCmd.Flags().StringVarP(&flagNamespace, "namespace", "n", "default", "specifies the namespace") +} + +var statusCmd = &cobra.Command{ + Use: "status [UNIT...]", + Short: "installs the squadron or given units", + Example: " squadron status frontend backend --namespace demo --build --push -- --dry-run", + RunE: func(cmd *cobra.Command, args []string) error { + return status(args, cwd, flagNamespace, flagFiles) + }, +} + +func status(args []string, cwd, namespace string, files []string) error { + sq := squadron.New(cwd, namespace, files) + + if err := sq.MergeConfigFiles(); err != nil { + return err + } + + args, helmArgs := parseExtraArgs(args) + + unitsNames, err := parseUnitNames(args, sq.GetConfig().Units) + if err != nil { + return err + } + + if unitsNames != nil { + if err := sq.FilterConfig(unitsNames); err != nil { + return err + } + } + + if err := sq.RenderConfig(); err != nil { + return err + } + + units, err := parseUnitArgs(args, sq.GetConfig().Units) + if err != nil { + return err + } + + return sq.Status(units, helmArgs) +} diff --git a/squadron.go b/squadron.go index 60ea33f..62f0053 100644 --- a/squadron.go +++ b/squadron.go @@ -171,9 +171,9 @@ func (sq *Squadron) Package() error { } func (sq *Squadron) Down(units map[string]Unit, helmArgs []string) error { - stdErr := bytes.NewBuffer([]byte{}) if sq.c.Unite { logrus.Infof("running helm uninstall for: %s", sq.chartPath()) + stdErr := bytes.NewBuffer([]byte{}) if _, err := util.NewHelmCommand().Args("uninstall", sq.name). Stderr(stdErr). Stdout(os.Stdout). @@ -188,6 +188,7 @@ func (sq *Squadron) Down(units map[string]Unit, helmArgs []string) error { // todo use release prefix on install: squadron name or --name rName := fmt.Sprintf("%s-%s", sq.name, uName) logrus.Infof("running helm uninstall for: %s", uName) + stdErr := bytes.NewBuffer([]byte{}) if _, err := util.NewHelmCommand().Args("uninstall", rName). Stderr(stdErr). Stdout(os.Stdout). @@ -241,6 +242,47 @@ func (sq *Squadron) Diff(units map[string]Unit, helmArgs []string) (string, erro return "", nil } +func (sq *Squadron) Status(units map[string]Unit, helmArgs []string) error { + stdOut := bytes.NewBuffer([]byte{}) + if sq.c.Unite { + stdOut.WriteString("==== " + sq.name + strings.Repeat("=", 20-len(sq.name)) + "\n") + logrus.Infof("running helm status for chart: %s", sq.chartPath()) + stdErr := bytes.NewBuffer([]byte{}) + if _, err := util.NewHelmCommand().Args("status", sq.name). + Stderr(stdErr). + Stdout(stdOut). + Args("--namespace", sq.namespace). + Args(helmArgs...). + Run(); err != nil && + string(bytes.TrimSpace(stdErr.Bytes())) == "Error: release: not found" { + stdOut.WriteString("NAME: " + sq.name + "\n") + stdOut.WriteString("STATUS: not installed\n") + } else if err != nil { + return err + } + } + for uName := range units { + stdOut.WriteString("==== " + uName + " " + strings.Repeat("=", 60-len(uName)) + "\n") + // todo use release prefix on install: squadron name or --name + rName := fmt.Sprintf("%s-%s", sq.name, uName) + logrus.Infof("running helm status for %s", uName) + stdErr := bytes.NewBuffer([]byte{}) + if _, err := util.NewHelmCommand().Args("status", rName). + Stderr(stdErr). + Stdout(stdOut). + Args("--namespace", sq.namespace). + Args(helmArgs...).Run(); err != nil && + string(bytes.TrimSpace(stdErr.Bytes())) == "Error: release: not found" { + stdOut.WriteString("NAME: " + rName + "\n") + stdOut.WriteString("STATUS: not installed\n") + } else if err != nil { + return err + } + } + fmt.Println(strings.ReplaceAll(stdOut.String(), "\\n", "\n")) + return nil +} + func (sq *Squadron) Up(units map[string]Unit, helmArgs []string) error { if sq.c.Unite { logrus.Infof("running helm upgrade for chart: %s", sq.chartPath())