From 41640840eb86a70ab1e41005cb05ac623dfe40e5 Mon Sep 17 00:00:00 2001 From: rishh09 Date: Wed, 15 Jul 2026 14:50:54 +0530 Subject: [PATCH] fix rollback cleanup on empty created resources Signed-off-by: rishh09 --- pkg/action/rollback.go | 2 +- pkg/action/rollback_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/pkg/action/rollback.go b/pkg/action/rollback.go index 6fc449c30..5d25dcabe 100644 --- a/pkg/action/rollback.go +++ b/pkg/action/rollback.go @@ -241,7 +241,7 @@ func (r *Rollback) performRollback(currentRelease, targetRelease *release.Releas targetRelease.Info.Description = msg r.cfg.recordRelease(currentRelease) r.cfg.recordRelease(targetRelease) - if r.CleanupOnFail { + if r.CleanupOnFail && len(results.Created) > 0 { r.cfg.Logger().Debug("cleanup on fail set, cleaning up resources", "count", len(results.Created)) _, errs := r.cfg.KubeClient.Delete(results.Created, metav1.DeletePropagationBackground) if errs != nil { diff --git a/pkg/action/rollback_test.go b/pkg/action/rollback_test.go index 01419341b..aaf41c720 100644 --- a/pkg/action/rollback_test.go +++ b/pkg/action/rollback_test.go @@ -27,6 +27,7 @@ import ( "helm.sh/helm/v4/pkg/kube" kubefake "helm.sh/helm/v4/pkg/kube/fake" + "helm.sh/helm/v4/pkg/release/common" ) func TestNewRollback(t *testing.T) { @@ -47,6 +48,42 @@ func TestRollbackRun_UnreachableKubeClient(t *testing.T) { assert.Error(t, client.Run("")) } +func TestRollbackRelease_CleanupOnFailSkipsEmptyCreated(t *testing.T) { + is := assert.New(t) + req := require.New(t) + config := actionConfigFixture(t) + + rel1 := releaseStub() + rel1.Name = "rollback-cleanup" + rel1.Version = 1 + rel1.Info.Status = common.StatusSuperseded + rel1.ApplyMethod = "csa" + req.NoError(config.Releases.Create(rel1)) + + rel2 := releaseStub() + rel2.Name = "rollback-cleanup" + rel2.Version = 2 + rel2.Info.Status = common.StatusDeployed + rel2.ApplyMethod = "csa" + req.NoError(config.Releases.Create(rel2)) + + failer := config.KubeClient.(*kubefake.FailingKubeClient) + failer.UpdateError = errors.New("update failed") + failer.DeleteError = errors.New("delete should not run") + config.KubeClient = failer + + client := NewRollback(config) + client.Version = 1 + client.CleanupOnFail = true + client.ServerSideApply = "auto" + + err := client.Run("rollback-cleanup") + req.Error(err) + is.Contains(err.Error(), "update failed") + is.NotContains(err.Error(), "unable to cleanup resources") + is.NotContains(err.Error(), "delete should not run") +} + func TestRollback_WaitOptionsPassedDownstream(t *testing.T) { is := assert.New(t) req := require.New(t)