diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 798434da4..f117d7ee9 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -53,6 +53,11 @@ import ( "k8s.io/kubernetes/pkg/printers" ) +const ( + // MissingGetHeader is added to Get's outout when a resource is not found. + MissingGetHeader = "==> MISSING\nKIND\t\tNAME\n" +) + // ErrNoObjectsVisited indicates that during a visit operation, no matching objects were found. var ErrNoObjectsVisited = goerrors.New("no objects visited") @@ -217,7 +222,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { } } if len(missing) > 0 { - buf.WriteString("==> MISSING\nKIND\t\tNAME\n") + buf.WriteString(MissingGetHeader) for _, s := range missing { fmt.Fprintln(buf, s) } diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index b5fbbeb44..57b8c4fee 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -159,7 +159,7 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env return rel.Manifest, []error{fmt.Errorf("corrupted release record. You must manually delete the resources: %s", err)} } - filesToKeep, filesToDelete := filterManifestsToKeep(files) + filesToKeep, filesToDelete := filterManifestsToKeep(files, kubeClient, rel.Namespace) if len(filesToKeep) > 0 { kept = summarizeKeptManifests(filesToKeep) } diff --git a/pkg/tiller/resource_policy.go b/pkg/tiller/resource_policy.go index 2102ab66b..e4e08d435 100644 --- a/pkg/tiller/resource_policy.go +++ b/pkg/tiller/resource_policy.go @@ -17,7 +17,11 @@ limitations under the License. package tiller import ( + "bytes" "strings" + + "k8s.io/helm/pkg/kube" + "k8s.io/helm/pkg/tiller/environment" ) // resourcePolicyAnno is the annotation name for a resource policy @@ -29,11 +33,16 @@ const resourcePolicyAnno = "helm.sh/resource-policy" // during an uninstallRelease action. const keepPolicy = "keep" -func filterManifestsToKeep(manifests []Manifest) ([]Manifest, []Manifest) { +func filterManifestsToKeep(manifests []Manifest, kubeClient environment.KubeClient, namespace string) ([]Manifest, []Manifest) { remaining := []Manifest{} keep := []Manifest{} for _, m := range manifests { + // check if m is in fact present from k8s client's POV. + output, err := kubeClient.Get(namespace, bytes.NewBufferString(m.Content)) + if err != nil || strings.Contains(output, kube.MissingGetHeader) { + continue + } if m.Head.Metadata == nil || m.Head.Metadata.Annotations == nil || len(m.Head.Metadata.Annotations) == 0 { remaining = append(remaining, m)