From 52418d2976e1a96baa81fa9abae4ff7a4f81c43d Mon Sep 17 00:00:00 2001 From: longquan0104 Date: Wed, 10 May 2023 00:15:03 +0700 Subject: [PATCH] Add annotation helm delete propagation Signed-off-by: longquan0104 Add annotation helm.sh/hook-delete-propagation-policy for delete resource with propagationPolicy --- pkg/action/uninstall.go | 4 ++-- pkg/kube/client.go | 32 +++++++++++++++++++++++++++++++- pkg/release/hook.go | 3 +++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/pkg/action/uninstall.go b/pkg/action/uninstall.go index 801498544..ea14ef9ea 100644 --- a/pkg/action/uninstall.go +++ b/pkg/action/uninstall.go @@ -224,9 +224,9 @@ func (u *Uninstall) deleteRelease(rel *release.Release) (kube.ResourceList, stri if len(resources) > 0 { if kubeClient, ok := u.cfg.KubeClient.(kube.InterfaceDeletionPropagation); ok { _, errs = kubeClient.DeleteWithPropagationPolicy(resources, parseCascadingFlag(u.cfg, u.DeletionPropagation)) - return resources, kept, errs + } else { + _, errs = u.cfg.KubeClient.Delete(resources) } - _, errs = u.cfg.KubeClient.Delete(resources) } return resources, kept, errs } diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 7b3c803f9..0d7d6c2df 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -31,6 +31,7 @@ import ( jsonpatch "github.com/evanphx/json-patch" "github.com/pkg/errors" + "helm.sh/helm/v3/pkg/release" batch "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" @@ -476,7 +477,20 @@ func delete(c *Client, resources ResourceList, propagation metav1.DeletionPropag 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) + object, err := resource.NewHelper(info.Client, info.Mapping).WithFieldManager(getManagedFieldsManager()).Get(info.Namespace, info.Name) + if err != nil && !apierrors.IsNotFound(err) { + return err + } + if object != nil { + annotations, err := metadataAccessor.Annotations(object) + if err != nil { + return err + } + if prop := getAnnotationDeletePropagation(annotations); prop != "" { + propagation = metav1.DeletionPropagation(prop) + } + } + 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) @@ -842,3 +856,19 @@ func (c *Client) WaitAndGetCompletedPodPhase(name string, timeout time.Duration) return v1.PodUnknown, err } + +func getAnnotationDeletePropagation(annotation map[string]string) metav1.DeletionPropagation { + if propagation, ok := annotation[release.HookDeletePropagationAnnotation]; ok { + switch metav1.DeletionPropagation(propagation) { + case metav1.DeletePropagationBackground: + return metav1.DeletePropagationBackground + case metav1.DeletePropagationForeground: + return metav1.DeletePropagationForeground + case metav1.DeletePropagationOrphan: + return metav1.DeletePropagationOrphan + default: + return "" + } + } + return "" +} diff --git a/pkg/release/hook.go b/pkg/release/hook.go index cb9955582..0ae5b41fd 100644 --- a/pkg/release/hook.go +++ b/pkg/release/hook.go @@ -59,6 +59,9 @@ const HookWeightAnnotation = "helm.sh/hook-weight" // HookDeleteAnnotation is the label name for the delete policy for a hook const HookDeleteAnnotation = "helm.sh/hook-delete-policy" +// HookDeletePropagationAnnotation is the label name for the delete propagation policy for a hook +const HookDeletePropagationAnnotation = "helm.sh/hook-delete-propagation-policy" + // Hook defines a hook object. type Hook struct { Name string `json:"name,omitempty"`