Skip to content

Commit 7a00235

Browse files
hiddecoscottrigby
authored andcommitted
fix(uninstall): supersede deployed releases
This ensures that when `helm uninstall` is run with `--keep-history` any release in a `deployed` state other than the last release (e.g. due to a failed upgrade) is being marked as `superseded`. As a by-effect, running `helm upgrade` on a release which has been uninstalled after an upgrade failure now no longer works. But instead fails with a `"<name>" has no deployed releases` error. Which is the (likely) intended behavior, and prevents other side-effects like rolling back to a release version which happened before the uninstall if `--atomic` (or `--rollback-on-failure`) was provided. Signed-off-by: Hidde Beydals <hidde@hhh.computer> (cherry picked from commit 2f1ecc7) (cherry picked from commit 8bb0b37)
1 parent 578564e commit 7a00235

3 files changed

Lines changed: 24 additions & 0 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
release "aeneas" uninstalled

cmd/helm/uninstall_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ func TestUninstall(t *testing.T) {
5757
golden: "output/uninstall-keep-history.txt",
5858
rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "aeneas"})},
5959
},
60+
{
61+
name: "keep history with earlier deployed release",
62+
cmd: "uninstall aeneas --keep-history",
63+
golden: "output/uninstall-keep-history-earlier-deployed.txt",
64+
rels: []*release.Release{
65+
release.Mock(&release.MockReleaseOptions{Name: "aeneas", Version: 1, Status: release.StatusDeployed}),
66+
release.Mock(&release.MockReleaseOptions{Name: "aeneas", Version: 2, Status: release.StatusFailed}),
67+
},
68+
},
6069
{
6170
name: "wait",
6271
cmd: "uninstall aeneas --wait",

pkg/action/uninstall.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"helm.sh/helm/v3/pkg/kube"
2929
"helm.sh/helm/v3/pkg/release"
3030
"helm.sh/helm/v3/pkg/releaseutil"
31+
"helm.sh/helm/v3/pkg/storage/driver"
3132
helmtime "helm.sh/helm/v3/pkg/time"
3233
)
3334

@@ -170,6 +171,19 @@ func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error)
170171
u.cfg.Log("uninstall: Failed to store updated release: %s", err)
171172
}
172173

174+
// Supersede all previous deployments, see issue #12556 (which is a
175+
// variation on #2941).
176+
deployed, err := u.cfg.Releases.DeployedAll(name)
177+
if err != nil && !errors.Is(err, driver.ErrNoDeployedReleases) {
178+
return nil, err
179+
}
180+
for _, reli := range deployed {
181+
reli.Info.Status = release.StatusSuperseded
182+
if err = u.cfg.Releases.Update(reli); err != nil {
183+
u.cfg.Log("uninstall: Failed to store updated release: %s", err)
184+
}
185+
}
186+
173187
if len(errs) > 0 {
174188
return res, errors.Errorf("uninstallation completed with %d error(s): %s", len(errs), joinErrors(errs))
175189
}

0 commit comments

Comments
 (0)