From bc4b6b0f60fd37826452a29fee158b5b02c9e43b Mon Sep 17 00:00:00 2001 From: Alexander Staubo Date: Fri, 4 May 2018 13:01:54 -0400 Subject: [PATCH] When checking for "name reuse", consider SUPERSEDED deploys as valid. Relates to #3134, but does not fix the underlying cause of releases ended up stuck in SUPERSEDED. Also cleans up the boolean logic and fixes an ignored error returned from env.Releases.History(). --- pkg/tiller/release_server.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 7c4bc62cf..2a119b975 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -168,32 +168,35 @@ func (s *ReleaseServer) reuseValues(req *services.UpdateReleaseRequest, current } func (s *ReleaseServer) uniqName(start string, reuse bool) (string, error) { - // If a name is supplied, we check to see if that name is taken. If not, it // is granted. If reuse is true and a deleted release with that name exists, // we re-grant it. Otherwise, an error is returned. if start != "" { - if len(start) > releaseNameMaxLen { return "", fmt.Errorf("release name %q exceeds max length of %d", start, releaseNameMaxLen) } h, err := s.env.Releases.History(start) if err != nil || len(h) < 1 { - return start, nil + return start, err } relutil.Reverse(h, relutil.SortByRevision) rel := h[0] - if st := rel.Info.Status.Code; reuse && (st == release.Status_DELETED || st == release.Status_FAILED) { - // Allowe re-use of names if the previous release is marked deleted. + if !reuse { + return "", fmt.Errorf("a release named %s already exists.\nRun: helm ls --all %s; to check the status of the release\nOr run: helm del --purge %s; to delete it", start, start, start) + } + + switch rel.Info.Status.Code { + case release.Status_DELETED, release.Status_FAILED, release.Status_SUPERSEDED: + // Allow re-use of names if the previous release is marked deleted. + // Note that the latest release should never be SUPERSEDED, but this + // can happen on certain failures (issue #3134). s.Log("name %s exists but is not in use, reusing name", start) return start, nil - } else if reuse { + default: return "", errors.New("cannot re-use a name that is still in use") } - - return "", fmt.Errorf("a release named %s already exists.\nRun: helm ls --all %s; to check the status of the release\nOr run: helm del --purge %s; to delete it", start, start, start) } maxTries := 5