Skip to content

Commit 0cafd7c

Browse files
authored
Merge pull request #15 from jrnt30/new-chart-diff
New chart diffing
2 parents 71337e5 + e55bb2e commit 0cafd7c

File tree

2 files changed

+45
-13
lines changed

2 files changed

+45
-13
lines changed

cmd/upgrade.go

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package cmd
22

33
import (
4+
"fmt"
45
"os"
6+
"strings"
57

68
"github.com/databus23/helm-diff/diff"
79
"github.com/databus23/helm-diff/manifest"
@@ -18,6 +20,7 @@ type diffCmd struct {
1820
values []string
1921
reuseValues bool
2022
resetValues bool
23+
allowUnreleased bool
2124
suppressedKinds []string
2225
}
2326

@@ -62,6 +65,7 @@ func newChartCommand() *cobra.Command {
6265
f.StringArrayVar(&diff.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)")
6366
f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values")
6467
f.BoolVar(&diff.resetValues, "reset-values", false, "reset the values to the ones built into the chart and merge in any new values")
68+
f.BoolVar(&diff.allowUnreleased, "allow-unreleased", false, "enables diffing of releases that are not yet deployed via Helm")
6569
f.StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output")
6670

6771
return cmd
@@ -85,24 +89,53 @@ func (d *diffCmd) run() error {
8589

8690
releaseResponse, err := d.client.ReleaseContent(d.release)
8791

88-
if err != nil {
89-
return prettyError(err)
92+
var newInstall bool
93+
if err != nil && strings.Contains(err.Error(), fmt.Sprintf("release: %q not found", d.release)) {
94+
if d.allowUnreleased {
95+
fmt.Printf("********************\n\n\tRelease was not present in Helm. Diff will show entire contents as new.\n\n********************\n")
96+
newInstall = true
97+
err = nil
98+
} else {
99+
fmt.Printf("********************\n\n\tRelease was not present in Helm. Include the `--allow-unreleased` to perform diff without exiting in error.\n\n********************\n")
100+
}
101+
90102
}
91103

92-
upgradeResponse, err := d.client.UpdateRelease(
93-
d.release,
94-
chartPath,
95-
helm.UpdateValueOverrides(rawVals),
96-
helm.ReuseValues(d.reuseValues),
97-
helm.ResetValues(d.resetValues),
98-
helm.UpgradeDryRun(true),
99-
)
100104
if err != nil {
101105
return prettyError(err)
102106
}
103107

104-
currentSpecs := manifest.Parse(releaseResponse.Release.Manifest)
105-
newSpecs := manifest.Parse(upgradeResponse.Release.Manifest)
108+
var currentSpecs, newSpecs map[string]*manifest.MappingResult
109+
if newInstall {
110+
installResponse, err := d.client.InstallRelease(
111+
chartPath,
112+
"default",
113+
helm.ReleaseName(d.release),
114+
helm.ValueOverrides(rawVals),
115+
helm.InstallDryRun(true),
116+
)
117+
if err != nil {
118+
return prettyError(err)
119+
}
120+
121+
currentSpecs = make(map[string]*manifest.MappingResult)
122+
newSpecs = manifest.Parse(installResponse.Release.Manifest)
123+
} else {
124+
upgradeResponse, err := d.client.UpdateRelease(
125+
d.release,
126+
chartPath,
127+
helm.UpdateValueOverrides(rawVals),
128+
helm.ReuseValues(d.reuseValues),
129+
helm.ResetValues(d.resetValues),
130+
helm.UpgradeDryRun(true),
131+
)
132+
if err != nil {
133+
return prettyError(err)
134+
}
135+
136+
currentSpecs = manifest.Parse(releaseResponse.Release.Manifest)
137+
newSpecs = manifest.Parse(upgradeResponse.Release.Manifest)
138+
}
106139

107140
diff.DiffManifests(currentSpecs, newSpecs, d.suppressedKinds, os.Stdout)
108141

main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
)
88

99
func main() {
10-
1110
if err := cmd.New().Execute(); err != nil {
1211
os.Exit(1)
1312
}

0 commit comments

Comments
 (0)