Skip to content

Commit 62419ae

Browse files
committed
fix upgrade command for helm version 3
helm 3.1.0 finally allows to render templates with correct .Capabilities values, by using --validate --is-upgrade Fixes #165, #168 For some more details see helm/helm#7054
1 parent f3d8786 commit 62419ae

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

cmd/helm3.go

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,46 @@
11
package cmd
22

33
import (
4+
"fmt"
45
"io/ioutil"
56
"os"
67
"os/exec"
8+
"regexp"
79
"strconv"
810
"strings"
11+
12+
"github.com/Masterminds/semver"
13+
)
14+
15+
var (
16+
helmVersionRE = regexp.MustCompile(`Version:\s*"([^"]+)"`)
17+
minHelmVersion = semver.MustParse("v3.1.0-rc.1")
918
)
1019

20+
func compatibleHelm3Version() error {
21+
cmd := exec.Command(os.Getenv("HELM_BIN"), "version")
22+
debugPrint("Executing %s", strings.Join(cmd.Args, " "))
23+
output, err := cmd.CombinedOutput()
24+
if err != nil {
25+
return fmt.Errorf("Failed to run `%s version`: %v", os.Getenv("HELM_BIN"), err)
26+
}
27+
versionOutput := string(output)
28+
29+
matches := helmVersionRE.FindStringSubmatch(versionOutput)
30+
if matches == nil {
31+
return fmt.Errorf("Failed to find version in output %#v", versionOutput)
32+
}
33+
helmVersion, err := semver.NewVersion(matches[1])
34+
if err != nil {
35+
return fmt.Errorf("Failed to parse version %#v: %v", matches[1], err)
36+
}
37+
38+
if minHelmVersion.GreaterThan(helmVersion) {
39+
return fmt.Errorf("helm diff upgrade requires at least helm version %s", minHelmVersion.String())
40+
}
41+
return nil
42+
43+
}
1144
func getRelease(release, namespace string) ([]byte, error) {
1245
args := []string{"get", "manifest", release}
1346
if namespace != "" {
@@ -48,7 +81,7 @@ func getChart(release, namespace string) (string, error) {
4881
return string(out), nil
4982
}
5083

51-
func (d *diffCmd) template() ([]byte, error) {
84+
func (d *diffCmd) template(isUpgrade bool) ([]byte, error) {
5285
flags := []string{}
5386
if d.devel {
5487
flags = append(flags, "--devel")
@@ -90,11 +123,10 @@ func (d *diffCmd) template() ([]byte, error) {
90123
flags = append(flags, "--set-file", fileValue)
91124
}
92125

93-
//This is a workaround until https://github.com/helm/helm/pull/6729 is released
94-
for _, apiVersion := range strings.Split(os.Getenv("HELM_TEMPLATE_API_VERSIONS"), ",") {
95-
if apiVersion != "" {
96-
flags = append(flags, "--api-versions", strings.TrimSpace(apiVersion))
97-
}
126+
flags = append(flags, "--validate")
127+
128+
if isUpgrade {
129+
flags = append(flags, "--is-upgrade")
98130
}
99131

100132
args := []string{"template", d.release, d.chart}

cmd/upgrade.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ func newChartCommand() *cobra.Command {
107107
}
108108

109109
func (d *diffCmd) runHelm3() error {
110+
111+
if err := compatibleHelm3Version(); err != nil {
112+
return err
113+
}
110114
releaseManifest, err := getRelease(d.release, d.namespace)
111115

112116
var newInstall bool
@@ -124,7 +128,7 @@ func (d *diffCmd) runHelm3() error {
124128
return fmt.Errorf("Failed to get release %s in namespace %s: %s", d.release, d.namespace, err)
125129
}
126130

127-
installManifest, err := d.template()
131+
installManifest, err := d.template(!newInstall)
128132
if err != nil {
129133
return fmt.Errorf("Failed to render chart: %s", err)
130134
}

0 commit comments

Comments
 (0)