From fefa00fc5279802266ce22a118905f2e2e2a9db7 Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Wed, 31 Aug 2016 10:26:47 -0500 Subject: [PATCH] fix(tiller): return status for deleted release This modifies `helm status` to return info about deleted and failed releases. We do our best to retrieve info for releases that were partially deployed. --- cmd/helm/status.go | 4 +++- cmd/tiller/release_server.go | 11 ++++++++--- cmd/tiller/release_server_test.go | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/cmd/helm/status.go b/cmd/helm/status.go index 4d8c7bc5c..a3403a824 100644 --- a/cmd/helm/status.go +++ b/cmd/helm/status.go @@ -83,7 +83,9 @@ func PrintStatus(out io.Writer, res *services.GetReleaseStatusResponse) { fmt.Fprintf(out, "Details: %s\n", res.Info.Status.Details) } fmt.Fprintf(out, "\n") - fmt.Fprintf(out, "Resources:\n%s\n", res.Info.Status.Resources) + if len(res.Info.Status.Resources) > 0 { + fmt.Fprintf(out, "Resources:\n%s\n", res.Info.Status.Resources) + } if len(res.Info.Status.Notes) > 0 { fmt.Fprintf(out, "Notes:\n%s\n", res.Info.Status.Notes) } diff --git a/cmd/tiller/release_server.go b/cmd/tiller/release_server.go index eb1cb158a..757c1bf95 100644 --- a/cmd/tiller/release_server.go +++ b/cmd/tiller/release_server.go @@ -190,17 +190,22 @@ func (s *releaseServer) GetReleaseStatus(c ctx.Context, req *services.GetRelease return nil, errors.New("release chart is missing") } + sc := rel.Info.Status.Code + statusResp := &services.GetReleaseStatusResponse{Info: rel.Info, Namespace: rel.Namespace} + // Ok, we got the status of the release as we had jotted down, now we need to match the // manifest we stashed away with reality from the cluster. kubeCli := s.env.KubeClient resp, err := kubeCli.Get(rel.Namespace, bytes.NewBufferString(rel.Manifest)) - if err != nil { + if sc == release.Status_DELETED || sc == release.Status_FAILED { + // Skip errors if this is already deleted or failed. + return statusResp, nil + } else if err != nil { log.Printf("warning: Get for %s failed: %v", rel.Name, err) return nil, err } rel.Info.Status.Resources = resp - - return &services.GetReleaseStatusResponse{Info: rel.Info, Namespace: rel.Namespace}, nil + return statusResp, nil } func (s *releaseServer) GetReleaseContent(c ctx.Context, req *services.GetReleaseContentRequest) (*services.GetReleaseContentResponse, error) { diff --git a/cmd/tiller/release_server_test.go b/cmd/tiller/release_server_test.go index 3e2644c56..27f924f2d 100644 --- a/cmd/tiller/release_server_test.go +++ b/cmd/tiller/release_server_test.go @@ -711,6 +711,25 @@ func TestGetReleaseStatus(t *testing.T) { } } +func TestGetReleaseStatusDeleted(t *testing.T) { + c := context.Background() + rs := rsFixture() + rel := releaseStub() + rel.Info.Status.Code = release.Status_DELETED + if err := rs.env.Releases.Create(rel); err != nil { + t.Fatalf("Could not store mock release: %s", err) + } + + res, err := rs.GetReleaseStatus(c, &services.GetReleaseStatusRequest{Name: rel.Name}) + if err != nil { + t.Errorf("Error getting release content: %s", err) + } + + if res.Info.Status.Code != release.Status_DELETED { + t.Errorf("Expected %d, got %d", release.Status_DELETED, res.Info.Status.Code) + } +} + func TestListReleases(t *testing.T) { rs := rsFixture() num := 7