From 66268d9eee1a23bb2479c54cab44370c18f329c8 Mon Sep 17 00:00:00 2001 From: Dean Coakley Date: Wed, 9 Oct 2019 10:52:00 +0100 Subject: [PATCH 1/5] fix(cmd): Add --output option to get values Signed-off-by: Dean Coakley --- cmd/helm/get_values.go | 32 ++++++++++++++++++++++++---- cmd/helm/get_values_test.go | 6 ++++++ cmd/helm/testdata/output/values.json | 1 + pkg/action/get_values.go | 21 +++++------------- 4 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 cmd/helm/testdata/output/values.json diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index 31e1e3711..cd94f49c5 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -17,20 +17,26 @@ limitations under the License. package main import ( - "fmt" "io" + "github.com/gosuri/uitable" "github.com/spf13/cobra" "helm.sh/helm/v3/cmd/helm/require" "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/cli/output" ) var getValuesHelp = ` This command downloads a values file for a given release. ` +type valuesWriter struct { + vals map[string]interface{} +} + func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { + var outfmt output.Format client := action.NewGetValues(cfg) cmd := &cobra.Command{ @@ -39,17 +45,35 @@ func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { Long: getValuesHelp, Args: require.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - res, err := client.Run(args[0]) + vals, err := client.Run(args[0]) if err != nil { return err } - fmt.Fprintln(out, res) - return nil + return outfmt.Write(out, &valuesWriter{vals}) }, } f := cmd.Flags() f.IntVar(&client.Version, "revision", 0, "get the named release with revision") f.BoolVarP(&client.AllValues, "all", "a", false, "dump all (computed) values") + bindOutputFlag(cmd, &outfmt) + return cmd } + +func (v valuesWriter) WriteTable(out io.Writer) error { + table := uitable.New() + table.AddRow("USER-SUPPLIED VALUES:") + for k, v := range v.vals { + table.AddRow(k, v) + } + return output.EncodeTable(out, table) +} + +func (v valuesWriter) WriteJSON(out io.Writer) error { + return output.EncodeJSON(out, v) +} + +func (v valuesWriter) WriteYAML(out io.Writer) error { + return output.EncodeYAML(out, v) +} diff --git a/cmd/helm/get_values_test.go b/cmd/helm/get_values_test.go index ee77053e4..cf85e490f 100644 --- a/cmd/helm/get_values_test.go +++ b/cmd/helm/get_values_test.go @@ -32,7 +32,13 @@ func TestGetValuesCmd(t *testing.T) { name: "get values requires release name arg", cmd: "get values", golden: "output/get-values-args.txt", + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, wantError: true, + }, { + name: "get values to json", + cmd: "get values thomas-guide --output json", + golden: "output/values.json", + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, }} runTestCmd(t, tests) } diff --git a/cmd/helm/testdata/output/values.json b/cmd/helm/testdata/output/values.json new file mode 100644 index 000000000..831dfbcfb --- /dev/null +++ b/cmd/helm/testdata/output/values.json @@ -0,0 +1 @@ +{"name": "value"} diff --git a/pkg/action/get_values.go b/pkg/action/get_values.go index e5f4f4f04..54457079e 100644 --- a/pkg/action/get_values.go +++ b/pkg/action/get_values.go @@ -17,8 +17,6 @@ limitations under the License. package action import ( - "sigs.k8s.io/yaml" - "helm.sh/helm/v3/pkg/chartutil" ) @@ -40,29 +38,20 @@ func NewGetValues(cfg *Configuration) *GetValues { } // Run executes 'helm get values' against the given release. -func (g *GetValues) Run(name string) (string, error) { +func (g *GetValues) Run(name string) (map[string]interface{}, error) { res, err := g.cfg.releaseContent(name, g.Version) if err != nil { - return "", err + return nil, err } // If the user wants all values, compute the values and return. if g.AllValues { cfg, err := chartutil.CoalesceValues(res.Chart, res.Config) if err != nil { - return "", err - } - cfgStr, err := cfg.YAML() - if err != nil { - return "", err + return nil, err } - return cfgStr, nil - } - - resConfig, err := yaml.Marshal(res.Config) - if err != nil { - return "", err + return cfg, nil } - return string(resConfig), nil + return res.Chart.Values, nil } From 3c899d0bde986934fe98a4c6d0cf004fbce0b678 Mon Sep 17 00:00:00 2001 From: Dean Coakley Date: Wed, 9 Oct 2019 22:20:45 +0100 Subject: [PATCH 2/5] Add get values table output headers Signed-off-by: Dean Coakley --- cmd/helm/get_values.go | 22 +++++++++++++--------- cmd/helm/testdata/output/get-values.txt | 2 +- cmd/helm/testdata/output/values.json | 2 +- pkg/action/get_values.go | 7 +++---- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index cd94f49c5..6a772e1db 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -19,7 +19,6 @@ package main import ( "io" - "github.com/gosuri/uitable" "github.com/spf13/cobra" "helm.sh/helm/v3/cmd/helm/require" @@ -49,6 +48,16 @@ func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { if err != nil { return err } + + if outfmt == output.Table && client.AllValues { + _, err = out.Write([]byte("COMPUTED VALUES:\n")) + } else if outfmt == output.Table { + _, err = out.Write([]byte("USER-SUPPLIED VALUES:\n")) + } + if err != nil { + return err + } + return outfmt.Write(out, &valuesWriter{vals}) }, } @@ -62,18 +71,13 @@ func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { } func (v valuesWriter) WriteTable(out io.Writer) error { - table := uitable.New() - table.AddRow("USER-SUPPLIED VALUES:") - for k, v := range v.vals { - table.AddRow(k, v) - } - return output.EncodeTable(out, table) + return output.EncodeYAML(out, v.vals) } func (v valuesWriter) WriteJSON(out io.Writer) error { - return output.EncodeJSON(out, v) + return output.EncodeJSON(out, v.vals) } func (v valuesWriter) WriteYAML(out io.Writer) error { - return output.EncodeYAML(out, v) + return output.EncodeYAML(out, v.vals) } diff --git a/cmd/helm/testdata/output/get-values.txt b/cmd/helm/testdata/output/get-values.txt index de601163c..b7d146b15 100644 --- a/cmd/helm/testdata/output/get-values.txt +++ b/cmd/helm/testdata/output/get-values.txt @@ -1,2 +1,2 @@ +USER-SUPPLIED VALUES: name: value - diff --git a/cmd/helm/testdata/output/values.json b/cmd/helm/testdata/output/values.json index 831dfbcfb..ea8308627 100644 --- a/cmd/helm/testdata/output/values.json +++ b/cmd/helm/testdata/output/values.json @@ -1 +1 @@ -{"name": "value"} +{"name":"value"} diff --git a/pkg/action/get_values.go b/pkg/action/get_values.go index 54457079e..5bc3a7005 100644 --- a/pkg/action/get_values.go +++ b/pkg/action/get_values.go @@ -39,19 +39,18 @@ func NewGetValues(cfg *Configuration) *GetValues { // Run executes 'helm get values' against the given release. func (g *GetValues) Run(name string) (map[string]interface{}, error) { - res, err := g.cfg.releaseContent(name, g.Version) + rel, err := g.cfg.releaseContent(name, g.Version) if err != nil { return nil, err } // If the user wants all values, compute the values and return. if g.AllValues { - cfg, err := chartutil.CoalesceValues(res.Chart, res.Config) + cfg, err := chartutil.CoalesceValues(rel.Chart, rel.Config) if err != nil { return nil, err } return cfg, nil } - - return res.Chart.Values, nil + return rel.Config, nil } From df64ad1e10e3e3e4d105dae5cb2b22ad25278b98 Mon Sep 17 00:00:00 2001 From: Dean Coakley Date: Wed, 9 Oct 2019 22:26:59 +0100 Subject: [PATCH 3/5] Add get values --all test case Signed-off-by: Dean Coakley --- cmd/helm/get_values_test.go | 5 +++++ cmd/helm/testdata/output/get-values-all.txt | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 cmd/helm/testdata/output/get-values-all.txt diff --git a/cmd/helm/get_values_test.go b/cmd/helm/get_values_test.go index cf85e490f..0842383cc 100644 --- a/cmd/helm/get_values_test.go +++ b/cmd/helm/get_values_test.go @@ -34,6 +34,11 @@ func TestGetValuesCmd(t *testing.T) { golden: "output/get-values-args.txt", rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, wantError: true, + }, { + name: "get values thomas-guide (all)", + cmd: "get values thomas-guide --all", + golden: "output/get-values-all.txt", + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, }, { name: "get values to json", cmd: "get values thomas-guide --output json", diff --git a/cmd/helm/testdata/output/get-values-all.txt b/cmd/helm/testdata/output/get-values-all.txt new file mode 100644 index 000000000..b7e9696bc --- /dev/null +++ b/cmd/helm/testdata/output/get-values-all.txt @@ -0,0 +1,2 @@ +COMPUTED VALUES: +name: value From a831747dde9c8d9155100b306aebe7298a8ff342 Mon Sep 17 00:00:00 2001 From: Dean Coakley Date: Wed, 9 Oct 2019 22:57:30 +0100 Subject: [PATCH 4/5] Refactor get values table header writer Signed-off-by: Dean Coakley --- cmd/helm/get_values.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index 6a772e1db..2cccaeace 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "fmt" "io" "github.com/spf13/cobra" @@ -31,7 +32,8 @@ This command downloads a values file for a given release. ` type valuesWriter struct { - vals map[string]interface{} + vals map[string]interface{} + allValues bool } func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { @@ -48,17 +50,7 @@ func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { if err != nil { return err } - - if outfmt == output.Table && client.AllValues { - _, err = out.Write([]byte("COMPUTED VALUES:\n")) - } else if outfmt == output.Table { - _, err = out.Write([]byte("USER-SUPPLIED VALUES:\n")) - } - if err != nil { - return err - } - - return outfmt.Write(out, &valuesWriter{vals}) + return outfmt.Write(out, &valuesWriter{vals, client.AllValues}) }, } @@ -71,6 +63,11 @@ func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { } func (v valuesWriter) WriteTable(out io.Writer) error { + if v.allValues { + fmt.Fprintln(out, "COMPUTED VALUES:") + } else { + fmt.Fprintln(out, "USER-SUPPLIED VALUES:") + } return output.EncodeYAML(out, v.vals) } From c7a3974d3b96af57e8446ae9e5a1c2b537e7c482 Mon Sep 17 00:00:00 2001 From: Dean Coakley Date: Wed, 9 Oct 2019 22:58:09 +0100 Subject: [PATCH 5/5] Add get values yaml output test case Signed-off-by: Dean Coakley --- cmd/helm/get_values_test.go | 5 +++++ cmd/helm/testdata/output/values.yaml | 1 + 2 files changed, 6 insertions(+) create mode 100644 cmd/helm/testdata/output/values.yaml diff --git a/cmd/helm/get_values_test.go b/cmd/helm/get_values_test.go index 0842383cc..da3cc9e39 100644 --- a/cmd/helm/get_values_test.go +++ b/cmd/helm/get_values_test.go @@ -44,6 +44,11 @@ func TestGetValuesCmd(t *testing.T) { cmd: "get values thomas-guide --output json", golden: "output/values.json", rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, + }, { + name: "get values to yaml", + cmd: "get values thomas-guide --output yaml", + golden: "output/values.yaml", + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, }} runTestCmd(t, tests) } diff --git a/cmd/helm/testdata/output/values.yaml b/cmd/helm/testdata/output/values.yaml new file mode 100644 index 000000000..54ab03c93 --- /dev/null +++ b/cmd/helm/testdata/output/values.yaml @@ -0,0 +1 @@ +name: value