From 32ae564f15cd47b3d9f767bd07df1a43b383af9f Mon Sep 17 00:00:00 2001 From: Jakub Domanski Date: Wed, 25 Oct 2023 09:55:57 +0200 Subject: [PATCH] Added logic to rollback command Signed-off-by: Jakub Domanski --- cmd/helm/rollback.go | 1 + cmd/helm/rollback_test.go | 5 +++++ pkg/action/rollback.go | 23 ++++++++++++----------- pkg/action/upgrade.go | 1 + 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/cmd/helm/rollback.go b/cmd/helm/rollback.go index 7de98e404..be953ca15 100644 --- a/cmd/helm/rollback.go +++ b/cmd/helm/rollback.go @@ -85,6 +85,7 @@ func newRollbackCmd(cfg *action.Configuration, out io.Writer) *cobra.Command { f.BoolVar(&client.WaitForJobs, "wait-for-jobs", false, "if set and --wait enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as --timeout") f.BoolVar(&client.CleanupOnFail, "cleanup-on-fail", false, "allow deletion of new resources created in this rollback when rollback fails") f.IntVar(&client.MaxHistory, "history-max", settings.MaxHistory, "limit the maximum number of revisions saved per release. Use 0 for no limit") + f.BoolVar(&client.RecreateImmutableResources, "recreate-immutable-resources", false, "On status code 422, try to delete and create the resource again") return cmd } diff --git a/cmd/helm/rollback_test.go b/cmd/helm/rollback_test.go index 6d38e16eb..832cfe8d1 100644 --- a/cmd/helm/rollback_test.go +++ b/cmd/helm/rollback_test.go @@ -76,6 +76,11 @@ func TestRollbackCmd(t *testing.T) { golden: "output/rollback-no-args.txt", rels: rels, wantError: true, + }, { + name: "rollback a release with recreate-immutable-resources option ", + cmd: "rollback funny-honey 1 --recreate-immutable-resources", + golden: "output/rollback.txt", + rels: rels, }} runTestCmd(t, tests) } diff --git a/pkg/action/rollback.go b/pkg/action/rollback.go index bcb208c97..286b5478e 100644 --- a/pkg/action/rollback.go +++ b/pkg/action/rollback.go @@ -35,16 +35,17 @@ import ( type Rollback struct { cfg *Configuration - Version int - Timeout time.Duration - Wait bool - WaitForJobs bool - DisableHooks bool - DryRun bool - Recreate bool // will (if true) recreate pods after a rollback. - Force bool // will (if true) force resource upgrade through uninstall/recreate if needed - CleanupOnFail bool - MaxHistory int // MaxHistory limits the maximum number of revisions saved per release + Version int + Timeout time.Duration + Wait bool + WaitForJobs bool + DisableHooks bool + DryRun bool + Recreate bool // will (if true) recreate pods after a rollback. + Force bool // will (if true) force resource upgrade through uninstall/recreate if needed + CleanupOnFail bool + MaxHistory int // MaxHistory limits the maximum number of revisions saved per release + RecreateImmutableResources bool // will (if true) try to delete and recreate immutable resources on 422 status code } // NewRollback creates a new Rollback object with the given configuration. @@ -187,7 +188,7 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas if err != nil { return targetRelease, errors.Wrap(err, "unable to set metadata visitor from target release") } - results, err := r.cfg.KubeClient.Update(current, target, r.Force, false) + results, err := r.cfg.KubeClient.Update(current, target, r.Force, r.RecreateImmutableResources) if err != nil { msg := fmt.Sprintf("Rollback %q failed: %s", targetRelease.Name, err) diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index eaef1704d..8ab4ce7a1 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -513,6 +513,7 @@ func (u *Upgrade) failRelease(rel *release.Release, created kube.ResourceList, e rollin.Recreate = u.Recreate rollin.Force = u.Force rollin.Timeout = u.Timeout + rollin.RecreateImmutableResources = u.RecreateImmutableResources if rollErr := rollin.Run(rel.Name); rollErr != nil { return rel, errors.Wrapf(rollErr, "an error occurred while rolling back the release. original upgrade error: %s", err) }