Skip to content

Commit c54f085

Browse files
Use dry-run=server to enable lookups (#458)
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 94d90a5 commit c54f085

File tree

1 file changed

+36
-8
lines changed

1 file changed

+36
-8
lines changed

cmd/helm3.go

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +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)
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+
4464
func 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

Comments
 (0)