From 57d1c1fd29be7f6fc189e34be461919654737700 Mon Sep 17 00:00:00 2001 From: adshmh <23505281+adshmh@users.noreply.github.com> Date: Wed, 7 Nov 2018 00:08:18 -0500 Subject: [PATCH] include the name of the missing object in release uninstall error (#4635) * fix(tiller) added mock kube client to return failure on delete Signed-off-by: Arash Deshmeh * fix(tiller) added object's name to delete release error message Signed-off-by: Arash Deshmeh --- pkg/tiller/release_modules.go | 7 +++++-- pkg/tiller/release_server_test.go | 14 ++++++++++++++ pkg/tiller/release_uninstall_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index 9a8c66e96..85995480c 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -18,7 +18,6 @@ package tiller import ( "bytes" - "errors" "fmt" "log" "strings" @@ -174,7 +173,11 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env log.Printf("uninstall: Failed deletion of %q: %s", rel.Name, err) if err == kube.ErrNoObjectsVisited { // Rewrite the message from "no objects visited" - err = errors.New("object not found, skipping delete") + obj := "" + if file.Head != nil && file.Head.Metadata != nil { + obj = "[" + file.Head.Kind + "] " + file.Head.Metadata.Name + } + err = fmt.Errorf("release %q: object %q not found, skipping delete", rel.Name, obj) } errs = append(errs, err) } diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 311f55b30..d94ea2eeb 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -498,6 +498,20 @@ func (h *hookFailingKubeClient) WatchUntilReady(ns string, r io.Reader, timeout return errors.New("Failed watch") } +func newDeleteFailingKubeClient() *deleteFailingKubeClient { + return &deleteFailingKubeClient{ + PrintingKubeClient: environment.PrintingKubeClient{Out: ioutil.Discard}, + } +} + +type deleteFailingKubeClient struct { + environment.PrintingKubeClient +} + +func (d *deleteFailingKubeClient) Delete(ns string, r io.Reader) error { + return kube.ErrNoObjectsVisited +} + type mockListServer struct { val *services.ListReleasesResponse } diff --git a/pkg/tiller/release_uninstall_test.go b/pkg/tiller/release_uninstall_test.go index d33e9c2a6..cb59b6bf5 100644 --- a/pkg/tiller/release_uninstall_test.go +++ b/pkg/tiller/release_uninstall_test.go @@ -197,3 +197,31 @@ func TestUninstallReleaseCustomDescription(t *testing.T) { t.Errorf("Expected description to be %q, got %q", customDescription, res.Release.Info.Description) } } + +func TestUninstallReleaseObjectNotFoundError(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rel := releaseStub() + manifest := `kind: ConfigMap +metadata: + name: configmap-foo +data: + name: value +` + + rel.Manifest = manifest + rs.env.Releases.Create(rel) + rs.env.KubeClient = newDeleteFailingKubeClient() + + req := &services.UninstallReleaseRequest{ + Name: "angry-panda", + } + + _, err := rs.UninstallRelease(c, req) + if err == nil { + t.Fatalf("Expected failure to delete") + } + if !strings.Contains(err.Error(), "configmap-foo") { + t.Errorf("Expected delete error message to contain object name, got:" + err.Error()) + } +}