From 81d477f6653359cfe985c8bae1b354dd068678b9 Mon Sep 17 00:00:00 2001 From: Aananth K Date: Thu, 25 Jan 2018 00:47:22 +0530 Subject: [PATCH 1/5] feature Implementing: Diff between Revisions #6 --- README.md | 66 +++++++++++++++++++-- main.go | 174 ++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 210 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 8eef7144..245b7775 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,79 @@ This is a Helm plugin giving your a preview of what a `helm upgrade` would change. It basically generates a diff between the latest deployed version of a release -and a `helm upgrade --debug --dry-run` +and a `helm upgrade --debug --dry-run`. This can also be used to compare two +revisions/versions of your helm release. ## Usage ``` -$ helm diff [flags] RELEASE CHART +The Helm Diff Plugin + +* Shows a diff explaing what a helm upgrade would change: + This fetches the currently deployed version of a release + and compares it to a local chart plus values. This can be + used visualize what changes a helm upgrade will perform. + +* Shows a diff explaing what had changed between two revisions: + This fetches previously deployed versions of a release + and compares them. This can be used visualize what changes + were made during revision change. + +Usage: + diff [command] + +Available Commands: + revision Shows diff between revision's manifests + upgrade visualize changes, that a helm upgrade could perform + version print the version information + +Flags: + -h, --help help for diff + +Use "diff [command] --help" for more information about a command. +``` + +## Commands: + +### upgrade: + ``` +$ helm diff upgrade -h +This command compares the manifests details of a named release +with values generated form charts. -### Flags: +It forecasts/visualizes changes, that a helm upgrade could perform. +Usage: + diff upgrade [flags] [RELEASE] [CHART] + +Flags: + --reuse-values reuse the last release's values and merge in any new values + --set stringArray set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) + --suppress stringArray allows suppression of the values listed in the diff output + -q, --suppress-secrets suppress secrets in the output + -f, --values valueFiles specify values in a YAML file (can specify multiple) (default []) ``` - --set string set values on the command line. See 'helm install -h' - -f, --values valueFiles specify one or more YAML files of values (default []) + +### revision: + ``` +$ helm diff revision -h +This command compares the manifests details of a named release. + +It can be used to compare the manifests of + + - lastest REVISION with specified REVISION + $ helm diff revision [flags] [RELEASE] REVISION + - REVISION1 with REVISION2 + $ helm diff revision [flags] [RELEASE] REVISION1 REVISION1 + +Usage: + diff revision [flags] [RELEASE] REVISION1 REVISION2 +``` ## Install diff --git a/main.go b/main.go index c9b98f2e..39d4a8bc 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,8 @@ package main import ( "fmt" "os" - + "errors" + "strconv" "github.com/spf13/cobra" "k8s.io/helm/pkg/helm" @@ -11,12 +12,17 @@ import ( ) const globalUsage = ` -Show a diff explaing what a helm upgrade would change. +The Helm Diff Plugin + +* Shows a diff explaing what a helm upgrade would change: + This fetches the currently deployed version of a release + and compares it to a local chart plus values. This can be + used visualize what changes a helm upgrade will perform. -This fetches the currently deployed version of a release -and compares it to a local chart plus values. -This can be used visualize what changes a helm upgrade will -perform. +* Shows a diff explaing what had changed between two revisions: + This fetches previously deployed versions of a release + and compares them. This can be used visualize what changes + were made during revision change. ` // Version identifier populated via the CI/CD process. @@ -30,23 +36,83 @@ type diffCmd struct { values []string reuseValues bool suppressedKinds []string + revisions []string } func main() { diff := diffCmd{} - cmd := &cobra.Command{ - Use: "diff [flags] [RELEASE] [CHART]", - Short: "Show manifest differences", - Long: globalUsage, - RunE: func(cmd *cobra.Command, args []string) error { + +const upgradeCmdLongUsage = ` +This command compares the manifests details of a named release +with values generated form charts. + +It forecasts/visualizes changes, that a helm upgrade could perform. +` + upgradeCmd := &cobra.Command{ + Use : "upgrade [flags] [RELEASE] [CHART]", + Short : "visualize changes, that a helm upgrade could perform", + Long : upgradeCmdLongUsage, + RunE : func(cmd *cobra.Command, args []string) error { + if v, _ := cmd.Flags().GetBool("version"); v { + fmt.Println(Version) + return nil + } + + if err := checkArgsLength(len(args), "release name", "chart path"); err != nil { + return err + } + + if q, _ := cmd.Flags().GetBool("suppress-secrets"); q { + diff.suppressedKinds = append(diff.suppressedKinds, "Secret") + } + + diff.release = args[0] + diff.chart = args[1] + + if diff.client == nil { + diff.client = helm.NewClient(helm.Host(os.Getenv("TILLER_HOST"))) + } + + return diff.forecast() + }, + } + + upgradeCmd.SuggestionsMinimumDistance=1 + f := upgradeCmd.Flags() + f.VarP(&diff.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") + f.StringArrayVar(&diff.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") + f.BoolP("suppress-secrets", "q", false, "suppress secrets in the output") + f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values") + f.StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output") + +const revisionCmdLongUsage = ` +This command compares the manifests details of a named release. + +It can be used to compare the manifests of + + - lastest REVISION with specified REVISION + $ helm diff revision [flags] [RELEASE] REVISION + + - REVISION1 with REVISION2 + $ helm diff revision [flags] [RELEASE] REVISION1 REVISION1 +` + + revisionCmd := &cobra.Command{ + Use : "revision [flags] [RELEASE] REVISION1 REVISION2", + Short : "Shows diff between revision's manifests", + Long : revisionCmdLongUsage, + RunE : func(cmd *cobra.Command, args []string) error { if v, _ := cmd.Flags().GetBool("version"); v { fmt.Println(Version) return nil } - if err := checkArgsLength(len(args), "release name", "chart path"); err != nil { - return err + switch { + case len(args) < 2 : + return errors.New("Too few arguments to Command \"revision\".\nMinimum 2 arguments required: release name, revision") + case len(args) > 3 : + return errors.New("Too many arguments to Command \"revision\".\nMaximum 3 arguments allowed: release name, revision1, revision2") } if q, _ := cmd.Flags().GetBool("suppress-secrets"); q { @@ -54,28 +120,43 @@ func main() { } diff.release = args[0] - diff.chart = args[1] + diff.revisions = args[1:] if diff.client == nil { diff.client = helm.NewClient(helm.Host(os.Getenv("TILLER_HOST"))) } - return diff.run() + return diff.differentiate() + }, + } + + revisionCmd.SuggestionsMinimumDistance=1 + + versionCmd := &cobra.Command{ + Use: "version", + Short: "print the version information", + RunE: func(cmd *cobra.Command, args []string) error { + fmt.Println(Version) + return nil }, + } + + rootCmd := &cobra.Command{ + Use : "diff", + Short : "Show differences between release revisions", + Long : globalUsage, } - f := cmd.Flags() - f.BoolP("version", "v", false, "show version") - f.BoolP("suppress-secrets", "q", false, "suppress secrets in the output") - f.VarP(&diff.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") - f.StringArrayVar(&diff.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") - f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values") - f.StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output") + rootCmd.AddCommand( + upgradeCmd, + revisionCmd, + versionCmd, + ) - if err := cmd.Execute(); err != nil { - os.Exit(1) + if err := rootCmd.Execute(); err != nil { + os.Exit(0) } } -func (d *diffCmd) run() error { +func (d *diffCmd) forecast() error { chartPath, err := locateChartPath(d.chart, "", false, "") if err != nil { return err @@ -110,3 +191,46 @@ func (d *diffCmd) run() error { return nil } + +func (d *diffCmd) differentiate() error { + + switch len(d.revisions) { + case 1: + releaseResponse, err := d.client.ReleaseContent(d.release) + + if err != nil { + return prettyError(err) + } + + revision, _ := strconv.Atoi(d.revisions[0]) + revisionResponse, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision))) + if err != nil { + return prettyError(err) + } + + diffManifests(manifest.Parse(revisionResponse.Release.Manifest),manifest.Parse(releaseResponse.Release.Manifest), d.suppressedKinds, os.Stdout) + + case 2: + revision1, _ := strconv.Atoi(d.revisions[0]) + revision2, _ := strconv.Atoi(d.revisions[1]) + if revision1 > revision2 { + revision1,revision2 = revision2,revision1 + } + + revisionResponse1, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision1))) + if err != nil { + return prettyError(err) + } + + revisionResponse2, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision2))) + if err != nil { + return prettyError(err) + } + + diffManifests(manifest.Parse(revisionResponse1.Release.Manifest), manifest.Parse(revisionResponse2.Release.Manifest), d.suppressedKinds, os.Stdout) + + default: return errors.New("Invalid Arguments") + } + + return nil +} From 9dc51dc4aa69b1df1a2354697e397ee88e12dbc3 Mon Sep 17 00:00:00 2001 From: Aananth K Date: Fri, 26 Jan 2018 18:21:03 +0530 Subject: [PATCH 2/5] adding feature to diff what a helm rollback can change --- main.go | 235 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 149 insertions(+), 86 deletions(-) diff --git a/main.go b/main.go index c97427eb..79c9965c 100644 --- a/main.go +++ b/main.go @@ -1,12 +1,12 @@ package main import ( - "fmt" - "os" "errors" - "strconv" + "fmt" "github.com/spf13/cobra" "k8s.io/helm/pkg/helm" + "os" + "strconv" "github.com/databus23/helm-diff/manifest" ) @@ -20,6 +20,11 @@ The Helm Diff Plugin and compares it to a local chart plus values. This can be used visualize what changes a helm upgrade will perform. +* Shows a diff explaing what a helm rollback would change: + This fetches the currently deployed version of a release + and compares it rollback revision. This can be + used visualize what changes a helm rollback will perform. + * Shows a diff explaing what had changed between two revisions: This fetches previously deployed versions of a release and compares them. This can be used visualize what changes @@ -37,49 +42,48 @@ type diffCmd struct { values []string reuseValues bool suppressedKinds []string - revisions []string + revisions []string } func main() { diff := diffCmd{} - -const upgradeCmdLongUsage = ` + const upgradeCmdLongUsage = ` This command compares the manifests details of a named release with values generated form charts. It forecasts/visualizes changes, that a helm upgrade could perform. ` upgradeCmd := &cobra.Command{ - Use : "upgrade [flags] [RELEASE] [CHART]", - Short : "visualize changes, that a helm upgrade could perform", - Long : upgradeCmdLongUsage, - RunE : func(cmd *cobra.Command, args []string) error { - if v, _ := cmd.Flags().GetBool("version"); v { - fmt.Println(Version) - return nil - } + Use: "upgrade [flags] [RELEASE] [CHART]", + Short: "visualize changes, that a helm upgrade could perform", + Long: upgradeCmdLongUsage, + RunE: func(cmd *cobra.Command, args []string) error { + if v, _ := cmd.Flags().GetBool("version"); v { + fmt.Println(Version) + return nil + } - if err := checkArgsLength(len(args), "release name", "chart path"); err != nil { - return err - } + if err := checkArgsLength(len(args), "release name", "chart path"); err != nil { + return err + } - if q, _ := cmd.Flags().GetBool("suppress-secrets"); q { - diff.suppressedKinds = append(diff.suppressedKinds, "Secret") - } + if q, _ := cmd.Flags().GetBool("suppress-secrets"); q { + diff.suppressedKinds = append(diff.suppressedKinds, "Secret") + } - diff.release = args[0] - diff.chart = args[1] - - if diff.client == nil { - diff.client = helm.NewClient(helm.Host(os.Getenv("TILLER_HOST"))) - } + diff.release = args[0] + diff.chart = args[1] + + if diff.client == nil { + diff.client = helm.NewClient(helm.Host(os.Getenv("TILLER_HOST"))) + } - return diff.forecast() + return diff.forecast() }, } - upgradeCmd.SuggestionsMinimumDistance=1 + upgradeCmd.SuggestionsMinimumDistance = 1 f := upgradeCmd.Flags() f.VarP(&diff.valueFiles, "values", "f", "specify values in a YAML file (can specify multiple)") f.StringArrayVar(&diff.values, "set", []string{}, "set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)") @@ -87,7 +91,44 @@ It forecasts/visualizes changes, that a helm upgrade could perform. f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values") f.StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output") -const revisionCmdLongUsage = ` + const rollbackCmdLongUsage = ` +This command compares the laset manifests details of a named release +with specific revision values to rollback. + +It forecasts/visualizes changes, that a helm rollback could perform. +` + rollbackCmd := &cobra.Command{ + Use: "rollback [flags] [RELEASE] REVISION", + Short: "visualize changes, that a helm rollback could perform", + Long: rollbackCmdLongUsage, + RunE: func(cmd *cobra.Command, args []string) error { + if v, _ := cmd.Flags().GetBool("version"); v { + fmt.Println(Version) + return nil + } + + if err := checkArgsLength(len(args), "release name", "revision number"); err != nil { + return err + } + + if q, _ := cmd.Flags().GetBool("suppress-secrets"); q { + diff.suppressedKinds = append(diff.suppressedKinds, "Secret") + } + + diff.release = args[0] + diff.revisions = args[1:] + + if diff.client == nil { + diff.client = helm.NewClient(helm.Host(os.Getenv("TILLER_HOST"))) + } + + return diff.backcast() + }, + } + + rollbackCmd.SuggestionsMinimumDistance = 1 + + const revisionCmdLongUsage = ` This command compares the manifests details of a named release. It can be used to compare the manifests of @@ -100,20 +141,20 @@ It can be used to compare the manifests of ` revisionCmd := &cobra.Command{ - Use : "revision [flags] [RELEASE] REVISION1 REVISION2", - Short : "Shows diff between revision's manifests", - Long : revisionCmdLongUsage, - RunE : func(cmd *cobra.Command, args []string) error { + Use: "revision [flags] [RELEASE] REVISION1 REVISION2", + Short: "Shows diff between revision's manifests", + Long: revisionCmdLongUsage, + RunE: func(cmd *cobra.Command, args []string) error { if v, _ := cmd.Flags().GetBool("version"); v { fmt.Println(Version) return nil } switch { - case len(args) < 2 : - return errors.New("Too few arguments to Command \"revision\".\nMinimum 2 arguments required: release name, revision") - case len(args) > 3 : - return errors.New("Too many arguments to Command \"revision\".\nMaximum 3 arguments allowed: release name, revision1, revision2") + case len(args) < 2: + return errors.New("Too few arguments to Command \"revision\".\nMinimum 2 arguments required: release name, revision") + case len(args) > 3: + return errors.New("Too many arguments to Command \"revision\".\nMaximum 3 arguments allowed: release name, revision1, revision2") } if q, _ := cmd.Flags().GetBool("suppress-secrets"); q { @@ -127,9 +168,9 @@ It can be used to compare the manifests of } return diff.differentiate() }, - } + } - revisionCmd.SuggestionsMinimumDistance=1 + revisionCmd.SuggestionsMinimumDistance = 1 versionCmd := &cobra.Command{ Use: "version", @@ -138,17 +179,19 @@ It can be used to compare the manifests of fmt.Println(Version) return nil }, - } + } rootCmd := &cobra.Command{ - Use : "diff", - Short : "Show differences between release revisions", - Long : globalUsage, + Use: "diff", + Short: "Show differences between release revisions", + Long: globalUsage, + SilenceUsage: true, } rootCmd.AddCommand( upgradeCmd, revisionCmd, + rollbackCmd, versionCmd, ) @@ -157,6 +200,69 @@ It can be used to compare the manifests of } } +func (d *diffCmd) backcast() error { + + releaseResponse, err := d.client.ReleaseContent(d.release) + + if err != nil { + return prettyError(err) + } + + revision, _ := strconv.Atoi(d.revisions[0]) + revisionResponse, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision))) + if err != nil { + return prettyError(err) + } + + diffManifests(manifest.Parse(revisionResponse.Release.Manifest), manifest.Parse(releaseResponse.Release.Manifest), d.suppressedKinds, os.Stdout) + + return nil +} + +func (d *diffCmd) differentiate() error { + + switch len(d.revisions) { + case 1: + releaseResponse, err := d.client.ReleaseContent(d.release) + + if err != nil { + return prettyError(err) + } + + revision, _ := strconv.Atoi(d.revisions[0]) + revisionResponse, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision))) + if err != nil { + return prettyError(err) + } + + diffManifests(manifest.Parse(revisionResponse.Release.Manifest), manifest.Parse(releaseResponse.Release.Manifest), d.suppressedKinds, os.Stdout) + + case 2: + revision1, _ := strconv.Atoi(d.revisions[0]) + revision2, _ := strconv.Atoi(d.revisions[1]) + if revision1 > revision2 { + revision1, revision2 = revision2, revision1 + } + + revisionResponse1, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision1))) + if err != nil { + return prettyError(err) + } + + revisionResponse2, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision2))) + if err != nil { + return prettyError(err) + } + + diffManifests(manifest.Parse(revisionResponse1.Release.Manifest), manifest.Parse(revisionResponse2.Release.Manifest), d.suppressedKinds, os.Stdout) + + default: + return errors.New("Invalid Arguments") + } + + return nil +} + func (d *diffCmd) forecast() error { chartPath, err := locateChartPath(d.chart, "", false, "") if err != nil { @@ -192,46 +298,3 @@ func (d *diffCmd) forecast() error { return nil } - -func (d *diffCmd) differentiate() error { - - switch len(d.revisions) { - case 1: - releaseResponse, err := d.client.ReleaseContent(d.release) - - if err != nil { - return prettyError(err) - } - - revision, _ := strconv.Atoi(d.revisions[0]) - revisionResponse, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision))) - if err != nil { - return prettyError(err) - } - - diffManifests(manifest.Parse(revisionResponse.Release.Manifest),manifest.Parse(releaseResponse.Release.Manifest), d.suppressedKinds, os.Stdout) - - case 2: - revision1, _ := strconv.Atoi(d.revisions[0]) - revision2, _ := strconv.Atoi(d.revisions[1]) - if revision1 > revision2 { - revision1,revision2 = revision2,revision1 - } - - revisionResponse1, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision1))) - if err != nil { - return prettyError(err) - } - - revisionResponse2, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision2))) - if err != nil { - return prettyError(err) - } - - diffManifests(manifest.Parse(revisionResponse1.Release.Manifest), manifest.Parse(revisionResponse2.Release.Manifest), d.suppressedKinds, os.Stdout) - - default: return errors.New("Invalid Arguments") - } - - return nil -} From 1a2cd17c67cbe4de7eb2f8484c23c03b96b6fcc5 Mon Sep 17 00:00:00 2001 From: Aananth K Date: Fri, 26 Jan 2018 18:34:25 +0530 Subject: [PATCH 3/5] readme updated --- README.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 245b7775..55f7460f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # Helm Diff Plugin -This is a Helm plugin giving your a preview of what a `helm upgrade` would change. -It basically generates a diff between the latest deployed version of a release -and a `helm upgrade --debug --dry-run`. This can also be used to compare two +This is a Helm plugin giving your a preview of what a `helm upgrade` or `helm rollback` +would change. It basically generates a diff between the latest deployed version of a +releaseand a `helm upgrade --debug --dry-run` when used with `upgrade` command or with +the specified rollback revision of release. This can also be used to compare two revisions/versions of your helm release. @@ -10,6 +11,7 @@ revisions/versions of your helm release. ## Usage ``` +$ helm diff The Helm Diff Plugin * Shows a diff explaing what a helm upgrade would change: @@ -17,6 +19,11 @@ The Helm Diff Plugin and compares it to a local chart plus values. This can be used visualize what changes a helm upgrade will perform. +* Shows a diff explaing what a helm rollback would change: + This fetches the currently deployed version of a release + and compares it rollback revision. This can be + used visualize what changes a helm rollback will perform. + * Shows a diff explaing what had changed between two revisions: This fetches previously deployed versions of a release and compares them. This can be used visualize what changes @@ -27,6 +34,7 @@ Usage: Available Commands: revision Shows diff between revision's manifests + rollback visualize changes, that a helm rollback could perform upgrade visualize changes, that a helm upgrade could perform version print the version information @@ -58,6 +66,20 @@ Flags: -f, --values valueFiles specify values in a YAML file (can specify multiple) (default []) ``` +### rollback: + +``` +$ helm diff rollback -h +This command compares the laset manifests details of a named release +with specific revision values to rollback. + +It forecasts/visualizes changes, that a helm rollback could perform. + +Usage: + diff rollback [flags] [RELEASE] REVISION + +``` + ### revision: ``` From 3fc923449315708f401a1fe02306f0586c9afe4e Mon Sep 17 00:00:00 2001 From: aananthraj Date: Thu, 8 Feb 2018 05:38:07 +0530 Subject: [PATCH 4/5] syncig with upstream master --- README.md | 28 +++++++++++-- main.go | 117 +++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 115 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 245b7775..55f7460f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # Helm Diff Plugin -This is a Helm plugin giving your a preview of what a `helm upgrade` would change. -It basically generates a diff between the latest deployed version of a release -and a `helm upgrade --debug --dry-run`. This can also be used to compare two +This is a Helm plugin giving your a preview of what a `helm upgrade` or `helm rollback` +would change. It basically generates a diff between the latest deployed version of a +releaseand a `helm upgrade --debug --dry-run` when used with `upgrade` command or with +the specified rollback revision of release. This can also be used to compare two revisions/versions of your helm release. @@ -10,6 +11,7 @@ revisions/versions of your helm release. ## Usage ``` +$ helm diff The Helm Diff Plugin * Shows a diff explaing what a helm upgrade would change: @@ -17,6 +19,11 @@ The Helm Diff Plugin and compares it to a local chart plus values. This can be used visualize what changes a helm upgrade will perform. +* Shows a diff explaing what a helm rollback would change: + This fetches the currently deployed version of a release + and compares it rollback revision. This can be + used visualize what changes a helm rollback will perform. + * Shows a diff explaing what had changed between two revisions: This fetches previously deployed versions of a release and compares them. This can be used visualize what changes @@ -27,6 +34,7 @@ Usage: Available Commands: revision Shows diff between revision's manifests + rollback visualize changes, that a helm rollback could perform upgrade visualize changes, that a helm upgrade could perform version print the version information @@ -58,6 +66,20 @@ Flags: -f, --values valueFiles specify values in a YAML file (can specify multiple) (default []) ``` +### rollback: + +``` +$ helm diff rollback -h +This command compares the laset manifests details of a named release +with specific revision values to rollback. + +It forecasts/visualizes changes, that a helm rollback could perform. + +Usage: + diff rollback [flags] [RELEASE] REVISION + +``` + ### revision: ``` diff --git a/main.go b/main.go index 681736eb..d3383576 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,11 @@ The Helm Diff Plugin and compares it to a local chart plus values. This can be used visualize what changes a helm upgrade will perform. +* Shows a diff explaing what a helm rollback would change: + This fetches the currently deployed version of a release + and compares it rollback revision. This can be + used visualize what changes a helm rollback will perform. + * Shows a diff explaing what had changed between two revisions: This fetches previously deployed versions of a release and compares them. This can be used visualize what changes @@ -51,7 +56,7 @@ with values generated form charts. It forecasts/visualizes changes, that a helm upgrade could perform. ` upgradeCmd := &cobra.Command{ - Use: "upgrade [flags] [RELEASE] [CHART]", + Use: "upgrade [RELEASE] [CHART] [flags]", Short: "visualize changes, that a helm upgrade could perform", Long: upgradeCmdLongUsage, RunE: func(cmd *cobra.Command, args []string) error { @@ -87,16 +92,53 @@ It forecasts/visualizes changes, that a helm upgrade could perform. f.BoolVar(&diff.reuseValues, "reuse-values", false, "reuse the last release's values and merge in any new values") f.StringArrayVar(&diff.suppressedKinds, "suppress", []string{}, "allows suppression of the values listed in the diff output") + const rollbackCmdLongUsage = ` +This command compares the laset manifests details of a named release +with specific revision values to rollback. + +It forecasts/visualizes changes, that a helm rollback could perform. +` + rollbackCmd := &cobra.Command{ + Use: "rollback [flags] [RELEASE] [REVISION]", + Short: "visualize changes, that a helm rollback could perform", + Long: rollbackCmdLongUsage, + RunE: func(cmd *cobra.Command, args []string) error { + if v, _ := cmd.Flags().GetBool("version"); v { + fmt.Println(Version) + return nil + } + + if err := checkArgsLength(len(args), "release name", "revision number"); err != nil { + return err + } + + if q, _ := cmd.Flags().GetBool("suppress-secrets"); q { + diff.suppressedKinds = append(diff.suppressedKinds, "Secret") + } + + diff.release = args[0] + diff.revisions = args[1:] + + if diff.client == nil { + diff.client = helm.NewClient(helm.Host(os.Getenv("TILLER_HOST"))) + } + + return diff.backcast() + }, + } + + rollbackCmd.SuggestionsMinimumDistance = 1 + const revisionCmdLongUsage = ` This command compares the manifests details of a named release. It can be used to compare the manifests of - lastest REVISION with specified REVISION - $ helm diff revision [flags] [RELEASE] REVISION + $ helm diff revision [flags] [RELEASE] [REVISION] - REVISION1 with REVISION2 - $ helm diff revision [flags] [RELEASE] REVISION1 REVISION1 + $ helm diff revision [flags] [RELEASE] [REVISION1] [REVISION2] ` revisionCmd := &cobra.Command{ @@ -145,14 +187,16 @@ It can be used to compare the manifests of } rootCmd := &cobra.Command{ - Use: "diff", - Short: "Show differences between release revisions", - Long: globalUsage, + Use: "diff", + Short: "Show differences between release revisions", + Long: globalUsage, + SilenceUsage: true, } rootCmd.AddCommand( upgradeCmd, revisionCmd, + rollbackCmd, versionCmd, ) @@ -161,16 +205,7 @@ It can be used to compare the manifests of } } -func (d *diffCmd) forecast() error { - chartPath, err := locateChartPath(d.chart, "", false, "") - if err != nil { - return err - } - - rawVals, err := d.vals() - if err != nil { - return err - } +func (d *diffCmd) backcast() error { releaseResponse, err := d.client.ReleaseContent(d.release) @@ -178,21 +213,13 @@ func (d *diffCmd) forecast() error { return prettyError(err) } - upgradeResponse, err := d.client.UpdateRelease( - d.release, - chartPath, - helm.UpdateValueOverrides(rawVals), - helm.ReuseValues(d.reuseValues), - helm.UpgradeDryRun(true), - ) + revision, _ := strconv.Atoi(d.revisions[0]) + revisionResponse, err := d.client.ReleaseContent(d.release, helm.ContentReleaseVersion(int32(revision))) if err != nil { return prettyError(err) } - currentSpecs := manifest.Parse(releaseResponse.Release.Manifest) - newSpecs := manifest.Parse(upgradeResponse.Release.Manifest) - - diffManifests(currentSpecs, newSpecs, d.suppressedKinds, os.Stdout) + diffManifests(manifest.Parse(revisionResponse.Release.Manifest), manifest.Parse(releaseResponse.Release.Manifest), d.suppressedKinds, os.Stdout) return nil } @@ -240,3 +267,39 @@ func (d *diffCmd) differentiate() error { return nil } + +func (d *diffCmd) forecast() error { + chartPath, err := locateChartPath(d.chart, "", false, "") + if err != nil { + return err + } + + rawVals, err := d.vals() + if err != nil { + return err + } + + releaseResponse, err := d.client.ReleaseContent(d.release) + + if err != nil { + return prettyError(err) + } + + upgradeResponse, err := d.client.UpdateRelease( + d.release, + chartPath, + helm.UpdateValueOverrides(rawVals), + helm.ReuseValues(d.reuseValues), + helm.UpgradeDryRun(true), + ) + if err != nil { + return prettyError(err) + } + + currentSpecs := manifest.Parse(releaseResponse.Release.Manifest) + newSpecs := manifest.Parse(upgradeResponse.Release.Manifest) + + diffManifests(currentSpecs, newSpecs, d.suppressedKinds, os.Stdout) + + return nil +} From f45fc5917d3b30eca795a5294e2f564f254289a4 Mon Sep 17 00:00:00 2001 From: aananthraj Date: Tue, 20 Feb 2018 08:13:57 +0530 Subject: [PATCH 5/5] Download remote chart to Archive dir --- helm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm.go b/helm.go index db804ec7..1edb777e 100644 --- a/helm.go +++ b/helm.go @@ -76,7 +76,7 @@ func locateChartPath(name, version string, verify bool, keyring string) (string, dl.Verify = downloader.VerifyAlways } - filename, _, err := dl.DownloadTo(name, version, ".") + filename, _, err := dl.DownloadTo(name, version, helmpath.Home(homePath()).Archive()) if err == nil { lname, err := filepath.Abs(filename) if err != nil {