From 08f733863e7cca51f361d65c7f911ae9af50ef8e Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 12:20:12 +0100 Subject: [PATCH 01/14] refactor(TestDefaultEvictor): add buildTestNode helper function --- .../defaultevictor/defaultevictor_test.go | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 61dd90e57..110f880b8 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -60,8 +60,12 @@ type testCase struct { pvcs []*v1.PersistentVolumeClaim } +func buildTestNode(name string, apply func(*v1.Node)) *v1.Node { + return test.BuildTestNode(name, 1000, 2000, 13, apply) +} + func TestDefaultEvictorPreEvictionFilter(t *testing.T) { - n1 := test.BuildTestNode("node1", 1000, 2000, 13, nil) + n1 := buildTestNode("node1", nil) nodeTaintKey := "hardware" nodeTaintValue := "gpu" @@ -78,7 +82,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node2", func(node *v1.Node) { node.Spec.Taints = []v1.Taint{ { Key: nodeTaintKey, @@ -87,7 +91,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }, } }), - test.BuildTestNode("node3", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node3", func(node *v1.Node) { node.Spec.Taints = []v1.Taint{ { Key: nodeTaintKey, @@ -113,7 +117,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node2", func(node *v1.Node) { node.Spec.Taints = []v1.Taint{ { Key: nodeTaintKey, @@ -122,7 +126,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }, } }), - test.BuildTestNode("node3", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node3", func(node *v1.Node) { node.Spec.Taints = []v1.Taint{ { Key: nodeTaintKey, @@ -145,12 +149,12 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node2", func(node *v1.Node) { node.ObjectMeta.Labels = map[string]string{ nodeLabelKey: nodeLabelValue, } }), - test.BuildTestNode("node3", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node3", func(node *v1.Node) { node.ObjectMeta.Labels = map[string]string{ nodeLabelKey: nodeLabelValue, } @@ -168,12 +172,12 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node2", func(node *v1.Node) { node.ObjectMeta.Labels = map[string]string{ nodeLabelKey: nodeLabelValue, } }), - test.BuildTestNode("node3", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node3", func(node *v1.Node) { node.ObjectMeta.Labels = map[string]string{ nodeLabelKey: nodeLabelValue, } @@ -282,12 +286,12 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node2", func(node *v1.Node) { node.ObjectMeta.Labels = map[string]string{ nodeLabelKey: nodeLabelValue, } }), - test.BuildTestNode("node3", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node3", func(node *v1.Node) { node.ObjectMeta.Labels = map[string]string{ nodeLabelKey: nodeLabelValue, } @@ -316,7 +320,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { } func TestDefaultEvictorFilter(t *testing.T) { - n1 := test.BuildTestNode("node1", 1000, 2000, 13, nil) + n1 := buildTestNode("node1", nil) lowPriority := int32(800) highPriority := int32(900) @@ -637,7 +641,7 @@ func TestDefaultEvictorFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node2", func(node *v1.Node) { node.Spec.Taints = []v1.Taint{ { Key: nodeTaintKey, @@ -646,7 +650,7 @@ func TestDefaultEvictorFilter(t *testing.T) { }, } }), - test.BuildTestNode("node3", 1000, 2000, 13, func(node *v1.Node) { + buildTestNode("node3", func(node *v1.Node) { node.Spec.Taints = []v1.Taint{ { Key: nodeTaintKey, @@ -1041,7 +1045,7 @@ func TestDefaultEvictorFilter(t *testing.T) { } func TestReinitialization(t *testing.T) { - n1 := test.BuildTestNode("node1", 1000, 2000, 13, nil) + n1 := buildTestNode("node1", nil) ownerRefUUID := uuid.NewUUID() testCases := []testCase{ From d666e4b830a36cec61f4bbe58ef5cba408862b0d Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 13:43:00 +0100 Subject: [PATCH 02/14] refactor(TestDefaultEvictor): add buildTestPod helper function --- .../defaultevictor/defaultevictor_test.go | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 110f880b8..8be0e5ba5 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -64,6 +64,10 @@ func buildTestNode(name string, apply func(*v1.Node)) *v1.Node { return test.BuildTestNode(name, 1000, 2000, 13, apply) } +func buildTestPod(name string, nodeName string, apply func(*v1.Pod)) *v1.Pod { + return test.BuildTestPod(name, 400, 0, nodeName, apply) +} + func TestDefaultEvictorPreEvictionFilter(t *testing.T) { n1 := buildTestNode("node1", nil) @@ -77,7 +81,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { { description: "Pod with no tolerations running on normal node, all other nodes tainted", pods: []*v1.Pod{ - test.BuildTestPod("p1", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p1", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), }, @@ -105,7 +109,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }, { description: "Pod with correct tolerations running on normal node, all other nodes tainted", pods: []*v1.Pod{ - test.BuildTestPod("p1", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p1", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Tolerations = []v1.Toleration{ { @@ -141,7 +145,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }, { description: "Pod with incorrect node selector", pods: []*v1.Pod{ - test.BuildTestPod("p1", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p1", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: "fail", @@ -164,7 +168,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }, { description: "Pod with correct node selector", pods: []*v1.Pod{ - test.BuildTestPod("p1", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p1", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: nodeLabelValue, @@ -278,7 +282,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }, { description: "Pod with incorrect node selector, but nodefit false, should still be evicted", pods: []*v1.Pod{ - test.BuildTestPod("p1", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p1", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: "fail", @@ -335,20 +339,20 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Failed pod eviction with no ownerRefs", pods: []*v1.Pod{ - test.BuildTestPod("bare_pod_failed", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("bare_pod_failed", n1.Name, func(pod *v1.Pod) { pod.Status.Phase = v1.PodFailed }), }, }, { description: "Normal pod eviction with no ownerRefs and evictFailedBarePods enabled", - pods: []*v1.Pod{test.BuildTestPod("bare_pod", 400, 0, n1.Name, nil)}, + pods: []*v1.Pod{buildTestPod("bare_pod", n1.Name, nil)}, evictFailedBarePods: true, }, { description: "Failed pod eviction with no ownerRefs", pods: []*v1.Pod{ - test.BuildTestPod("bare_pod_failed_but_can_be_evicted", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("bare_pod_failed_but_can_be_evicted", n1.Name, func(pod *v1.Pod) { pod.Status.Phase = v1.PodFailed }), }, @@ -358,7 +362,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with normal ownerRefs", pods: []*v1.Pod{ - test.BuildTestPod("p1", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p1", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), }, @@ -367,7 +371,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with normal ownerRefs and " + evictPodAnnotationKey + " annotation", pods: []*v1.Pod{ - test.BuildTestPod("p2", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p2", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), @@ -377,7 +381,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with normal ownerRefs and " + evictionutils.SoftNoEvictionAnnotationKey + " annotation (preference)", pods: []*v1.Pod{ - test.BuildTestPod("p2", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p2", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictionutils.SoftNoEvictionAnnotationKey: ""} pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), @@ -389,7 +393,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with normal ownerRefs and " + evictionutils.SoftNoEvictionAnnotationKey + " annotation (mandatory)", pods: []*v1.Pod{ - test.BuildTestPod("p2", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p2", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictionutils.SoftNoEvictionAnnotationKey: ""} pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), @@ -402,7 +406,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with replicaSet ownerRefs", pods: []*v1.Pod{ - test.BuildTestPod("p3", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p3", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), }, @@ -411,7 +415,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with replicaSet ownerRefs and " + evictPodAnnotationKey + " annotation", pods: []*v1.Pod{ - test.BuildTestPod("p4", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p4", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.ObjectMeta.OwnerReferences = test.GetReplicaSetOwnerRefList() }), @@ -421,7 +425,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with statefulSet ownerRefs", pods: []*v1.Pod{ - test.BuildTestPod("p18", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p18", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), }, @@ -430,7 +434,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with statefulSet ownerRefs and " + evictPodAnnotationKey + " annotation", pods: []*v1.Pod{ - test.BuildTestPod("p19", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p19", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.ObjectMeta.OwnerReferences = test.GetStatefulSetOwnerRefList() }), @@ -440,7 +444,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod not evicted because it is bound to a PV and evictLocalStoragePods = false", pods: []*v1.Pod{ - test.BuildTestPod("p5", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p5", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -459,7 +463,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it is bound to a PV and evictLocalStoragePods = true", pods: []*v1.Pod{ - test.BuildTestPod("p6", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p6", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -480,7 +484,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it is bound to a PV and evictLocalStoragePods = false, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ - test.BuildTestPod("p7", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p7", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ @@ -501,7 +505,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod not evicted because it is part of a daemonSet", pods: []*v1.Pod{ - test.BuildTestPod("p8", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p8", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.ObjectMeta.OwnerReferences = test.GetDaemonSetOwnerRefList() }), @@ -510,7 +514,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it is part of a daemonSet, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ - test.BuildTestPod("p9", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p9", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.ObjectMeta.OwnerReferences = test.GetDaemonSetOwnerRefList() }), @@ -520,7 +524,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod not evicted because it is a mirror poddsa", pods: []*v1.Pod{ - test.BuildTestPod("p10", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p10", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Annotations = test.GetMirrorPodAnnotation() }), @@ -529,7 +533,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it is a mirror pod, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ - test.BuildTestPod("p11", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p11", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Annotations = test.GetMirrorPodAnnotation() pod.Annotations[evictPodAnnotationKey] = "true" @@ -540,7 +544,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod not evicted because it has system critical priority", pods: []*v1.Pod{ - test.BuildTestPod("p12", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p12", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority @@ -550,7 +554,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it has system critical priority, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ - test.BuildTestPod("p13", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p13", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority @@ -564,7 +568,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod not evicted because it has a priority higher than the configured priority threshold", pods: []*v1.Pod{ - test.BuildTestPod("p14", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p14", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Priority = &highPriority }), @@ -574,7 +578,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it has a priority higher than the configured priority threshold, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ - test.BuildTestPod("p15", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p15", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.Spec.Priority = &highPriority @@ -586,7 +590,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it has system critical priority, but evictSystemCriticalPods = true", pods: []*v1.Pod{ - test.BuildTestPod("p16", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p16", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority @@ -598,7 +602,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it has system critical priority, but evictSystemCriticalPods = true and it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ - test.BuildTestPod("p16", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p16", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} priority := utils.SystemCriticalPriority @@ -611,7 +615,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it has a priority higher than the configured priority threshold, but evictSystemCriticalPods = true", pods: []*v1.Pod{ - test.BuildTestPod("p17", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p17", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Priority = &highPriority }), @@ -623,7 +627,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod is evicted because it has a priority higher than the configured priority threshold, but evictSystemCriticalPods = true and it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ - test.BuildTestPod("p17", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p17", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.Spec.Priority = &highPriority @@ -636,7 +640,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod with no tolerations running on normal node, all other nodes tainted, no PreEvictionFilter, should ignore nodeFit", pods: []*v1.Pod{ - test.BuildTestPod("p1", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p1", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), }, @@ -771,7 +775,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "ignorePvcPods is set, pod with PVC, not evicts", pods: []*v1.Pod{ - test.BuildTestPod("p15", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p15", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -787,7 +791,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "ignorePvcPods is not set, pod with PVC, evicts", pods: []*v1.Pod{ - test.BuildTestPod("p15", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p15", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -803,7 +807,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod with local storage is evicted because 'PodsWithLocalStorage' is in DefaultDisabled", pods: []*v1.Pod{ - test.BuildTestPod("p18", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p18", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -822,7 +826,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "DaemonSet pod is evicted because 'DaemonSetPods' is in DefaultDisabled", pods: []*v1.Pod{ - test.BuildTestPod("p19", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p19", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = []metav1.OwnerReference{ { Kind: "DaemonSet", @@ -840,7 +844,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod with PVC is not evicted because 'PodsWithPVC' is in ExtraEnabled", pods: []*v1.Pod{ - test.BuildTestPod("p20", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p20", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -859,7 +863,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod without PDB is not evicted because 'PodsWithoutPDB' is in ExtraEnabled", pods: []*v1.Pod{ - test.BuildTestPod("p21", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p21", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() }), }, @@ -871,7 +875,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod with ResourceClaims is not evicted because 'PodsWithResourceClaims' is in ExtraEnabled", pods: []*v1.Pod{ - test.BuildTestPod("p20", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p20", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.ResourceClaims = []v1.PodResourceClaim{ { @@ -889,7 +893,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod using StorageClass is not evicted because 'PodsWithPVC' is in ExtraEnabled", pods: []*v1.Pod{ - test.BuildTestPod("p23", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p23", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -922,7 +926,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod using unprotected StorageClass is evicted even though 'PodsWithPVC' is in ExtraEnabled", pods: []*v1.Pod{ - test.BuildTestPod("p24", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p24", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -955,7 +959,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod using unexisting PVC is not evicted because we cannot determine if storage class is protected or not", pods: []*v1.Pod{ - test.BuildTestPod("p25", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p25", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { @@ -986,7 +990,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod using protected and unprotected StorageClasses is not evicted", pods: []*v1.Pod{ - test.BuildTestPod("p26", 400, 0, n1.Name, func(pod *v1.Pod) { + buildTestPod("p26", n1.Name, func(pod *v1.Pod) { pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() pod.Spec.Volumes = []v1.Volume{ { From b8765bd8ee5b73b48e1e4147c995faa1aee88c53 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 13:54:50 +0100 Subject: [PATCH 03/14] refactor(TestDefaultEvictor): add setNodeTaint helper function --- .../defaultevictor/defaultevictor_test.go | 81 ++++++------------- 1 file changed, 25 insertions(+), 56 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 8be0e5ba5..3b84d89d2 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -77,6 +77,16 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { nodeLabelKey := "datacenter" nodeLabelValue := "east" + setNodeTaint := func(node *v1.Node) { + node.Spec.Taints = []v1.Taint{ + { + Key: nodeTaintKey, + Value: nodeTaintValue, + Effect: v1.TaintEffectNoSchedule, + }, + } + } + testCases := []testCase{ { description: "Pod with no tolerations running on normal node, all other nodes tainted", @@ -86,24 +96,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - buildTestNode("node2", func(node *v1.Node) { - node.Spec.Taints = []v1.Taint{ - { - Key: nodeTaintKey, - Value: nodeTaintValue, - Effect: v1.TaintEffectNoSchedule, - }, - } - }), - buildTestNode("node3", func(node *v1.Node) { - node.Spec.Taints = []v1.Taint{ - { - Key: nodeTaintKey, - Value: nodeTaintValue, - Effect: v1.TaintEffectNoSchedule, - }, - } - }), + buildTestNode("node2", setNodeTaint), + buildTestNode("node3", setNodeTaint), }, nodeFit: true, }, { @@ -121,24 +115,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - buildTestNode("node2", func(node *v1.Node) { - node.Spec.Taints = []v1.Taint{ - { - Key: nodeTaintKey, - Value: nodeTaintValue, - Effect: v1.TaintEffectNoSchedule, - }, - } - }), - buildTestNode("node3", func(node *v1.Node) { - node.Spec.Taints = []v1.Taint{ - { - Key: nodeTaintKey, - Value: nodeTaintValue, - Effect: v1.TaintEffectNoSchedule, - }, - } - }), + buildTestNode("node2", setNodeTaint), + buildTestNode("node3", setNodeTaint), }, nodeFit: true, result: true, @@ -330,8 +308,15 @@ func TestDefaultEvictorFilter(t *testing.T) { minPodAge := metav1.Duration{Duration: 50 * time.Minute} - nodeTaintKey := "hardware" - nodeTaintValue := "gpu" + setNodeTaint := func(node *v1.Node) { + node.Spec.Taints = []v1.Taint{ + { + Key: "hardware", + Value: "gpu", + Effect: v1.TaintEffectNoSchedule, + }, + } + } ownerRefUUID := uuid.NewUUID() @@ -645,24 +630,8 @@ func TestDefaultEvictorFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - buildTestNode("node2", func(node *v1.Node) { - node.Spec.Taints = []v1.Taint{ - { - Key: nodeTaintKey, - Value: nodeTaintValue, - Effect: v1.TaintEffectNoSchedule, - }, - } - }), - buildTestNode("node3", func(node *v1.Node) { - node.Spec.Taints = []v1.Taint{ - { - Key: nodeTaintKey, - Value: nodeTaintValue, - Effect: v1.TaintEffectNoSchedule, - }, - } - }), + buildTestNode("node2", setNodeTaint), + buildTestNode("node3", setNodeTaint), }, nodeFit: true, result: true, From 3bb4529c34a95f45adaff49d26fb865ad855ce5e Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 13:56:23 +0100 Subject: [PATCH 04/14] refactor(TestDefaultEvictor): use test.SetNormalOwnerRef --- .../defaultevictor/defaultevictor_test.go | 112 ++++++++---------- 1 file changed, 50 insertions(+), 62 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 3b84d89d2..c760b67e2 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -91,9 +91,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { { description: "Pod with no tolerations running on normal node, all other nodes tainted", pods: []*v1.Pod{ - buildTestPod("p1", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() - }), + buildTestPod("p1", n1.Name, test.SetNormalOwnerRef), }, nodes: []*v1.Node{ buildTestNode("node2", setNodeTaint), @@ -104,7 +102,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { description: "Pod with correct tolerations running on normal node, all other nodes tainted", pods: []*v1.Pod{ buildTestPod("p1", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Tolerations = []v1.Toleration{ { Key: nodeTaintKey, @@ -124,7 +122,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { description: "Pod with incorrect node selector", pods: []*v1.Pod{ buildTestPod("p1", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: "fail", } @@ -147,7 +145,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { description: "Pod with correct node selector", pods: []*v1.Pod{ buildTestPod("p1", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: nodeLabelValue, } @@ -171,7 +169,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { description: "Pod with correct node selector, but only available node doesn't have enough CPU", pods: []*v1.Pod{ test.BuildTestPod("p1", 12, 8, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: nodeLabelValue, } @@ -194,7 +192,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { description: "Pod with correct node selector, and one node has enough memory", pods: []*v1.Pod{ test.BuildTestPod("p1", 12, 8, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: nodeLabelValue, } @@ -228,7 +226,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { description: "Pod with correct node selector, but both nodes don't have enough memory", pods: []*v1.Pod{ test.BuildTestPod("p1", 12, 8, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: nodeLabelValue, } @@ -261,7 +259,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { description: "Pod with incorrect node selector, but nodefit false, should still be evicted", pods: []*v1.Pod{ buildTestPod("p1", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.NodeSelector = map[string]string{ nodeLabelKey: "fail", } @@ -347,9 +345,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with normal ownerRefs", pods: []*v1.Pod{ - buildTestPod("p1", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() - }), + buildTestPod("p1", n1.Name, test.SetNormalOwnerRef), }, result: true, }, @@ -358,7 +354,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p2", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) }), }, result: true, @@ -368,7 +364,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p2", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictionutils.SoftNoEvictionAnnotationKey: ""} - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) }), }, evictLocalStoragePods: false, @@ -380,7 +376,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p2", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictionutils.SoftNoEvictionAnnotationKey: ""} - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) }), }, evictLocalStoragePods: false, @@ -391,9 +387,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with replicaSet ownerRefs", pods: []*v1.Pod{ - buildTestPod("p3", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() - }), + buildTestPod("p3", n1.Name, test.SetNormalOwnerRef), }, result: true, }, @@ -410,9 +404,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Normal pod eviction with statefulSet ownerRefs", pods: []*v1.Pod{ - buildTestPod("p18", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() - }), + buildTestPod("p18", n1.Name, test.SetNormalOwnerRef), }, result: true, }, @@ -430,7 +422,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod not evicted because it is bound to a PV and evictLocalStoragePods = false", pods: []*v1.Pod{ buildTestPod("p5", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "sample", @@ -449,7 +441,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it is bound to a PV and evictLocalStoragePods = true", pods: []*v1.Pod{ buildTestPod("p6", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "sample", @@ -471,7 +463,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p7", n1.Name, func(pod *v1.Pod) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "sample", @@ -491,7 +483,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod not evicted because it is part of a daemonSet", pods: []*v1.Pod{ buildTestPod("p8", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.ObjectMeta.OwnerReferences = test.GetDaemonSetOwnerRefList() }), }, @@ -510,7 +502,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod not evicted because it is a mirror poddsa", pods: []*v1.Pod{ buildTestPod("p10", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Annotations = test.GetMirrorPodAnnotation() }), }, @@ -519,7 +511,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it is a mirror pod, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ buildTestPod("p11", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Annotations = test.GetMirrorPodAnnotation() pod.Annotations[evictPodAnnotationKey] = "true" }), @@ -530,7 +522,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod not evicted because it has system critical priority", pods: []*v1.Pod{ buildTestPod("p12", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority }), @@ -540,7 +532,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it has system critical priority, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ buildTestPod("p13", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority pod.Annotations = map[string]string{ @@ -554,7 +546,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod not evicted because it has a priority higher than the configured priority threshold", pods: []*v1.Pod{ buildTestPod("p14", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Priority = &highPriority }), }, @@ -564,7 +556,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it has a priority higher than the configured priority threshold, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ buildTestPod("p15", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.Spec.Priority = &highPriority }), @@ -576,7 +568,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it has system critical priority, but evictSystemCriticalPods = true", pods: []*v1.Pod{ buildTestPod("p16", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority }), @@ -588,7 +580,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it has system critical priority, but evictSystemCriticalPods = true and it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ buildTestPod("p16", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority @@ -601,7 +593,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it has a priority higher than the configured priority threshold, but evictSystemCriticalPods = true", pods: []*v1.Pod{ buildTestPod("p17", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Priority = &highPriority }), }, @@ -613,7 +605,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it has a priority higher than the configured priority threshold, but evictSystemCriticalPods = true and it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ buildTestPod("p17", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} pod.Spec.Priority = &highPriority }), @@ -625,9 +617,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod with no tolerations running on normal node, all other nodes tainted, no PreEvictionFilter, should ignore nodeFit", pods: []*v1.Pod{ - buildTestPod("p1", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() - }), + buildTestPod("p1", n1.Name, test.SetNormalOwnerRef), }, nodes: []*v1.Node{ buildTestNode("node2", setNodeTaint), @@ -640,11 +630,11 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "minReplicas of 2, owner with 2 replicas, evicts", pods: []*v1.Pod{ test.BuildTestPod("p1", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.ObjectMeta.OwnerReferences[0].UID = ownerRefUUID }), test.BuildTestPod("p2", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.ObjectMeta.OwnerReferences[0].UID = ownerRefUUID }), }, @@ -655,11 +645,11 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "minReplicas of 3, owner with 2 replicas, no eviction", pods: []*v1.Pod{ test.BuildTestPod("p1", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.ObjectMeta.OwnerReferences[0].UID = ownerRefUUID }), test.BuildTestPod("p2", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.ObjectMeta.OwnerReferences[0].UID = ownerRefUUID }), }, @@ -673,7 +663,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pod.ObjectMeta.OwnerReferences[0].UID = ownerRefUUID }), test.BuildTestPod("p2", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) }), }, minReplicas: 2, @@ -683,7 +673,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "minPodAge of 50, pod created 10 minutes ago, no eviction", pods: []*v1.Pod{ test.BuildTestPod("p1", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) podStartTime := metav1.Now().Add(time.Minute * time.Duration(-10)) pod.Status.StartTime = &metav1.Time{Time: podStartTime} }), @@ -694,7 +684,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "minPodAge of 50, pod created 60 minutes ago, evicts", pods: []*v1.Pod{ test.BuildTestPod("p1", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) podStartTime := metav1.Now().Add(time.Minute * time.Duration(-60)) pod.Status.StartTime = &metav1.Time{Time: podStartTime} }), @@ -706,7 +696,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "nil minPodAge, pod created 60 minutes ago, evicts", pods: []*v1.Pod{ test.BuildTestPod("p1", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) podStartTime := metav1.Now().Add(time.Minute * time.Duration(-60)) pod.Status.StartTime = &metav1.Time{Time: podStartTime} }), @@ -717,7 +707,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "ignorePodsWithoutPDB, pod with no PDBs, no eviction", pods: []*v1.Pod{ test.BuildTestPod("p1", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Labels = map[string]string{ "app": "foo", } @@ -729,7 +719,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "ignorePodsWithoutPDB, pod with PDBs, evicts", pods: []*v1.Pod{ test.BuildTestPod("p1", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Labels = map[string]string{ "app": "foo", } @@ -745,7 +735,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "ignorePvcPods is set, pod with PVC, not evicts", pods: []*v1.Pod{ buildTestPod("p15", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "pvc", VolumeSource: v1.VolumeSource{ @@ -761,7 +751,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "ignorePvcPods is not set, pod with PVC, evicts", pods: []*v1.Pod{ buildTestPod("p15", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "pvc", VolumeSource: v1.VolumeSource{ @@ -777,7 +767,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod with local storage is evicted because 'PodsWithLocalStorage' is in DefaultDisabled", pods: []*v1.Pod{ buildTestPod("p18", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "local-storage", VolumeSource: v1.VolumeSource{ @@ -814,7 +804,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod with PVC is not evicted because 'PodsWithPVC' is in ExtraEnabled", pods: []*v1.Pod{ buildTestPod("p20", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "pvc", VolumeSource: v1.VolumeSource{ @@ -832,9 +822,7 @@ func TestDefaultEvictorFilter(t *testing.T) { { description: "Pod without PDB is not evicted because 'PodsWithoutPDB' is in ExtraEnabled", pods: []*v1.Pod{ - buildTestPod("p21", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() - }), + buildTestPod("p21", n1.Name, test.SetNormalOwnerRef), }, podProtections: PodProtections{ ExtraEnabled: []PodProtection{PodsWithoutPDB}, @@ -845,7 +833,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod with ResourceClaims is not evicted because 'PodsWithResourceClaims' is in ExtraEnabled", pods: []*v1.Pod{ buildTestPod("p20", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.ResourceClaims = []v1.PodResourceClaim{ { Name: "test-claim", @@ -863,7 +851,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod using StorageClass is not evicted because 'PodsWithPVC' is in ExtraEnabled", pods: []*v1.Pod{ buildTestPod("p23", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "pvc", VolumeSource: v1.VolumeSource{ @@ -896,7 +884,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod using unprotected StorageClass is evicted even though 'PodsWithPVC' is in ExtraEnabled", pods: []*v1.Pod{ buildTestPod("p24", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "pvc", VolumeSource: v1.VolumeSource{ @@ -929,7 +917,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod using unexisting PVC is not evicted because we cannot determine if storage class is protected or not", pods: []*v1.Pod{ buildTestPod("p25", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "pvc", VolumeSource: v1.VolumeSource{ @@ -960,7 +948,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod using protected and unprotected StorageClasses is not evicted", pods: []*v1.Pod{ buildTestPod("p26", n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { Name: "protected-pvc", VolumeSource: v1.VolumeSource{ @@ -1030,7 +1018,7 @@ func TestReinitialization(t *testing.T) { pod.ObjectMeta.OwnerReferences[0].UID = ownerRefUUID }), test.BuildTestPod("p2", 1, 1, n1.Name, func(pod *v1.Pod) { - pod.ObjectMeta.OwnerReferences = test.GetNormalPodOwnerRefList() + test.SetNormalOwnerRef(pod) }), }, minReplicas: 2, From dfd2b95d2d98501704005310bc97b93de2a68a70 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:08:11 +0100 Subject: [PATCH 05/14] refactor(TestDefaultEvictor): add setNodeLabel helper function --- .../defaultevictor/defaultevictor_test.go | 78 +++++-------------- 1 file changed, 18 insertions(+), 60 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index c760b67e2..95ad9172d 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -87,6 +87,12 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { } } + setNodeLabel := func(node *v1.Node) { + node.ObjectMeta.Labels = map[string]string{ + nodeLabelKey: nodeLabelValue, + } + } + testCases := []testCase{ { description: "Pod with no tolerations running on normal node, all other nodes tainted", @@ -129,16 +135,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - buildTestNode("node2", func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), - buildTestNode("node3", func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), + buildTestNode("node2", setNodeLabel), + buildTestNode("node3", setNodeLabel), }, nodeFit: true, }, { @@ -152,16 +150,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - buildTestNode("node2", func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), - buildTestNode("node3", func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), + buildTestNode("node2", setNodeLabel), + buildTestNode("node3", setNodeLabel), }, nodeFit: true, result: true, @@ -176,16 +166,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2-TEST", 10, 16, 10, func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), - test.BuildTestNode("node3-TEST", 10, 16, 10, func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), + test.BuildTestNode("node2-TEST", 10, 16, 10, setNodeLabel), + test.BuildTestNode("node3-TEST", 10, 16, 10, setNodeLabel), }, nodeFit: true, }, { @@ -209,16 +191,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 100, 16, 10, func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), - test.BuildTestNode("node3", 100, 20, 10, func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), + test.BuildTestNode("node2", 100, 16, 10, setNodeLabel), + test.BuildTestNode("node3", 100, 20, 10, setNodeLabel), }, nodeFit: true, result: true, @@ -243,16 +217,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - test.BuildTestNode("node2", 100, 16, 10, func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), - test.BuildTestNode("node3", 100, 16, 10, func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), + test.BuildTestNode("node2", 100, 16, 10, setNodeLabel), + test.BuildTestNode("node3", 100, 16, 10, setNodeLabel), }, nodeFit: true, }, { @@ -266,16 +232,8 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { }), }, nodes: []*v1.Node{ - buildTestNode("node2", func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), - buildTestNode("node3", func(node *v1.Node) { - node.ObjectMeta.Labels = map[string]string{ - nodeLabelKey: nodeLabelValue, - } - }), + buildTestNode("node2", setNodeLabel), + buildTestNode("node3", setNodeLabel), }, result: true, }, From 3068f8431a78c69fcecfaa01c2d8c1baa881498a Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:11:46 +0100 Subject: [PATCH 06/14] refactor(TestDefaultEvictor): add setPodNodeSelector helper function --- .../defaultevictor/defaultevictor_test.go | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 95ad9172d..1ae5153da 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -93,6 +93,12 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { } } + setPodNodeSelector := func(pod *v1.Pod) { + pod.Spec.NodeSelector = map[string]string{ + nodeLabelKey: nodeLabelValue, + } + } + testCases := []testCase{ { description: "Pod with no tolerations running on normal node, all other nodes tainted", @@ -144,9 +150,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p1", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.NodeSelector = map[string]string{ - nodeLabelKey: nodeLabelValue, - } + setPodNodeSelector(pod) }), }, nodes: []*v1.Node{ @@ -160,9 +164,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { pods: []*v1.Pod{ test.BuildTestPod("p1", 12, 8, n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.NodeSelector = map[string]string{ - nodeLabelKey: nodeLabelValue, - } + setPodNodeSelector(pod) }), }, nodes: []*v1.Node{ @@ -175,9 +177,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { pods: []*v1.Pod{ test.BuildTestPod("p1", 12, 8, n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.NodeSelector = map[string]string{ - nodeLabelKey: nodeLabelValue, - } + setPodNodeSelector(pod) }), test.BuildTestPod("node2-pod-10GB-mem", 20, 10, "node2", func(pod *v1.Pod) { pod.ObjectMeta.Labels = map[string]string{ @@ -201,9 +201,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) { pods: []*v1.Pod{ test.BuildTestPod("p1", 12, 8, n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.NodeSelector = map[string]string{ - nodeLabelKey: nodeLabelValue, - } + setPodNodeSelector(pod) }), test.BuildTestPod("node2-pod-10GB-mem", 10, 10, "node2", func(pod *v1.Pod) { pod.ObjectMeta.Labels = map[string]string{ From 1df3ef50300c6db630b56f6cab1b0b9956e3a923 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:22:28 +0100 Subject: [PATCH 07/14] refactor(TestDefaultEvictor): add setPodEvictAnnotation helper function --- .../defaultevictor/defaultevictor_test.go | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 1ae5153da..834765ca3 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -272,6 +272,10 @@ func TestDefaultEvictorFilter(t *testing.T) { } } + setPodEvictAnnotation := func(pod *v1.Pod) { + pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + } + ownerRefUUID := uuid.NewUUID() testCases := []testCase{ @@ -309,7 +313,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Normal pod eviction with normal ownerRefs and " + evictPodAnnotationKey + " annotation", pods: []*v1.Pod{ buildTestPod("p2", n1.Name, func(pod *v1.Pod) { - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) test.SetNormalOwnerRef(pod) }), }, @@ -351,7 +355,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Normal pod eviction with replicaSet ownerRefs and " + evictPodAnnotationKey + " annotation", pods: []*v1.Pod{ buildTestPod("p4", n1.Name, func(pod *v1.Pod) { - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) pod.ObjectMeta.OwnerReferences = test.GetReplicaSetOwnerRefList() }), }, @@ -368,7 +372,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Normal pod eviction with statefulSet ownerRefs and " + evictPodAnnotationKey + " annotation", pods: []*v1.Pod{ buildTestPod("p19", n1.Name, func(pod *v1.Pod) { - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) pod.ObjectMeta.OwnerReferences = test.GetStatefulSetOwnerRefList() }), }, @@ -418,7 +422,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it is bound to a PV and evictLocalStoragePods = false, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ buildTestPod("p7", n1.Name, func(pod *v1.Pod) { - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) test.SetNormalOwnerRef(pod) pod.Spec.Volumes = []v1.Volume{ { @@ -448,7 +452,7 @@ func TestDefaultEvictorFilter(t *testing.T) { description: "Pod is evicted because it is part of a daemonSet, but it has scheduler.alpha.kubernetes.io/evict annotation", pods: []*v1.Pod{ buildTestPod("p9", n1.Name, func(pod *v1.Pod) { - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) pod.ObjectMeta.OwnerReferences = test.GetDaemonSetOwnerRefList() }), }, @@ -513,7 +517,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p15", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) pod.Spec.Priority = &highPriority }), }, @@ -537,7 +541,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p16", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) priority := utils.SystemCriticalPriority pod.Spec.Priority = &priority }), @@ -562,7 +566,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p17", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} + setPodEvictAnnotation(pod) pod.Spec.Priority = &highPriority }), }, From 674e463bc23fb8171f10fb6f0f2094eaeb998c66 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:25:58 +0100 Subject: [PATCH 08/14] refactor(TestDefaultEvictor): replace manual owner reference assignments with test utilities --- pkg/framework/plugins/defaultevictor/defaultevictor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 834765ca3..57611cac3 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -356,7 +356,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p4", n1.Name, func(pod *v1.Pod) { setPodEvictAnnotation(pod) - pod.ObjectMeta.OwnerReferences = test.GetReplicaSetOwnerRefList() + test.SetRSOwnerRef(pod) }), }, result: true, @@ -373,7 +373,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p19", n1.Name, func(pod *v1.Pod) { setPodEvictAnnotation(pod) - pod.ObjectMeta.OwnerReferences = test.GetStatefulSetOwnerRefList() + test.SetSSOwnerRef(pod) }), }, result: true, From 9a5d7e8286e0097af2f6f931a8edb3e5b6a89718 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:27:18 +0100 Subject: [PATCH 09/14] refactor(TestDefaultEvictor): replace system critical priority assignments with test.SetPodPriority --- .../plugins/defaultevictor/defaultevictor_test.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 57611cac3..54732f1da 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -483,8 +483,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p12", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - priority := utils.SystemCriticalPriority - pod.Spec.Priority = &priority + test.SetPodPriority(pod, utils.SystemCriticalPriority) }), }, }, @@ -493,8 +492,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p13", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - priority := utils.SystemCriticalPriority - pod.Spec.Priority = &priority + test.SetPodPriority(pod, utils.SystemCriticalPriority) pod.Annotations = map[string]string{ evictPodAnnotationKey: "true", } @@ -529,8 +527,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p16", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - priority := utils.SystemCriticalPriority - pod.Spec.Priority = &priority + test.SetPodPriority(pod, utils.SystemCriticalPriority) }), }, evictSystemCriticalPods: true, @@ -542,8 +539,7 @@ func TestDefaultEvictorFilter(t *testing.T) { buildTestPod("p16", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) setPodEvictAnnotation(pod) - priority := utils.SystemCriticalPriority - pod.Spec.Priority = &priority + test.SetPodPriority(pod, utils.SystemCriticalPriority) }), }, evictSystemCriticalPods: true, From 8913d79d144178387d12151df94e411aa4f08916 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:28:08 +0100 Subject: [PATCH 10/14] refactor(TestDefaultEvictor): replace mirror pod annotation assignments with test.SetMirrorPodAnnotation --- pkg/framework/plugins/defaultevictor/defaultevictor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 54732f1da..f1af88fc1 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -463,7 +463,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p10", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Annotations = test.GetMirrorPodAnnotation() + test.SetMirrorPodAnnotation(pod) }), }, }, @@ -472,7 +472,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p11", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Annotations = test.GetMirrorPodAnnotation() + test.SetMirrorPodAnnotation(pod) pod.Annotations[evictPodAnnotationKey] = "true" }), }, From 90e4115b78b1eecd8281777992827d088ba36281 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:29:19 +0100 Subject: [PATCH 11/14] refactor(TestDefaultEvictor): add setPodLocalStorage helper function --- .../defaultevictor/defaultevictor_test.go | 50 +++++++------------ 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index f1af88fc1..29380b641 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -276,6 +276,20 @@ func TestDefaultEvictorFilter(t *testing.T) { pod.Annotations = map[string]string{evictPodAnnotationKey: "true"} } + setPodLocalStorage := func(pod *v1.Pod) { + pod.Spec.Volumes = []v1.Volume{ + { + Name: "sample", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{Path: "somePath"}, + EmptyDir: &v1.EmptyDirVolumeSource{ + SizeLimit: resource.NewQuantity(int64(10), resource.BinarySI), + }, + }, + }, + } + } + ownerRefUUID := uuid.NewUUID() testCases := []testCase{ @@ -383,17 +397,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p5", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "sample", - VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "somePath"}, - EmptyDir: &v1.EmptyDirVolumeSource{ - SizeLimit: resource.NewQuantity(int64(10), resource.BinarySI), - }, - }, - }, - } + setPodLocalStorage(pod) }), }, }, @@ -402,17 +406,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p6", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "sample", - VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "somePath"}, - EmptyDir: &v1.EmptyDirVolumeSource{ - SizeLimit: resource.NewQuantity(int64(10), resource.BinarySI), - }, - }, - }, - } + setPodLocalStorage(pod) }), }, evictLocalStoragePods: true, @@ -424,17 +418,7 @@ func TestDefaultEvictorFilter(t *testing.T) { buildTestPod("p7", n1.Name, func(pod *v1.Pod) { setPodEvictAnnotation(pod) test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "sample", - VolumeSource: v1.VolumeSource{ - HostPath: &v1.HostPathVolumeSource{Path: "somePath"}, - EmptyDir: &v1.EmptyDirVolumeSource{ - SizeLimit: resource.NewQuantity(int64(10), resource.BinarySI), - }, - }, - }, - } + setPodLocalStorage(pod) }), }, result: true, From 994ce3e2f7f656780d2ad7cd9f17ad5c9d41fb8e Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 14:30:33 +0100 Subject: [PATCH 12/14] refactor(TestDefaultEvictor): add setPodPVCVolumeWithFooClaimName helper function --- .../defaultevictor/defaultevictor_test.go | 65 +++++-------------- 1 file changed, 17 insertions(+), 48 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 29380b641..6ddb4f39d 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -290,6 +290,17 @@ func TestDefaultEvictorFilter(t *testing.T) { } } + setPodPVCVolumeWithFooClaimName := func(pod *v1.Pod) { + pod.Spec.Volumes = []v1.Volume{ + { + Name: "pvc", + VolumeSource: v1.VolumeSource{ + PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ClaimName: "foo"}, + }, + }, + } + } + ownerRefUUID := uuid.NewUUID() testCases := []testCase{ @@ -676,13 +687,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p15", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "pvc", VolumeSource: v1.VolumeSource{ - PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ClaimName: "foo"}, - }, - }, - } + setPodPVCVolumeWithFooClaimName(pod) }), }, ignorePvcPods: true, @@ -692,13 +697,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p15", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "pvc", VolumeSource: v1.VolumeSource{ - PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ClaimName: "foo"}, - }, - }, - } + setPodPVCVolumeWithFooClaimName(pod) }), }, result: true, @@ -745,13 +744,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p20", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "pvc", VolumeSource: v1.VolumeSource{ - PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ClaimName: "foo"}, - }, - }, - } + setPodPVCVolumeWithFooClaimName(pod) }), }, podProtections: PodProtections{ @@ -792,15 +785,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p23", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "pvc", VolumeSource: v1.VolumeSource{ - PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ - ClaimName: "foo", - }, - }, - }, - } + setPodPVCVolumeWithFooClaimName(pod) }), }, podProtections: PodProtections{ @@ -825,15 +810,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p24", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "pvc", VolumeSource: v1.VolumeSource{ - PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ - ClaimName: "foo", - }, - }, - }, - } + setPodPVCVolumeWithFooClaimName(pod) }), }, podProtections: PodProtections{ @@ -858,15 +835,7 @@ func TestDefaultEvictorFilter(t *testing.T) { pods: []*v1.Pod{ buildTestPod("p25", n1.Name, func(pod *v1.Pod) { test.SetNormalOwnerRef(pod) - pod.Spec.Volumes = []v1.Volume{ - { - Name: "pvc", VolumeSource: v1.VolumeSource{ - PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ - ClaimName: "foo", - }, - }, - }, - } + setPodPVCVolumeWithFooClaimName(pod) }), }, podProtections: PodProtections{ From 3283635149e3b856c3c39a20e731e898885ebafa Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 15:17:06 +0100 Subject: [PATCH 13/14] refactor(defaultevictor_test): move newProtectedStorageClassesConfig to package level Move the newProtectedStorageClassesConfig helper function from local scope to package level so it can be reused by both TestDefaultEvictorFilter and Test_protectedPVCStorageClasses, eliminating code duplication. --- .../defaultevictor/defaultevictor_test.go | 61 ++++++------------- 1 file changed, 17 insertions(+), 44 deletions(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index 6ddb4f39d..c914fefe3 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -68,6 +68,18 @@ func buildTestPod(name string, nodeName string, apply func(*v1.Pod)) *v1.Pod { return test.BuildTestPod(name, 400, 0, nodeName, apply) } +func newProtectedStorageClassesConfig(storageClassNames ...string) *PodProtectionsConfig { + protectedClasses := make([]ProtectedStorageClass, len(storageClassNames)) + for i, name := range storageClassNames { + protectedClasses[i] = ProtectedStorageClass{Name: name} + } + return &PodProtectionsConfig{ + PodsWithPVC: &PodsWithPVCConfig{ + ProtectedStorageClasses: protectedClasses, + }, + } +} + func TestDefaultEvictorPreEvictionFilter(t *testing.T) { n1 := buildTestNode("node1", nil) @@ -790,15 +802,7 @@ func TestDefaultEvictorFilter(t *testing.T) { }, podProtections: PodProtections{ ExtraEnabled: []PodProtection{PodsWithPVC}, - Config: &PodProtectionsConfig{ - PodsWithPVC: &PodsWithPVCConfig{ - ProtectedStorageClasses: []ProtectedStorageClass{ - { - Name: "standard", - }, - }, - }, - }, + Config: newProtectedStorageClassesConfig("standard"), }, pvcs: []*v1.PersistentVolumeClaim{ test.BuildTestPVC("foo", "standard"), @@ -815,15 +819,7 @@ func TestDefaultEvictorFilter(t *testing.T) { }, podProtections: PodProtections{ ExtraEnabled: []PodProtection{PodsWithPVC}, - Config: &PodProtectionsConfig{ - PodsWithPVC: &PodsWithPVCConfig{ - ProtectedStorageClasses: []ProtectedStorageClass{ - { - Name: "protected", - }, - }, - }, - }, + Config: newProtectedStorageClassesConfig("protected"), }, pvcs: []*v1.PersistentVolumeClaim{ test.BuildTestPVC("foo", "unprotected"), @@ -840,15 +836,7 @@ func TestDefaultEvictorFilter(t *testing.T) { }, podProtections: PodProtections{ ExtraEnabled: []PodProtection{PodsWithPVC}, - Config: &PodProtectionsConfig{ - PodsWithPVC: &PodsWithPVCConfig{ - ProtectedStorageClasses: []ProtectedStorageClass{ - { - Name: "protected", - }, - }, - }, - }, + Config: newProtectedStorageClassesConfig("protected"), }, pvcs: []*v1.PersistentVolumeClaim{}, result: false, @@ -878,15 +866,7 @@ func TestDefaultEvictorFilter(t *testing.T) { }, podProtections: PodProtections{ ExtraEnabled: []PodProtection{PodsWithPVC}, - Config: &PodProtectionsConfig{ - PodsWithPVC: &PodsWithPVCConfig{ - ProtectedStorageClasses: []ProtectedStorageClass{ - { - Name: "protected", - }, - }, - }, - }, + Config: newProtectedStorageClassesConfig("protected"), }, pvcs: []*v1.PersistentVolumeClaim{ test.BuildTestPVC("protected", "protected"), @@ -1161,14 +1141,7 @@ func Test_protectedPVCStorageClasses(t *testing.T) { name: "storage classes specified", args: &DefaultEvictorArgs{ PodProtections: PodProtections{ - Config: &PodProtectionsConfig{ - PodsWithPVC: &PodsWithPVCConfig{ - ProtectedStorageClasses: []ProtectedStorageClass{ - {Name: "sc1"}, - {Name: "sc2"}, - }, - }, - }, + Config: newProtectedStorageClassesConfig("sc1", "sc2"), }, }, expected: []ProtectedStorageClass{ From 769ded35f160aceff5326e77e571bf498ca6fea6 Mon Sep 17 00:00:00 2001 From: Jan Chaloupka Date: Sat, 20 Dec 2025 15:24:37 +0100 Subject: [PATCH 14/14] make fmt --- pkg/framework/plugins/defaultevictor/defaultevictor_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go index c914fefe3..f88b75986 100644 --- a/pkg/framework/plugins/defaultevictor/defaultevictor_test.go +++ b/pkg/framework/plugins/defaultevictor/defaultevictor_test.go @@ -64,7 +64,7 @@ func buildTestNode(name string, apply func(*v1.Node)) *v1.Node { return test.BuildTestNode(name, 1000, 2000, 13, apply) } -func buildTestPod(name string, nodeName string, apply func(*v1.Pod)) *v1.Pod { +func buildTestPod(name, nodeName string, apply func(*v1.Pod)) *v1.Pod { return test.BuildTestPod(name, 400, 0, nodeName, apply) }