diff --git a/api/v1alpha1/ip_webhook.go b/api/v1alpha1/ip_webhook.go index 877ead4..a2707e0 100644 --- a/api/v1alpha1/ip_webhook.go +++ b/api/v1alpha1/ip_webhook.go @@ -19,6 +19,7 @@ package v1alpha1 import ( "context" "fmt" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/pkg/errors" @@ -138,10 +139,19 @@ func (in *IP) ValidateDelete() (admission.Warnings, error) { } ctx := context.Background() - if err := ipWebhookClient.Get(ctx, namespacedName, unstruct); !apierrors.IsNotFound(err) { + err = ipWebhookClient.Get(ctx, namespacedName, unstruct) + if !apierrors.IsNotFound(err) { var allErrs field.ErrorList - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), in.Spec.Consumer, "Consumer is not deleted")) - return warnings, apierrors.NewInvalid(gvk.GroupKind(), in.Name, allErrs) + consumerUnstruct := unstruct.Object + deletionTimestamp, _, err := unstructured.NestedString(consumerUnstruct, "metadata", "deletionTimestamp") + switch { + case err != nil: + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), in.Spec.Consumer, err.Error())) + return warnings, apierrors.NewInvalid(gvk.GroupKind(), in.Name, allErrs) + case deletionTimestamp == "": + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), in.Spec.Consumer, "Consumer is not deleted")) + return warnings, apierrors.NewInvalid(gvk.GroupKind(), in.Name, allErrs) + } } return warnings, nil diff --git a/api/v1alpha1/subnet_webhook.go b/api/v1alpha1/subnet_webhook.go index a1335ba..4d33bc4 100644 --- a/api/v1alpha1/subnet_webhook.go +++ b/api/v1alpha1/subnet_webhook.go @@ -20,9 +20,10 @@ import ( "context" "fmt" "reflect" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "strings" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + "github.com/pkg/errors" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" @@ -243,8 +244,16 @@ func (in *Subnet) ValidateDelete() (admission.Warnings, error) { } ctx := context.Background() - if err := subnetWebhookClient.Get(ctx, namespacedName, unstruct); !apierrors.IsNotFound(err) { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), in.Spec.Consumer, "Consumer is not deleted")) + err = subnetWebhookClient.Get(ctx, namespacedName, unstruct) + if !apierrors.IsNotFound(err) { + consumerUnstruct := unstruct.Object + deletionTimestamp, _, err := unstructured.NestedString(consumerUnstruct, "metadata", "deletionTimestamp") + switch { + case err != nil: + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), in.Spec.Consumer, err.Error())) + case deletionTimestamp == "": + allErrs = append(allErrs, field.Invalid(field.NewPath("spec.consumer"), in.Spec.Consumer, "Consumer is not deleted")) + } } }