From b5f9a7e36094ac2f184acca7cea09da37b1b4a02 Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Fri, 25 Oct 2019 18:52:33 +0900 Subject: [PATCH] fix issues in --reset-values and --reuse-values on helm v3 Closes #157 --- cmd/helm3.go | 47 ++++++++++++++++++++++++++--------------------- cmd/upgrade.go | 2 +- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cmd/helm3.go b/cmd/helm3.go index bb519dd6..58e3ec35 100644 --- a/cmd/helm3.go +++ b/cmd/helm3.go @@ -62,27 +62,32 @@ func (d *diffCmd) template() ([]byte, error) { if d.namespace != "" { flags = append(flags, "--namespace", d.namespace) } - if !d.resetValues { - if d.reuseValues { - tmpfile, err := ioutil.TempFile("", "existing-values") - if err != nil { - return nil, err - } - defer os.Remove(tmpfile.Name()) - flags = append(flags, "--values", tmpfile.Name()) + // Helm automatically enable --reuse-values when there's no --set, --set-string, --set-values, --set-file present. + // Let's simulate that in helm-diff. + // See https://medium.com/@kcatstack/understand-helm-upgrade-flags-reset-values-reuse-values-6e58ac8f127e + shouldDefaultReusingValues := len(d.values) > 0 && len(d.stringValues) > 0 && len(d.valueFiles) > 0 && len(d.fileValues) > 0 + if (d.reuseValues || shouldDefaultReusingValues) && !d.resetValues { + tmpfile, err := ioutil.TempFile("", "existing-values") + if err != nil { + return nil, err } - for _, value := range d.values { - flags = append(flags, "--set", value) - } - for _, stringValue := range d.stringValues { - flags = append(flags, "--set-string", stringValue) - } - for _, valueFile := range d.valueFiles { - flags = append(flags, "--values", valueFile) - } - for _, fileValue := range d.fileValues { - flags = append(flags, "--set-file", fileValue) + defer os.Remove(tmpfile.Name()) + if err := d.writeExistingValues(tmpfile); err != nil { + return nil, err } + flags = append(flags, "--values", tmpfile.Name()) + } + for _, value := range d.values { + flags = append(flags, "--set", value) + } + for _, stringValue := range d.stringValues { + flags = append(flags, "--set-string", stringValue) + } + for _, valueFile := range d.valueFiles { + flags = append(flags, "--values", valueFile) + } + for _, fileValue := range d.fileValues { + flags = append(flags, "--set-file", fileValue) } args := []string{"template", d.release, d.chart} @@ -91,8 +96,8 @@ func (d *diffCmd) template() ([]byte, error) { return outputWithRichError(cmd) } -func (d *diffCmd) existingValues(f *os.File) error { - cmd := exec.Command(os.Getenv("HELM_BIN"), "get", "values", d.release, "--all") +func (d *diffCmd) writeExistingValues(f *os.File) error { + cmd := exec.Command(os.Getenv("HELM_BIN"), "get", "values", d.release, "--all", "--output", "yaml") debugPrint("Executing %s", strings.Join(cmd.Args, " ")) defer f.Close() cmd.Stdout = f diff --git a/cmd/upgrade.go b/cmd/upgrade.go index c29efd94..f4fde3e4 100644 --- a/cmd/upgrade.go +++ b/cmd/upgrade.go @@ -86,7 +86,7 @@ func newChartCommand() *cobra.Command { f.StringArrayVar(&diff.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.StringArrayVar(&diff.stringValues, "set-string", []string{}, "set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") f.StringArrayVar(&diff.fileValues, "set-file", []string{}, "set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2)") - f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values") + f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values. If '--reset-values' is specified, this is ignored") f.BoolVar(&diff.resetValues, "reset-values", false, "reset the values to the ones built into the chart and merge in any new values") f.BoolVar(&diff.allowUnreleased, "allow-unreleased", false, "enables diffing of releases that are not yet deployed via Helm") f.BoolVar(&diff.noHooks, "no-hooks", false, "disable diffing of hooks")