Commit e6d907ed authored by Federico Gimenez's avatar Federico Gimenez

check if resource is present before adding it to remaining or keep on deletion

parent 15053e67
...@@ -53,6 +53,11 @@ import ( ...@@ -53,6 +53,11 @@ import (
"k8s.io/kubernetes/pkg/printers" "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. // ErrNoObjectsVisited indicates that during a visit operation, no matching objects were found.
var ErrNoObjectsVisited = goerrors.New("no objects visited") var ErrNoObjectsVisited = goerrors.New("no objects visited")
...@@ -217,7 +222,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { ...@@ -217,7 +222,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) {
} }
} }
if len(missing) > 0 { if len(missing) > 0 {
buf.WriteString("==> MISSING\nKIND\t\tNAME\n") buf.WriteString(MissingGetHeader)
for _, s := range missing { for _, s := range missing {
fmt.Fprintln(buf, s) fmt.Fprintln(buf, s)
} }
......
...@@ -159,7 +159,7 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env ...@@ -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)} 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 { if len(filesToKeep) > 0 {
kept = summarizeKeptManifests(filesToKeep) kept = summarizeKeptManifests(filesToKeep)
} }
......
...@@ -17,7 +17,11 @@ limitations under the License. ...@@ -17,7 +17,11 @@ limitations under the License.
package tiller package tiller
import ( import (
"bytes"
"strings" "strings"
"k8s.io/helm/pkg/kube"
"k8s.io/helm/pkg/tiller/environment"
) )
// resourcePolicyAnno is the annotation name for a resource policy // resourcePolicyAnno is the annotation name for a resource policy
...@@ -29,11 +33,16 @@ const resourcePolicyAnno = "helm.sh/resource-policy" ...@@ -29,11 +33,16 @@ const resourcePolicyAnno = "helm.sh/resource-policy"
// during an uninstallRelease action. // during an uninstallRelease action.
const keepPolicy = "keep" const keepPolicy = "keep"
func filterManifestsToKeep(manifests []Manifest) ([]Manifest, []Manifest) { func filterManifestsToKeep(manifests []Manifest, kubeClient environment.KubeClient, namespace string) ([]Manifest, []Manifest) {
remaining := []Manifest{} remaining := []Manifest{}
keep := []Manifest{} keep := []Manifest{}
for _, m := range manifests { 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 { if m.Head.Metadata == nil || m.Head.Metadata.Annotations == nil || len(m.Head.Metadata.Annotations) == 0 {
remaining = append(remaining, m) remaining = append(remaining, m)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment