diff --git a/pkg/kube/client.go b/pkg/kube/client.go index a62b83b3e..164802cd1 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -504,10 +504,28 @@ func rdelete(c *Client, resources ResourceList, propagation metav1.DeletionPropa mtx := sync.Mutex{} err := perform(resources, func(info *resource.Info) error { c.Log("Starting delete for %q %s", info.Name, info.Mapping.GroupVersionKind.Kind) - err := deleteResource(info, propagation) - if err == nil || apierrors.IsNotFound(err) { - if err != nil { - c.Log("Ignoring delete failure for %q %s: %v", info.Name, info.Mapping.GroupVersionKind, err) + if err2 := info.Get(); err2 != nil { + c.Log("Unable to get obj %q, err2: %s", info.Name, err2) + mtx.Lock() + defer mtx.Unlock() + // Collect the error and continue on + errs = append(errs, err2) + return nil + } + annotations, err2 := metadataAccessor.Annotations(info.Object) + if err2 != nil { + c.Log("Unable to get annotations on %q, err2: %s", info.Name, err2) + } + if annotations != nil && annotations[ResourcePolicyAnno] == KeepPolicy { + c.Log("Skipping delete of %q due to annotation [%s=%s]", info.Name, ResourcePolicyAnno, KeepPolicy) + mtx.Lock() + defer mtx.Unlock() + return nil + } + err2 = deleteResource(info, propagation) + if err2 == nil || apierrors.IsNotFound(err2) { + if err2 != nil { + c.Log("Ignoring delete failure for %q %s: %v", info.Name, info.Mapping.GroupVersionKind, err2) } mtx.Lock() defer mtx.Unlock() @@ -517,7 +535,7 @@ func rdelete(c *Client, resources ResourceList, propagation metav1.DeletionPropa mtx.Lock() defer mtx.Unlock() // Collect the error and continue on - errs = append(errs, err) + errs = append(errs, err2) return nil }) if err != nil {