@@ -14,34 +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 )
38+ }
39+
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
3751 }
52+ return true , nil
53+ }
3854
39- if minHelmVersion .GreaterThan (helmVersion ) {
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
43-
4462}
63+
4564func getRelease (release , namespace string ) ([]byte , error ) {
4665 args := []string {"get" , "manifest" , release }
4766 if namespace != "" {
@@ -177,7 +196,11 @@ func (d *diffCmd) template(isUpgrade bool) ([]byte, error) {
177196 flags = append (flags , "--install" )
178197 }
179198
180- flags = append (flags , "--dry-run" )
199+ if useDryRunService , err := isHelmVersionAtLeast (minHelmVersionWithDryRunLookupSupport ); err == nil && useDryRunService {
200+ flags = append (flags , "--dry-run=server" )
201+ } else {
202+ flags = append (flags , "--dry-run" )
203+ }
181204 subcmd = "upgrade"
182205 filter = func (s []byte ) []byte {
183206 return extractManifestFromHelmUpgradeDryRunOutput (s , d .noHooks )
@@ -199,6 +222,10 @@ func (d *diffCmd) template(isUpgrade bool) ([]byte, error) {
199222 flags = append (flags , "--kube-version" , d .kubeVersion )
200223 }
201224
225+ if useDryRunService , err := isHelmVersionAtLeast (minHelmVersionWithDryRunLookupSupport ); err == nil && useDryRunService {
226+ flags = append (flags , "--dry-run=server" )
227+ }
228+
202229 subcmd = "template"
203230
204231 filter = func (s []byte ) []byte {
0 commit comments