From 4e14416e82cf7a25a2e8c1d31fb9ecc718d400a4 Mon Sep 17 00:00:00 2001 From: cyh-ant <135013202+cyh-ant@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:36:16 +0800 Subject: [PATCH] fix: gracedelete webhook compatible in the absence of ServiceReadyReadinessGate (#152) * fix(gracedelete webhook): compatible in the absence of ServiceReadyReadinessGates * test(gracedelete webhook): fix test cases * test(gracedelete webhook): complete test cases --- .../server/generic/pod/gracedelete/webhook.go | 14 +++++++++ .../generic/pod/gracedelete/webhook_test.go | 31 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/pkg/webhook/server/generic/pod/gracedelete/webhook.go b/pkg/webhook/server/generic/pod/gracedelete/webhook.go index 4a7d5dca..a6d9dc1e 100644 --- a/pkg/webhook/server/generic/pod/gracedelete/webhook.go +++ b/pkg/webhook/server/generic/pod/gracedelete/webhook.go @@ -55,6 +55,20 @@ func (gd *GraceDelete) Validating(ctx context.Context, c client.Client, oldPod, return nil } + // if has no service-ready ReadinessGate, skip gracedelete + hasReadinessGate := false + if oldPod.Spec.ReadinessGates != nil { + for _, readinessGate := range oldPod.Spec.ReadinessGates { + if readinessGate.ConditionType == v1alpha1.ReadinessGatePodServiceReady { + hasReadinessGate = true + break + } + } + } + if !hasReadinessGate { + return nil + } + // if pod is allowed to delete if _, allowed := podopslifecycle.AllowOps(poddeletion.OpsLifecycleAdapter, 0, oldPod); allowed { return nil diff --git a/pkg/webhook/server/generic/pod/gracedelete/webhook_test.go b/pkg/webhook/server/generic/pod/gracedelete/webhook_test.go index 49b3acaf..d2f7ae8f 100644 --- a/pkg/webhook/server/generic/pod/gracedelete/webhook_test.go +++ b/pkg/webhook/server/generic/pod/gracedelete/webhook_test.go @@ -53,6 +53,24 @@ func TestGraceDelete(t *testing.T) { { reqOperation: admissionv1.Delete, }, + { + fakePod: corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "test", + }, + }, + oldPod: corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "default", + Name: "test", + Labels: map[string]string{ + fmt.Sprintf(v1alpha1.ControlledByKusionStackLabelKey): "true", + }, + }, + }, + reqOperation: admissionv1.Delete, + }, { fakePod: corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ @@ -68,6 +86,9 @@ func TestGraceDelete(t *testing.T) { fmt.Sprintf(v1alpha1.ControlledByKusionStackLabelKey): "true", }, }, + Spec: corev1.PodSpec{ + ReadinessGates: []corev1.PodReadinessGate{{ConditionType: v1alpha1.ReadinessGatePodServiceReady}}, + }, }, keyWords: "not found", reqOperation: admissionv1.Delete, @@ -91,6 +112,9 @@ func TestGraceDelete(t *testing.T) { fmt.Sprintf(v1alpha1.ControlledByKusionStackLabelKey): "true", }, }, + Spec: corev1.PodSpec{ + ReadinessGates: []corev1.PodReadinessGate{{ConditionType: v1alpha1.ReadinessGatePodServiceReady}}, + }, }, expectedLabels: map[string]string{ appsv1alpha1.PodDeletionIndicationLabelKey: "true", @@ -117,6 +141,9 @@ func TestGraceDelete(t *testing.T) { }, Finalizers: []string{"prot.podopslifecycle.kusionstack.io/finalizer1,prot.podopslifecycle.kusionstack.io/finalizer2"}, }, + Spec: corev1.PodSpec{ + ReadinessGates: []corev1.PodReadinessGate{{ConditionType: v1alpha1.ReadinessGatePodServiceReady}}, + }, }, expectedLabels: map[string]string{ appsv1alpha1.PodDeletionIndicationLabelKey: "true", @@ -137,7 +164,11 @@ func TestGraceDelete(t *testing.T) { "operate.podopslifecycle.kusionstack.io/pod-delete": "1704865212856080006", }, }, + Spec: corev1.PodSpec{ + ReadinessGates: []corev1.PodReadinessGate{{ConditionType: v1alpha1.ReadinessGatePodServiceReady}}, + }, }, + reqOperation: admissionv1.Delete, }, }