diff --git a/cmd/helm/get_values.go b/cmd/helm/get_values.go index 31e1e3711..2cccaeace 100644 --- a/cmd/helm/get_values.go +++ b/cmd/helm/get_values.go @@ -24,13 +24,20 @@ import ( "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{} + allValues bool +} + func newGetValuesCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { + var outfmt output.Format client := action.NewGetValues(cfg) cmd := &cobra.Command{ @@ -39,17 +46,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, client.AllValues}) }, } 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 { + if v.allValues { + fmt.Fprintln(out, "COMPUTED VALUES:") + } else { + fmt.Fprintln(out, "USER-SUPPLIED VALUES:") + } + return output.EncodeYAML(out, v.vals) +} + +func (v valuesWriter) WriteJSON(out io.Writer) error { + return output.EncodeJSON(out, v.vals) +} + +func (v valuesWriter) WriteYAML(out io.Writer) error { + return output.EncodeYAML(out, v.vals) +} diff --git a/cmd/helm/get_values_test.go b/cmd/helm/get_values_test.go index ee77053e4..da3cc9e39 100644 --- a/cmd/helm/get_values_test.go +++ b/cmd/helm/get_values_test.go @@ -32,7 +32,23 @@ 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 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", + 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/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 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 new file mode 100644 index 000000000..ea8308627 --- /dev/null +++ b/cmd/helm/testdata/output/values.json @@ -0,0 +1 @@ +{"name":"value"} 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 diff --git a/pkg/action/get_values.go b/pkg/action/get_values.go index e5f4f4f04..5bc3a7005 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,19 @@ func NewGetValues(cfg *Configuration) *GetValues { } // Run executes 'helm get values' against the given release. -func (g *GetValues) Run(name string) (string, error) { - res, err := g.cfg.releaseContent(name, g.Version) +func (g *GetValues) Run(name string) (map[string]interface{}, error) { + rel, 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() + cfg, err := chartutil.CoalesceValues(rel.Chart, rel.Config) if err != nil { - return "", err + return nil, err } - return cfgStr, nil + return cfg, nil } - - resConfig, err := yaml.Marshal(res.Config) - if err != nil { - return "", err - } - - return string(resConfig), nil + return rel.Config, nil }