diff --git a/pkg/controller/nodelifecycle/BUILD b/pkg/controller/nodelifecycle/BUILD index 4647d724ca8..b0ac82c6737 100644 --- a/pkg/controller/nodelifecycle/BUILD +++ b/pkg/controller/nodelifecycle/BUILD @@ -84,6 +84,8 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library", diff --git a/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go b/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go index bb36b1a7890..8165c3b4060 100644 --- a/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go +++ b/pkg/controller/nodelifecycle/node_lifecycle_controller_test.go @@ -17,6 +17,7 @@ limitations under the License. package nodelifecycle import ( + "fmt" "strings" "testing" "time" @@ -27,6 +28,8 @@ import ( apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/diff" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/informers" @@ -60,6 +63,20 @@ const ( func alwaysReady() bool { return true } +func fakeGetPodsAssignedToNode(c *fake.Clientset) func(string) ([]v1.Pod, error) { + return func(nodeName string) ([]v1.Pod, error) { + selector := fields.SelectorFromSet(fields.Set{"spec.nodeName": nodeName}) + pods, err := c.CoreV1().Pods(v1.NamespaceAll).List(metav1.ListOptions{ + FieldSelector: selector.String(), + LabelSelector: labels.Everything().String(), + }) + if err != nil { + return nil, fmt.Errorf("failed to get Pods assigned to node %v", nodeName) + } + return pods.Items, nil + } +} + type nodeLifecycleController struct { *Controller leaseInformer coordinformers.LeaseInformer @@ -646,6 +663,7 @@ func TestMonitorNodeHealthEvictPods(t *testing.T) { false) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(item.fakeNodeHandler.Clientset) for _, ds := range item.daemonSets { nodeController.daemonSetInformer.Informer().GetStore().Add(&ds) } @@ -806,6 +824,7 @@ func TestPodStatusChange(t *testing.T) { false) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(item.fakeNodeHandler.Clientset) if err := nodeController.syncNodeStore(item.fakeNodeHandler); err != nil { t.Errorf("unexpected error: %v", err) } @@ -1329,10 +1348,11 @@ func TestMonitorNodeHealthEvictPodsWithDisruption(t *testing.T) { testNodeMonitorPeriod, false) nodeController.now = func() metav1.Time { return fakeNow } + nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(fakeNodeHandler.Clientset) nodeController.enterPartialDisruptionFunc = func(nodeNum int) float32 { return testRateLimiterQPS } - nodeController.recorder = testutil.NewFakeRecorder() nodeController.enterFullDisruptionFunc = func(nodeNum int) float32 { return testRateLimiterQPS } @@ -1615,6 +1635,7 @@ func TestMonitorNodeHealthUpdateStatus(t *testing.T) { false) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(item.fakeNodeHandler.Clientset) if err := nodeController.syncNodeStore(item.fakeNodeHandler); err != nil { t.Errorf("unexpected error: %v", err) } @@ -2159,6 +2180,7 @@ func TestMonitorNodeHealthUpdateNodeAndPodStatusWithLease(t *testing.T) { false) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(item.fakeNodeHandler.Clientset) if err := nodeController.syncNodeStore(item.fakeNodeHandler); err != nil { t.Fatalf("unexpected error: %v", err) } @@ -2322,6 +2344,7 @@ func TestMonitorNodeHealthMarkPodsNotReady(t *testing.T) { false) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(item.fakeNodeHandler.Clientset) if err := nodeController.syncNodeStore(item.fakeNodeHandler); err != nil { t.Errorf("unexpected error: %v", err) } @@ -2451,6 +2474,7 @@ func TestApplyNoExecuteTaints(t *testing.T) { true) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(fakeNodeHandler.Clientset) if err := nodeController.syncNodeStore(fakeNodeHandler); err != nil { t.Errorf("unexpected error: %v", err) } @@ -2591,6 +2615,7 @@ func TestSwapUnreachableNotReadyTaints(t *testing.T) { true) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(fakeNodeHandler.Clientset) if err := nodeController.syncNodeStore(fakeNodeHandler); err != nil { t.Errorf("unexpected error: %v", err) } @@ -2692,6 +2717,7 @@ func TestTaintsNodeByCondition(t *testing.T) { true) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(fakeNodeHandler.Clientset) networkUnavailableTaint := &v1.Taint{ Key: schedulerapi.TaintNodeNetworkUnavailable, @@ -2886,6 +2912,7 @@ func TestNodeEventGeneration(t *testing.T) { nodeController.now = func() metav1.Time { return fakeNow } fakeRecorder := testutil.NewFakeRecorder() nodeController.recorder = fakeRecorder + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(fakeNodeHandler.Clientset) if err := nodeController.syncNodeStore(fakeNodeHandler); err != nil { t.Errorf("unexpected error: %v", err) @@ -2955,6 +2982,7 @@ func TestReconcileNodeLabels(t *testing.T) { true) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(fakeNodeHandler.Clientset) tests := []struct { Name string @@ -3098,6 +3126,7 @@ func TestTryUpdateNodeHealth(t *testing.T) { true) nodeController.now = func() metav1.Time { return fakeNow } nodeController.recorder = testutil.NewFakeRecorder() + nodeController.getPodsAssignedToNode = fakeGetPodsAssignedToNode(fakeNodeHandler.Clientset) getStatus := func(cond *v1.NodeCondition) *v1.ConditionStatus { if cond == nil {