Skip to content

Commit 3be20a8

Browse files
Use dry-run=server to enable lookups
Helm PR helm/helm#9426 enables support for executing lookups during dry run. This PR is to make use of this new support in helm-diff. Backwards compatibility for older versions of helm is maintained by checking the helm version before setting the flag Addresses issue: #449 Signed-off-by: MichaelMorris <[email protected]>
1 parent 1699f76 commit 3be20a8

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

cmd/helm3.go

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,53 @@ import (
1414
)
1515

1616
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")
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+
4564
func 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

Comments
 (0)