From cc7c862ce1a81dff8200165816ed7701fb088568 Mon Sep 17 00:00:00 2001 From: Aaron Crickenberger Date: Tue, 31 Mar 2020 20:00:07 -0700 Subject: [PATCH 1/2] e2e: use apiserver view of pods on node instead of kubelet Conformance tests must not rely on the kubelet API in order to pass. SchedulerPredicates tests attempt to use the kubelet API in their BeforeEach, some of which are tagged as Conformance. Is there a compelling reason to use the kubelet's view of pods for a given node instead of the apiserver's view of the pods? --- test/e2e/scheduling/BUILD | 1 - test/e2e/scheduling/predicates.go | 13 ++++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/test/e2e/scheduling/BUILD b/test/e2e/scheduling/BUILD index 16d03e657d6..6f4fc9ca720 100644 --- a/test/e2e/scheduling/BUILD +++ b/test/e2e/scheduling/BUILD @@ -43,7 +43,6 @@ go_library( "//test/e2e/framework:go_default_library", "//test/e2e/framework/gpu:go_default_library", "//test/e2e/framework/job:go_default_library", - "//test/e2e/framework/kubelet:go_default_library", "//test/e2e/framework/node:go_default_library", "//test/e2e/framework/pod:go_default_library", "//test/e2e/framework/providers/gce:go_default_library", diff --git a/test/e2e/scheduling/predicates.go b/test/e2e/scheduling/predicates.go index 2e11e22fafa..462646e177d 100644 --- a/test/e2e/scheduling/predicates.go +++ b/test/e2e/scheduling/predicates.go @@ -31,7 +31,6 @@ import ( clientset "k8s.io/client-go/kubernetes" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/test/e2e/framework" - e2ekubelet "k8s.io/kubernetes/test/e2e/framework/kubelet" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2erc "k8s.io/kubernetes/test/e2e/framework/rc" @@ -112,8 +111,8 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { framework.ExpectNoError(err) for _, node := range nodeList.Items { - framework.Logf("\nLogging pods the kubelet thinks is on node %v before test", node.Name) - printAllKubeletPods(cs, node.Name) + framework.Logf("\nLogging pods the apiserver thinks is on node %v before test", node.Name) + printAllPodsOnNode(cs, node.Name) } }) @@ -796,11 +795,11 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() { }) }) -// printAllKubeletPods outputs status of all kubelet pods into log. -func printAllKubeletPods(c clientset.Interface, nodeName string) { - podList, err := e2ekubelet.GetKubeletPods(c, nodeName) +// printAllPodsOnNode outputs status of all kubelet pods into log. +func printAllPodsOnNode(c clientset.Interface, nodeName string) { + podList, err := c.CoreV1().Pods(metav1.NamespaceAll).List(context.TODO(), metav1.ListOptions{FieldSelector: "spec.nodeName=" + nodeName}) if err != nil { - framework.Logf("Unable to retrieve kubelet pods for node %v: %v", nodeName, err) + framework.Logf("Unable to retrieve pods for node %v: %v", nodeName, err) return } for _, p := range podList.Items { From 1a5f6906e099f8f478b1568a9c322951b4269592 Mon Sep 17 00:00:00 2001 From: Aaron Crickenberger Date: Tue, 31 Mar 2020 20:40:25 -0700 Subject: [PATCH 2/2] e2e: don't use kubelet api to verify pod deletion Conformance tests must not rely on the kubelet API in order to pass. In this case, I think it's unnecessary to verify that a kubelet observes the deletion within gracePeriod seconds. The remaining checks in this test verify that pod deletion happens, and that the pod is removed. --- test/e2e/common/BUILD | 1 - test/e2e/common/pods.go | 23 ----------------------- 2 files changed, 24 deletions(-) diff --git a/test/e2e/common/BUILD b/test/e2e/common/BUILD index 2fcc51d2c5c..a7466c354fd 100644 --- a/test/e2e/common/BUILD +++ b/test/e2e/common/BUILD @@ -71,7 +71,6 @@ go_library( "//staging/src/k8s.io/client-go/tools/watch:go_default_library", "//test/e2e/framework:go_default_library", "//test/e2e/framework/events:go_default_library", - "//test/e2e/framework/kubelet:go_default_library", "//test/e2e/framework/network:go_default_library", "//test/e2e/framework/node:go_default_library", "//test/e2e/framework/pod:go_default_library", diff --git a/test/e2e/common/pods.go b/test/e2e/common/pods.go index a0005e61bab..70e19d87a6c 100644 --- a/test/e2e/common/pods.go +++ b/test/e2e/common/pods.go @@ -42,7 +42,6 @@ import ( podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/kubelet" "k8s.io/kubernetes/test/e2e/framework" - e2ekubelet "k8s.io/kubernetes/test/e2e/framework/kubelet" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2ewebsocket "k8s.io/kubernetes/test/e2e/framework/websocket" imageutils "k8s.io/kubernetes/test/utils/image" @@ -301,28 +300,6 @@ var _ = framework.KubeDescribe("Pods", func() { err = podClient.Delete(context.TODO(), pod.Name, *metav1.NewDeleteOptions(30)) framework.ExpectNoError(err, "failed to delete pod") - ginkgo.By("verifying the kubelet observed the termination notice") - err = wait.Poll(time.Second*5, time.Second*30, func() (bool, error) { - podList, err := e2ekubelet.GetKubeletPods(f.ClientSet, pod.Spec.NodeName) - if err != nil { - framework.Logf("Unable to retrieve kubelet pods for node %v: %v", pod.Spec.NodeName, err) - return false, nil - } - for _, kubeletPod := range podList.Items { - if pod.Name != kubeletPod.Name { - continue - } - if kubeletPod.ObjectMeta.DeletionTimestamp == nil { - framework.Logf("deletion has not yet been observed") - return false, nil - } - return true, nil - } - framework.Logf("no pod exists with the name we were looking for, assuming the termination request was observed and completed") - return true, nil - }) - framework.ExpectNoError(err, "kubelet never observed the termination notice") - ginkgo.By("verifying pod deletion was observed") deleted := false var lastPod *v1.Pod