From 92bcc47fc1b0bdf850137ddf6cdc7600d8ca18b7 Mon Sep 17 00:00:00 2001 From: Mike Ng Date: Mon, 4 Jan 2021 12:22:49 -0500 Subject: [PATCH] fix: (helm) - prevent sync from deleting all release records if Helm failed to transition state properly during upgrade Signed-off-by: Mike Ng --- internal/helm/release/manager.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/internal/helm/release/manager.go b/internal/helm/release/manager.go index d72c2a0c0c..ef67043874 100644 --- a/internal/helm/release/manager.go +++ b/internal/helm/release/manager.go @@ -28,6 +28,7 @@ import ( "helm.sh/helm/v3/pkg/kube" helmkube "helm.sh/helm/v3/pkg/kube" rpb "helm.sh/helm/v3/pkg/release" + "helm.sh/helm/v3/pkg/releaseutil" "helm.sh/helm/v3/pkg/storage" "helm.sh/helm/v3/pkg/storage/driver" apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" @@ -98,6 +99,23 @@ func (m *manager) Sync(ctx context.Context) error { return fmt.Errorf("failed to retrieve release history: %w", err) } + // If the 2nd last release is in status 'superseded' and the last release is in status 'pending-upgrade' + // then transition the last release to status 'deployed'. See https://github.com/helm/helm/issues/9113 + if len(releases) >= 2 { + releaseutil.SortByRevision(releases) + secondLastRelease := releases[len(releases)-2] + lastRelease := releases[len(releases)-1] + + if secondLastRelease.Info != nil && secondLastRelease.Info.Status == rpb.StatusSuperseded && + lastRelease.Info != nil && lastRelease.Info.Status == rpb.StatusPendingUpgrade { + lastRelease.Info.Description = "Upgrade complete" + lastRelease.Info.Status = rpb.StatusDeployed + if err := m.storageBackend.Update(lastRelease); err != nil { + return fmt.Errorf("failed to transition last release to deployed status: %w", err) + } + } + } + // Cleanup non-deployed release versions. If all release versions are // non-deployed, this will ensure that failed installations are correctly // retried.