From fb4e25222409ed6008d6ab29f5d1107fc284de37 Mon Sep 17 00:00:00 2001 From: ylink-lfs Date: Wed, 16 Jul 2025 09:26:19 +0800 Subject: [PATCH] test: add batch pod deletion for kubelet e2e tests --- test/e2e/framework/pod/delete.go | 16 ++++++++++++++++ test/e2e/node/kubelet.go | 5 +---- test/e2e/node/pod_resize.go | 23 +++-------------------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/test/e2e/framework/pod/delete.go b/test/e2e/framework/pod/delete.go index 57bb67a9faa..04cf7f8a984 100644 --- a/test/e2e/framework/pod/delete.go +++ b/test/e2e/framework/pod/delete.go @@ -26,6 +26,7 @@ import ( v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/errors" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" ) @@ -56,6 +57,21 @@ func DeletePodWithWait(ctx context.Context, c clientset.Interface, pod *v1.Pod) return DeletePodWithWaitByName(ctx, c, pod.GetName(), pod.GetNamespace()) } +// DeletePodsWithWait deletes the passed-in pods, waits for them to be terminated, and reports any deletion errors that occur. +func DeletePodsWithWait(ctx context.Context, c clientset.Interface, pods []*v1.Pod) { + var delErrs []error + for _, testPod := range pods { + delErr := c.CoreV1().Pods(testPod.Namespace).Delete(ctx, testPod.Name, metav1.DeleteOptions{}) + if delErr != nil && !apierrors.IsNotFound(delErr) { + delErrs = append(delErrs, delErr) + } + } + framework.ExpectNoError(errors.NewAggregate(delErrs), "while deleting pods") + for _, testPod := range pods { + framework.ExpectNoError(WaitForPodNotFoundInNamespace(ctx, c, testPod.Name, testPod.Namespace, PodDeleteTimeout)) + } +} + // DeletePodWithWaitByName deletes the named and namespaced pod and waits for the pod to be terminated. Resilient to the pod // not existing. func DeletePodWithWaitByName(ctx context.Context, c clientset.Interface, podName, podNamespace string) error { diff --git a/test/e2e/node/kubelet.go b/test/e2e/node/kubelet.go index 4a4d1dc3313..d02fa56bcc0 100644 --- a/test/e2e/node/kubelet.go +++ b/test/e2e/node/kubelet.go @@ -409,10 +409,7 @@ var _ = SIGDescribe("kubelet", func() { }) ginkgo.AfterEach(func(ctx context.Context) { - err := e2epod.DeletePodWithWait(ctx, c, pod) - framework.ExpectNoError(err, "AfterEach: Failed to delete client pod ", pod.Name) - err = e2epod.DeletePodWithWait(ctx, c, nfsServerPod) - framework.ExpectNoError(err, "AfterEach: Failed to delete server pod ", nfsServerPod.Name) + e2epod.DeletePodsWithWait(ctx, c, []*v1.Pod{pod, nfsServerPod}) }) // execute It blocks from above table of tests diff --git a/test/e2e/node/pod_resize.go b/test/e2e/node/pod_resize.go index 1a4b706f19c..b22835726b3 100644 --- a/test/e2e/node/pod_resize.go +++ b/test/e2e/node/pod_resize.go @@ -24,7 +24,6 @@ import ( v1 "k8s.io/api/core/v1" schedulingv1 "k8s.io/api/scheduling/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -382,10 +381,7 @@ func doPodResizeSchedulerTests(f *framework.Framework) { waitForPodDeferred(ctx, f, testPod1) ginkgo.By("deleting pods 2 and 3") - delErr2 := e2epod.DeletePodWithWait(ctx, f.ClientSet, testPod2) - framework.ExpectNoError(delErr2, "failed to delete pod %s", testPod2.Name) - delErr3 := e2epod.DeletePodWithWait(ctx, f.ClientSet, testPod3) - framework.ExpectNoError(delErr3, "failed to delete pod %s", testPod3.Name) + e2epod.DeletePodsWithWait(ctx, f.ClientSet, []*v1.Pod{testPod2, testPod3}) ginkgo.By(fmt.Sprintf("TEST3: Verify pod '%s' is resized successfully after pod deletion '%s' and '%s", testPod1.Name, testPod2.Name, testPod3.Name)) expected := []podresize.ResizableContainerInfo{ @@ -538,12 +534,7 @@ func doPodResizeRetryDeferredTests(f *framework.Framework) { podresize.ExpectPodResized(ctx, f, resizedPod, expected) ginkgo.By("deleting pods") - delErr1 := e2epod.DeletePodWithWait(ctx, f.ClientSet, testPod1) - framework.ExpectNoError(delErr1, "failed to delete pod %s", testPod1.Name) - delErr2 := e2epod.DeletePodWithWait(ctx, f.ClientSet, testPod2) - framework.ExpectNoError(delErr2, "failed to delete pod %s", testPod2.Name) - delErr3 := e2epod.DeletePodWithWait(ctx, f.ClientSet, testPod3) - framework.ExpectNoError(delErr3, "failed to delete pod %s", testPod3.Name) + e2epod.DeletePodsWithWait(ctx, f.ClientSet, []*v1.Pod{testPod1, testPod2, testPod3}) }) ginkgo.It("pod-resize-retry-deferred-test-2", func(ctx context.Context) { @@ -905,15 +896,7 @@ func doPodResizeRetryDeferredTests(f *framework.Framework) { podresize.ExpectPodResized(ctx, f, resizedPod, expectedTestPod4Resized) ginkgo.By("deleting pods") - for _, testPod := range testPods { - delErr := f.ClientSet.CoreV1().Pods(testPod.Namespace).Delete(ctx, testPod.Name, metav1.DeleteOptions{}) - if delErr != nil && !apierrors.IsNotFound(delErr) { - framework.ExpectNoError(delErr, "failed to delete pod %s", testPod.Name) - } - } - for _, testPod := range testPods { - framework.ExpectNoError(e2epod.WaitForPodNotFoundInNamespace(ctx, f.ClientSet, testPod.Name, testPod.Namespace, e2epod.PodDeleteTimeout)) - } + e2epod.DeletePodsWithWait(ctx, f.ClientSet, testPods) }) }