Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions pkg/action/uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,14 +193,15 @@ func (u *Uninstall) Run(name string) (*releasei.UninstallReleaseResponse, error)
}

u.cfg.Logger().Debug("uninstall: deleting release", "name", name)
rel.Info.Status = common.StatusUninstalling
rel.Info.Deleted = time.Now()
rel.Info.Description = "Deletion in progress (or silently failed)"
res := &releasei.UninstallReleaseResponse{Release: rel}

if !u.DisableHooks {
serverSideApply := true
if err := u.cfg.execHook(rel, release.HookPreDelete, u.WaitStrategy, u.WaitOptions, u.Timeout, serverSideApply); err != nil {
// Persist the failed hook result without hiding the release from the
// deployed release list. This leaves both retrying the uninstall and
// upgrading the release available to the user.
u.cfg.recordRelease(rel)
return res, err
}
} else {
Expand All @@ -209,6 +210,9 @@ func (u *Uninstall) Run(name string) (*releasei.UninstallReleaseResponse, error)

// From here on out, the release is currently considered to be in StatusUninstalling
// state.
rel.Info.Status = common.StatusUninstalling
rel.Info.Deleted = time.Now()
rel.Info.Description = "Deletion in progress (or silently failed)"
if err := u.cfg.Releases.Update(rel); err != nil {
u.cfg.Logger().Debug("uninstall: Failed to store updated release", slog.Any("error", err))
}
Expand Down
21 changes: 21 additions & 0 deletions pkg/action/uninstall_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"helm.sh/helm/v4/pkg/kube"
kubefake "helm.sh/helm/v4/pkg/kube/fake"
"helm.sh/helm/v4/pkg/release/common"
release "helm.sh/helm/v4/pkg/release/v1"
)

func uninstallAction(t *testing.T) *Uninstall {
Expand Down Expand Up @@ -167,6 +168,26 @@ func TestUninstallRelease_Cascade(t *testing.T) {
is.ErrorContains(err, "failed to delete release: come-fail-away")
}

func TestUninstallRelease_PreDeleteHookFailureKeepsReleaseDeployed(t *testing.T) {
unAction := uninstallAction(t)
rel := releaseStub()
require.NoError(t, unAction.cfg.Releases.Create(rel))

failer := unAction.cfg.KubeClient.(*kubefake.FailingKubeClient)
failer.CreateError = errors.New("pre-delete hook failed")

res, err := unAction.Run(rel.Name)
require.ErrorContains(t, err, "pre-delete hook failed")
require.NotNil(t, res)

stored, err := unAction.cfg.Releases.Get(rel.Name, rel.Version)
require.NoError(t, err)
storedRelease, err := releaserToV1Release(stored)
require.NoError(t, err)
assert.Equal(t, common.StatusDeployed, storedRelease.Info.Status)
assert.Equal(t, release.HookPhaseFailed, storedRelease.Hooks[0].LastRun.Phase)
}

func TestUninstallRun_UnreachableKubeClient(t *testing.T) {
t.Helper()
config := actionConfigFixture(t)
Expand Down