@@ -14,33 +14,53 @@ import (
14
14
)
15
15
16
16
var (
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" )
19
20
)
20
21
21
- func compatibleHelm3Version () error {
22
+ func getHelmVersion () ( * semver. Version , error ) {
22
23
cmd := exec .Command (os .Getenv ("HELM_BIN" ), "version" )
23
24
debugPrint ("Executing %s" , strings .Join (cmd .Args , " " ))
24
25
output , err := cmd .CombinedOutput ()
25
26
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 )
27
28
}
28
29
versionOutput := string (output )
29
30
30
31
matches := helmVersionRE .FindStringSubmatch (versionOutput )
31
32
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 )
33
34
}
34
35
helmVersion , err := semver .NewVersion (matches [1 ])
35
36
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 )
37
38
}
38
39
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 {
40
59
return fmt .Errorf ("helm diff upgrade requires at least helm version %s" , minHelmVersion .String ())
41
60
}
42
61
return nil
43
62
}
63
+
44
64
func getRelease (release , namespace string ) ([]byte , error ) {
45
65
args := []string {"get" , "manifest" , release }
46
66
if namespace != "" {
@@ -183,7 +203,11 @@ func (d *diffCmd) template(isUpgrade bool) ([]byte, error) {
183
203
flags = append (flags , "--install" )
184
204
}
185
205
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
+ }
187
211
subcmd = "upgrade"
188
212
filter = func (s []byte ) []byte {
189
213
return extractManifestFromHelmUpgradeDryRunOutput (s , d .noHooks )
@@ -205,6 +229,10 @@ func (d *diffCmd) template(isUpgrade bool) ([]byte, error) {
205
229
flags = append (flags , "--kube-version" , d .kubeVersion )
206
230
}
207
231
232
+ if useDryRunService , err := isHelmVersionAtLeast (minHelmVersionWithDryRunLookupSupport ); err == nil && useDryRunService {
233
+ flags = append (flags , "--dry-run=server" )
234
+ }
235
+
208
236
subcmd = "template"
209
237
210
238
filter = func (s []byte ) []byte {
0 commit comments