@@ -14,33 +14,53 @@ import (
1414)
1515
1616var (
17- helmVersionRE = regexp .MustCompile (`Version:\s*"([^"]+)"` )
18- minHelmVersion = semver .MustParse ("v3.1.0-rc.1" )
17+ helmVersionRE = regexp .MustCompile (`Version:\s*"([^"]+)"` )
18+ minHelmVersion = semver .MustParse ("v3.1.0-rc.1" )
19+ minHelmVersionWithDryRunLookupSupport = semver .MustParse ("v3.13.0" )
1920)
2021
21- func compatibleHelm3Version () error {
22+ func getHelmVersion () ( * semver. Version , error ) {
2223 cmd := exec .Command (os .Getenv ("HELM_BIN" ), "version" )
2324 debugPrint ("Executing %s" , strings .Join (cmd .Args , " " ))
2425 output , err := cmd .CombinedOutput ()
2526 if err != nil {
26- return fmt .Errorf ("Failed to run `%s version`: %v" , os .Getenv ("HELM_BIN" ), err )
27+ return nil , fmt .Errorf ("Failed to run `%s version`: %v" , os .Getenv ("HELM_BIN" ), err )
2728 }
2829 versionOutput := string (output )
2930
3031 matches := helmVersionRE .FindStringSubmatch (versionOutput )
3132 if matches == nil {
32- return fmt .Errorf ("Failed to find version in output %#v" , versionOutput )
33+ return nil , fmt .Errorf ("Failed to find version in output %#v" , versionOutput )
3334 }
3435 helmVersion , err := semver .NewVersion (matches [1 ])
3536 if err != nil {
36- return fmt .Errorf ("Failed to parse version %#v: %v" , matches [1 ], err )
37+ return nil , fmt .Errorf ("Failed to parse version %#v: %v" , matches [1 ], err )
3738 }
3839
39- if minHelmVersion .GreaterThan (helmVersion ) {
40+ return helmVersion , nil
41+ }
42+
43+ func isHelmVersionAtLeast (versionToCompareTo * semver.Version ) (bool , error ) {
44+ helmVersion , err := getHelmVersion ()
45+
46+ if err != nil {
47+ return false , err
48+ }
49+ if helmVersion .LessThan (versionToCompareTo ) {
50+ return false , nil
51+ }
52+ return true , nil
53+ }
54+
55+ func compatibleHelm3Version () error {
56+ if isCompatible , err := isHelmVersionAtLeast (minHelmVersion ); err != nil {
57+ return err
58+ } else if ! isCompatible {
4059 return fmt .Errorf ("helm diff upgrade requires at least helm version %s" , minHelmVersion .String ())
4160 }
4261 return nil
4362}
63+
4464func getRelease (release , namespace string ) ([]byte , error ) {
4565 args := []string {"get" , "manifest" , release }
4666 if namespace != "" {
@@ -183,7 +203,11 @@ func (d *diffCmd) template(isUpgrade bool) ([]byte, error) {
183203 flags = append (flags , "--install" )
184204 }
185205
186- flags = append (flags , "--dry-run" )
206+ if useDryRunService , err := isHelmVersionAtLeast (minHelmVersionWithDryRunLookupSupport ); err == nil && useDryRunService {
207+ flags = append (flags , "--dry-run=server" )
208+ } else {
209+ flags = append (flags , "--dry-run" )
210+ }
187211 subcmd = "upgrade"
188212 filter = func (s []byte ) []byte {
189213 return extractManifestFromHelmUpgradeDryRunOutput (s , d .noHooks )
@@ -205,6 +229,10 @@ func (d *diffCmd) template(isUpgrade bool) ([]byte, error) {
205229 flags = append (flags , "--kube-version" , d .kubeVersion )
206230 }
207231
232+ if useDryRunService , err := isHelmVersionAtLeast (minHelmVersionWithDryRunLookupSupport ); err == nil && useDryRunService {
233+ flags = append (flags , "--dry-run=server" )
234+ }
235+
208236 subcmd = "template"
209237
210238 filter = func (s []byte ) []byte {
0 commit comments