diff --git a/pkg/framework/plugins/nodeutilization/highnodeutilization_test.go b/pkg/framework/plugins/nodeutilization/highnodeutilization_test.go index 1f4fd5cd5..27a8f26a2 100644 --- a/pkg/framework/plugins/nodeutilization/highnodeutilization_test.go +++ b/pkg/framework/plugins/nodeutilization/highnodeutilization_test.go @@ -25,16 +25,13 @@ import ( policy "k8s.io/api/policy/v1" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" - "k8s.io/client-go/tools/events" "sigs.k8s.io/descheduler/pkg/api" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/test" @@ -450,20 +447,16 @@ func TestHighNodeUtilization(t *testing.T) { for _, pod := range testCase.pods { objs = append(objs, pod) } - fakeClient := fake.NewSimpleClientset(objs...) - - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - podsForEviction := make(map[string]struct{}) for _, pod := range testCase.evictedPods { podsForEviction[pod] = struct{}{} } + fakeClient := fake.NewSimpleClientset(objs...) + + handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{NodeFit: true}, nil) + if err != nil { + t.Fatalf("Unable to initialize a framework handle: %v", err) + } evictionFailed := false if len(testCase.evictedPods) > 0 { @@ -481,41 +474,6 @@ func TestHighNodeUtilization(t *testing.T) { }) } - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor(fakeClient, eventRecorder, nil) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: true, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, - ) - if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, - } - plugin, err := NewHighNodeUtilization(&HighNodeUtilizationArgs{ Thresholds: testCase.thresholds, }, @@ -616,50 +574,16 @@ func TestHighNodeUtilizationWithTaints(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor( + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, fakeClient, - eventRecorder, evictions.NewOptions().WithMaxPodsToEvictPerNode(&item.evictionsExpected), - ) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, + defaultevictor.DefaultEvictorArgs{}, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := NewHighNodeUtilization(&HighNodeUtilizationArgs{ diff --git a/pkg/framework/plugins/nodeutilization/lownodeutilization_test.go b/pkg/framework/plugins/nodeutilization/lownodeutilization_test.go index ab167b667..a99acc7b6 100644 --- a/pkg/framework/plugins/nodeutilization/lownodeutilization_test.go +++ b/pkg/framework/plugins/nodeutilization/lownodeutilization_test.go @@ -22,21 +22,18 @@ import ( "testing" "sigs.k8s.io/descheduler/pkg/api" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" v1 "k8s.io/api/core/v1" policy "k8s.io/api/policy/v1" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" - "k8s.io/client-go/tools/events" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" "sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/test" ) @@ -869,14 +866,6 @@ func TestLowNodeUtilization(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - podsForEviction := make(map[string]struct{}) for _, pod := range tc.evictedPods { podsForEviction[pod] = struct{}{} @@ -898,39 +887,9 @@ func TestLowNodeUtilization(t *testing.T) { }) } - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor(fakeClient, eventRecorder, nil) - - defaultEvictorFilterArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: true, - } - - evictorFilter, err := defaultevictor.New( - defaultEvictorFilterArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, - ) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{NodeFit: true}, nil) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := NewLowNodeUtilization(&LowNodeUtilizationArgs{ @@ -1076,51 +1035,16 @@ func TestLowNodeUtilizationWithTaints(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor( + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, fakeClient, - eventRecorder, evictions.NewOptions().WithMaxPodsToEvictPerNode(&item.evictionsExpected), - ) - - defaultEvictorFilterArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: true, - } - - evictorFilter, err := defaultevictor.New( - defaultEvictorFilterArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, + defaultevictor.DefaultEvictorArgs{NodeFit: true}, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := NewLowNodeUtilization(&LowNodeUtilizationArgs{ diff --git a/pkg/framework/plugins/podlifetime/pod_lifetime_test.go b/pkg/framework/plugins/podlifetime/pod_lifetime_test.go index f34fd11c5..71e87965d 100644 --- a/pkg/framework/plugins/podlifetime/pod_lifetime_test.go +++ b/pkg/framework/plugins/podlifetime/pod_lifetime_test.go @@ -24,15 +24,12 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/events" utilptr "k8s.io/utils/ptr" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/test" ) @@ -632,53 +629,21 @@ func TestPodLifeTime(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor( + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, fakeClient, - eventRecorder, evictions.NewOptions(). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNamespace(tc.maxPodsToEvictPerNamespace). WithMaxPodsToEvictTotal(tc.maxPodsToEvictTotal), - ) - - defaultEvictorFilterArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: tc.ignorePvcPods, - EvictFailedBarePods: false, - } - - evictorFilter, err := defaultevictor.New( - defaultEvictorFilterArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, + defaultevictor.DefaultEvictorArgs{IgnorePvcPods: tc.ignorePvcPods}, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } - plugin, err := New(tc.args, &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - }) + plugin, err := New(tc.args, handle) if err != nil { t.Fatalf("Unable to initialize the plugin: %v", err) } diff --git a/pkg/framework/plugins/removeduplicates/removeduplicates_test.go b/pkg/framework/plugins/removeduplicates/removeduplicates_test.go index 26d90e36a..6bde4ea79 100644 --- a/pkg/framework/plugins/removeduplicates/removeduplicates_test.go +++ b/pkg/framework/plugins/removeduplicates/removeduplicates_test.go @@ -20,20 +20,15 @@ import ( "context" "testing" - "k8s.io/client-go/tools/events" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" - "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" - frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" - "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" + "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" + frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/test" ) @@ -299,46 +294,9 @@ func TestFindDuplicatePods(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{NodeFit: testCase.nodefit}, nil) if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor(fakeClient, eventRecorder, nil) - - nodeFit := testCase.nodefit - - defaultEvictorFilterArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: nodeFit, - } - - evictorFilter, _ := defaultevictor.New( - defaultEvictorFilterArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, - ) - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := New(&RemoveDuplicatesArgs{ @@ -739,46 +697,9 @@ func TestRemoveDuplicatesUniformly(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{}, nil) if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor(fakeClient, eventRecorder, nil) - - defaultEvictorFilterArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - } - - evictorFilter, err := defaultevictor.New( - defaultEvictorFilterArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, - ) - if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := New(&RemoveDuplicatesArgs{}, diff --git a/pkg/framework/plugins/removefailedpods/failedpods_test.go b/pkg/framework/plugins/removefailedpods/failedpods_test.go index c148d796e..77fc478ef 100644 --- a/pkg/framework/plugins/removefailedpods/failedpods_test.go +++ b/pkg/framework/plugins/removefailedpods/failedpods_test.go @@ -23,15 +23,11 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/events" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" - "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" "sigs.k8s.io/descheduler/test" ) @@ -361,39 +357,9 @@ func TestRemoveFailedPods(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{NodeFit: tc.nodeFit}, nil) if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor(fakeClient, eventRecorder, nil) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: tc.nodeFit, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, - ) - if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := New(&RemoveFailedPodsArgs{ @@ -405,13 +371,7 @@ func TestRemoveFailedPods(t *testing.T) { LabelSelector: tc.args.LabelSelector, Namespaces: tc.args.Namespaces, }, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - }, + handle, ) if err != nil { t.Fatalf("Unable to initialize the plugin: %v", err) diff --git a/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts_test.go b/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts_test.go index 188e971a3..c9336c235 100644 --- a/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts_test.go +++ b/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts_test.go @@ -24,14 +24,11 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/events" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/test" ) @@ -330,56 +327,22 @@ func TestRemovePodsHavingTooManyRestarts(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor( + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, fakeClient, - eventRecorder, evictions.NewOptions(). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace), - ) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: tc.nodeFit, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, + defaultevictor.DefaultEvictorArgs{NodeFit: tc.nodeFit}, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := New( &tc.args, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - }) + handle) if err != nil { t.Fatalf("Unable to initialize the plugin: %v", err) } diff --git a/pkg/framework/plugins/removepodsviolatinginterpodantiaffinity/pod_antiaffinity_test.go b/pkg/framework/plugins/removepodsviolatinginterpodantiaffinity/pod_antiaffinity_test.go index c6d434d04..255a45c07 100644 --- a/pkg/framework/plugins/removepodsviolatinginterpodantiaffinity/pod_antiaffinity_test.go +++ b/pkg/framework/plugins/removepodsviolatinginterpodantiaffinity/pod_antiaffinity_test.go @@ -23,15 +23,12 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/events" - frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" + frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/test" ) @@ -228,55 +225,20 @@ func TestPodAntiAffinity(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor( + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, fakeClient, - eventRecorder, evictions.NewOptions(). WithMaxPodsToEvictPerNode(test.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNamespace(test.maxNoOfPodsToEvictPerNamespace). WithMaxPodsToEvictTotal(test.maxNoOfPodsToEvictTotal), - ) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: test.nodeFit, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, + defaultevictor.DefaultEvictorArgs{NodeFit: test.nodeFit}, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - SharedInformerFactoryImpl: sharedInformerFactory, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - } plugin, err := New( &RemovePodsViolatingInterPodAntiAffinityArgs{}, handle, diff --git a/pkg/framework/plugins/removepodsviolatingnodeaffinity/node_affinity_test.go b/pkg/framework/plugins/removepodsviolatingnodeaffinity/node_affinity_test.go index 200193a10..4077ec64b 100644 --- a/pkg/framework/plugins/removepodsviolatingnodeaffinity/node_affinity_test.go +++ b/pkg/framework/plugins/removepodsviolatingnodeaffinity/node_affinity_test.go @@ -23,15 +23,12 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/events" - frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" + frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/test" ) @@ -357,54 +354,18 @@ func TestRemovePodsViolatingNodeAffinity(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor( + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, fakeClient, - eventRecorder, evictions.NewOptions(). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace). WithMaxPodsToEvictTotal(tc.maxNoOfPodsToEvictTotal), - ) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: tc.nodefit, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, + defaultevictor.DefaultEvictorArgs{NodeFit: tc.nodefit}, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - SharedInformerFactoryImpl: sharedInformerFactory, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := New( diff --git a/pkg/framework/plugins/removepodsviolatingnodetaints/node_taint_test.go b/pkg/framework/plugins/removepodsviolatingnodetaints/node_taint_test.go index b09177403..ab4459fd7 100644 --- a/pkg/framework/plugins/removepodsviolatingnodetaints/node_taint_test.go +++ b/pkg/framework/plugins/removepodsviolatingnodetaints/node_taint_test.go @@ -24,14 +24,11 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/events" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/test" @@ -410,54 +407,22 @@ func TestDeletePodsViolatingNodeTaints(t *testing.T) { } fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) - if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor( + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, fakeClient, - eventRecorder, evictions.NewOptions(). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace). WithMaxPodsToEvictTotal(tc.maxNoOfPodsToEvictTotal), - ) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: tc.evictLocalStoragePods, - EvictSystemCriticalPods: tc.evictSystemCriticalPods, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: tc.nodeFit, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, + defaultevictor.DefaultEvictorArgs{ + EvictLocalStoragePods: tc.evictLocalStoragePods, + EvictSystemCriticalPods: tc.evictSystemCriticalPods, + NodeFit: tc.nodeFit, }, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := New(&RemovePodsViolatingNodeTaintsArgs{ diff --git a/pkg/framework/plugins/removepodsviolatingtopologyspreadconstraint/topologyspreadconstraint_test.go b/pkg/framework/plugins/removepodsviolatingtopologyspreadconstraint/topologyspreadconstraint_test.go index c62336d79..8bd4e88b8 100644 --- a/pkg/framework/plugins/removepodsviolatingtopologyspreadconstraint/topologyspreadconstraint_test.go +++ b/pkg/framework/plugins/removepodsviolatingtopologyspreadconstraint/topologyspreadconstraint_test.go @@ -12,17 +12,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" - "k8s.io/client-go/tools/events" utilptr "k8s.io/utils/ptr" "sigs.k8s.io/descheduler/pkg/api" - "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/test" ) @@ -1419,27 +1415,22 @@ func TestTopologySpreadConstraint(t *testing.T) { objs = append(objs, &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "ns1"}}) fakeClient := fake.NewSimpleClientset(objs...) - sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - - podsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, + fakeClient, + nil, + defaultevictor.DefaultEvictorArgs{NodeFit: tc.nodeFit}, + // workaround to ensure that pods are returned sorted so 'expectedEvictedPods' would work consistently + func(pods []*v1.Pod) { + sort.Slice(pods, func(i, j int) bool { + return pods[i].Name < pods[j].Name + }) + }, + ) if err != nil { - t.Errorf("Build get pods assigned to node function error: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } - // workaround to ensure that pods are returned sorted so 'expectedEvictedPods' would work consistently - getPodsAssignedToNode := func(s string, filterFunc podutil.FilterFunc) ([]*v1.Pod, error) { - pods, err := podsAssignedToNode(s, filterFunc) - sort.Slice(pods, func(i, j int) bool { - return pods[i].Name < pods[j].Name - }) - - return pods, err - } - - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - var evictedPods []string fakeClient.PrependReactor("create", "pods", func(action core.Action) (bool, runtime.Object, error) { if action.GetSubresource() == "eviction" { @@ -1454,38 +1445,6 @@ func TestTopologySpreadConstraint(t *testing.T) { return false, nil, nil // fallback to the default reactor }) - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor(fakeClient, eventRecorder, nil) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: tc.nodeFit, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, - }, - ) - if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: fakeClient, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, - } - SetDefaults_RemovePodsViolatingTopologySpreadConstraintArgs(&tc.args) plugin, err := New( diff --git a/pkg/framework/profile/profile_test.go b/pkg/framework/profile/profile_test.go index 481586627..91a7f9521 100644 --- a/pkg/framework/profile/profile_test.go +++ b/pkg/framework/profile/profile_test.go @@ -13,18 +13,16 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/client-go/informers" fakeclientset "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" "sigs.k8s.io/descheduler/pkg/api" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" - podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" fakeplugin "sigs.k8s.io/descheduler/pkg/framework/fake/plugin" "sigs.k8s.io/descheduler/pkg/framework/pluginregistry" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" - "sigs.k8s.io/descheduler/pkg/utils" testutils "sigs.k8s.io/descheduler/test" ) @@ -232,29 +230,24 @@ func TestProfileDescheduleBalanceExtensionPointsEviction(t *testing.T) { var evictedPods []string client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods)) - sharedInformerFactory := informers.NewSharedInformerFactory(client, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, + client, + nil, + defaultevictor.DefaultEvictorArgs{}, + nil, + ) if err != nil { - t.Fatalf("build get pods assigned to node function error: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventClient := fakeclientset.NewSimpleClientset(n1, n2, p1) - eventBroadcaster, eventRecorder := utils.GetRecorderAndBroadcaster(ctx, eventClient) - defer eventBroadcaster.Shutdown() - - podEvictor := evictions.NewPodEvictor(client, eventRecorder, nil) - prfl, err := NewProfile( test.config, pluginregistry.PluginRegistry, WithClientSet(client), - WithSharedInformerFactory(sharedInformerFactory), + WithSharedInformerFactory(handle.SharedInformerFactoryImpl), WithPodEvictor(podEvictor), - WithGetPodsAssignedToNodeFnc(getPodsAssignedToNode), + WithGetPodsAssignedToNodeFnc(handle.GetPodsAssignedToNodeFuncImpl), ) if err != nil { t.Fatalf("unable to create %q profile: %v", test.config.Name, err) @@ -380,22 +373,17 @@ func TestProfileExtensionPoints(t *testing.T) { var evictedPods []string client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods)) - sharedInformerFactory := informers.NewSharedInformerFactory(client, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, + client, + nil, + defaultevictor.DefaultEvictorArgs{}, + nil, + ) if err != nil { - t.Fatalf("build get pods assigned to node function error: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventClient := fakeclientset.NewSimpleClientset(n1, n2, p1) - eventBroadcaster, eventRecorder := utils.GetRecorderAndBroadcaster(ctx, eventClient) - defer eventBroadcaster.Shutdown() - - podEvictor := evictions.NewPodEvictor(client, eventRecorder, nil) - prfl, err := NewProfile( api.DeschedulerProfile{ Name: "strategy-test-profile", @@ -435,9 +423,9 @@ func TestProfileExtensionPoints(t *testing.T) { }, pluginregistry.PluginRegistry, WithClientSet(client), - WithSharedInformerFactory(sharedInformerFactory), + WithSharedInformerFactory(handle.SharedInformerFactoryImpl), WithPodEvictor(podEvictor), - WithGetPodsAssignedToNodeFnc(getPodsAssignedToNode), + WithGetPodsAssignedToNodeFnc(handle.GetPodsAssignedToNodeFuncImpl), ) if err != nil { t.Fatalf("unable to create profile: %v", err) @@ -592,22 +580,17 @@ func TestProfileExtensionPointOrdering(t *testing.T) { var evictedPods []string client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods)) - sharedInformerFactory := informers.NewSharedInformerFactory(client, 0) - podInformer := sharedInformerFactory.Core().V1().Pods().Informer() - getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, + client, + nil, + defaultevictor.DefaultEvictorArgs{}, + nil, + ) if err != nil { - t.Fatalf("build get pods assigned to node function error: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } - sharedInformerFactory.Start(ctx.Done()) - sharedInformerFactory.WaitForCacheSync(ctx.Done()) - - eventClient := fakeclientset.NewSimpleClientset(n1, n2, p1) - eventBroadcaster, eventRecorder := utils.GetRecorderAndBroadcaster(ctx, eventClient) - defer eventBroadcaster.Shutdown() - - podEvictor := evictions.NewPodEvictor(client, eventRecorder, nil) - prfl, err := NewProfile( api.DeschedulerProfile{ Name: "strategy-test-profile", @@ -662,9 +645,9 @@ func TestProfileExtensionPointOrdering(t *testing.T) { }, pluginregistry.PluginRegistry, WithClientSet(client), - WithSharedInformerFactory(sharedInformerFactory), + WithSharedInformerFactory(handle.SharedInformerFactoryImpl), WithPodEvictor(podEvictor), - WithGetPodsAssignedToNodeFnc(getPodsAssignedToNode), + WithGetPodsAssignedToNodeFnc(handle.GetPodsAssignedToNodeFuncImpl), ) if err != nil { t.Fatalf("unable to create profile: %v", err) diff --git a/pkg/framework/testing/utils.go b/pkg/framework/testing/utils.go new file mode 100644 index 000000000..da982ece5 --- /dev/null +++ b/pkg/framework/testing/utils.go @@ -0,0 +1,66 @@ +package testing + +import ( + "context" + "fmt" + + v1 "k8s.io/api/core/v1" + "k8s.io/client-go/informers" + "k8s.io/client-go/tools/events" + + clientset "k8s.io/client-go/kubernetes" + "sigs.k8s.io/descheduler/pkg/descheduler/evictions" + podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" + frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" + "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" +) + +func InitFrameworkHandle( + ctx context.Context, + client clientset.Interface, + evictionOptions *evictions.Options, + defaultEvictorArgs defaultevictor.DefaultEvictorArgs, + getPodsAssignedToNodeSorter func([]*v1.Pod), +) (*frameworkfake.HandleImpl, *evictions.PodEvictor, error) { + sharedInformerFactory := informers.NewSharedInformerFactory(client, 0) + podInformer := sharedInformerFactory.Core().V1().Pods().Informer() + podsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) + if err != nil { + return nil, nil, fmt.Errorf("Build get pods assigned to node function error: %v", err) + } + + var getPodsAssignedToNode func(s string, filterFunc podutil.FilterFunc) ([]*v1.Pod, error) + if getPodsAssignedToNodeSorter != nil { + getPodsAssignedToNode = func(s string, filterFunc podutil.FilterFunc) ([]*v1.Pod, error) { + pods, err := podsAssignedToNode(s, filterFunc) + getPodsAssignedToNodeSorter(pods) + return pods, err + } + } else { + getPodsAssignedToNode = podsAssignedToNode + } + + sharedInformerFactory.Start(ctx.Done()) + sharedInformerFactory.WaitForCacheSync(ctx.Done()) + eventRecorder := &events.FakeRecorder{} + podEvictor := evictions.NewPodEvictor(client, eventRecorder, evictionOptions) + evictorFilter, err := defaultevictor.New( + &defaultEvictorArgs, + &frameworkfake.HandleImpl{ + ClientsetImpl: client, + GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, + SharedInformerFactoryImpl: sharedInformerFactory, + }, + ) + if err != nil { + return nil, nil, fmt.Errorf("Unable to initialize the plugin: %v", err) + } + return &frameworkfake.HandleImpl{ + ClientsetImpl: client, + GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, + PodEvictorImpl: podEvictor, + EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), + SharedInformerFactoryImpl: sharedInformerFactory, + }, podEvictor, nil +} diff --git a/test/e2e/e2e_duplicatepods_test.go b/test/e2e/e2e_duplicatepods_test.go index 685a2571e..92672de18 100644 --- a/test/e2e/e2e_duplicatepods_test.go +++ b/test/e2e/e2e_duplicatepods_test.go @@ -18,30 +18,34 @@ package e2e import ( "context" + "os" "strings" "testing" - "sigs.k8s.io/descheduler/pkg/api" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" - "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" - "sigs.k8s.io/descheduler/pkg/framework/plugins/removeduplicates" - frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" - appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - "k8s.io/client-go/tools/events" + componentbaseconfig "k8s.io/component-base/config" utilptr "k8s.io/utils/ptr" - "sigs.k8s.io/descheduler/pkg/descheduler/evictions" + + "sigs.k8s.io/descheduler/pkg/api" + "sigs.k8s.io/descheduler/pkg/descheduler/client" eutils "sigs.k8s.io/descheduler/pkg/descheduler/evictions/utils" + "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" + "sigs.k8s.io/descheduler/pkg/framework/plugins/removeduplicates" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" + frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" ) func TestRemoveDuplicates(t *testing.T) { ctx := context.Background() - clientSet, sharedInformerFactory, _, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, err := client.CreateClient(componentbaseconfig.ClientConnectionConfiguration{Kubeconfig: os.Getenv("KUBECONFIG")}, "") + if err != nil { + t.Errorf("Error during client creation with %v", err) + } nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) if err != nil { @@ -169,37 +173,18 @@ func TestRemoveDuplicates(t *testing.T) { t.Fatalf("Error creating eviction policy group %v", err) } - eventRecorder := &events.FakeRecorder{} - - podEvictor := evictions.NewPodEvictor(clientSet, eventRecorder, nil) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: true, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - NodeFit: false, - MinReplicas: tc.minReplicas, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, + clientSet, + nil, + defaultevictor.DefaultEvictorArgs{ + EvictLocalStoragePods: true, + MinReplicas: tc.minReplicas, }, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, + t.Fatalf("Unable to initialize a framework handle: %v", err) } plugin, err := removeduplicates.New(&removeduplicates.RemoveDuplicatesArgs{ diff --git a/test/e2e/e2e_failedpods_test.go b/test/e2e/e2e_failedpods_test.go index ac4a7cd09..b056830d9 100644 --- a/test/e2e/e2e_failedpods_test.go +++ b/test/e2e/e2e_failedpods_test.go @@ -2,6 +2,7 @@ package e2e import ( "context" + "os" "strings" "testing" "time" @@ -12,10 +13,15 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" + componentbaseconfig "k8s.io/component-base/config" utilptr "k8s.io/utils/ptr" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" + + "sigs.k8s.io/descheduler/pkg/descheduler/client" + "sigs.k8s.io/descheduler/pkg/descheduler/evictions" + eutils "sigs.k8s.io/descheduler/pkg/descheduler/evictions/utils" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" "sigs.k8s.io/descheduler/pkg/framework/plugins/removefailedpods" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/test" ) @@ -24,7 +30,12 @@ var oneHourPodLifetimeSeconds uint = 3600 func TestFailedPods(t *testing.T) { ctx := context.Background() - clientSet, sharedInformerFactory, _, getPodsAssignedToNode := initializeClient(ctx, t) + + clientSet, err := client.CreateClient(componentbaseconfig.ClientConnectionConfiguration{Kubeconfig: os.Getenv("KUBECONFIG")}, "") + if err != nil { + t.Errorf("Error during client creation with %v", err) + } + nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) if err != nil { t.Errorf("Error listing node with %v", err) @@ -75,25 +86,23 @@ func TestFailedPods(t *testing.T) { defer jobClient.Delete(ctx, job.Name, metav1.DeleteOptions{PropagationPolicy: &deletePropagationPolicy}) waitForJobPodPhase(ctx, t, clientSet, job, v1.PodFailed) - podEvictor := initPodEvictorOrFail(t, clientSet, getPodsAssignedToNode) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: true, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, + evictionPolicyGroupVersion, err := eutils.SupportEviction(clientSet) + if err != nil || len(evictionPolicyGroupVersion) == 0 { + t.Fatalf("Error detecting eviction policy group: %v", err) } - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - SharedInformerFactoryImpl: sharedInformerFactory, + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, + clientSet, + evictions.NewOptions(). + WithPolicyGroupVersion(evictionPolicyGroupVersion), + defaultevictor.DefaultEvictorArgs{ + EvictLocalStoragePods: true, }, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } t.Logf("Running RemoveFailedPods strategy for %s", name) @@ -106,13 +115,7 @@ func TestFailedPods(t *testing.T) { LabelSelector: tc.args.LabelSelector, Namespaces: tc.args.Namespaces, }, - &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - }, + handle, ) if err != nil { t.Fatalf("Unable to initialize the plugin: %v", err) diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 1d76bc4fe..0f8b81ef2 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -41,7 +41,6 @@ import ( "k8s.io/client-go/informers" clientset "k8s.io/client-go/kubernetes" listersv1 "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/tools/events" componentbaseconfig "k8s.io/component-base/config" "k8s.io/klog/v2" utilptr "k8s.io/utils/ptr" @@ -56,12 +55,12 @@ import ( eutils "sigs.k8s.io/descheduler/pkg/descheduler/evictions/utils" nodeutil "sigs.k8s.io/descheduler/pkg/descheduler/node" podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" "sigs.k8s.io/descheduler/pkg/framework/pluginregistry" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" "sigs.k8s.io/descheduler/pkg/framework/plugins/nodeutilization" "sigs.k8s.io/descheduler/pkg/framework/plugins/podlifetime" "sigs.k8s.io/descheduler/pkg/framework/plugins/removepodshavingtoomanyrestarts" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/test" @@ -392,7 +391,6 @@ func runPodLifetimePlugin( evictDaemonSet bool, maxPodsToEvictPerNamespace *uint, labelSelector *metav1.LabelSelector, - getPodsAssignedToNode podutil.GetPodsAssignedToNodeFunc, ) { evictionPolicyGroupVersion, err := eutils.SupportEviction(clientset) if err != nil || len(evictionPolicyGroupVersion) == 0 { @@ -404,14 +402,6 @@ func runPodLifetimePlugin( t.Fatalf("%v", err) } - podEvictor := evictions.NewPodEvictor( - clientset, - &events.FakeRecorder{}, - evictions.NewOptions(). - WithPolicyGroupVersion(evictionPolicyGroupVersion). - WithMaxPodsToEvictPerNamespace(maxPodsToEvictPerNamespace), - ) - var thresholdPriority int32 if priority != nil { thresholdPriority = *priority @@ -422,26 +412,23 @@ func runPodLifetimePlugin( } } - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: false, - EvictSystemCriticalPods: evictCritical, - EvictDaemonSetPods: evictDaemonSet, - IgnorePvcPods: false, - EvictFailedBarePods: false, - PriorityThreshold: &api.PriorityThreshold{ - Value: &thresholdPriority, - }, - } - - evictorFilter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: clientset, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, + handle, _, err := frameworktesting.InitFrameworkHandle( + ctx, + clientset, + evictions.NewOptions(). + WithPolicyGroupVersion(evictionPolicyGroupVersion). + WithMaxPodsToEvictPerNamespace(maxPodsToEvictPerNamespace), + defaultevictor.DefaultEvictorArgs{ + EvictSystemCriticalPods: evictCritical, + EvictDaemonSetPods: evictDaemonSet, + PriorityThreshold: &api.PriorityThreshold{ + Value: &thresholdPriority, + }, }, + nil, ) if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) + t.Fatalf("Unable to initialize a framework handle: %v", err) } maxPodLifeTimeSeconds := uint(1) @@ -450,12 +437,7 @@ func runPodLifetimePlugin( MaxPodLifeTimeSeconds: &maxPodLifeTimeSeconds, LabelSelector: labelSelector, Namespaces: namespaces, - }, &frameworkfake.HandleImpl{ - ClientsetImpl: clientset, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - }) + }, handle) if err != nil { t.Fatalf("Unable to initialize the plugin: %v", err) } @@ -489,7 +471,7 @@ func intersectStrings(lista, listb []string) []string { func TestLowNodeUtilization(t *testing.T) { ctx := context.Background() - clientSet, sharedInformerFactory, _, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, _, getPodsAssignedToNode := initializeClient(ctx, t) nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) if err != nil { @@ -584,25 +566,26 @@ func TestLowNodeUtilization(t *testing.T) { defer deleteRC(ctx, t, clientSet, rc) waitForRCPodsRunning(ctx, t, clientSet, rc) - // Run LowNodeUtilization plugin - podEvictor := initPodEvictorOrFail(t, clientSet, getPodsAssignedToNode) - - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: true, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, + evictionPolicyGroupVersion, err := eutils.SupportEviction(clientSet) + if err != nil || len(evictionPolicyGroupVersion) == 0 { + t.Fatalf("Error detecting eviction policy group: %v", err) } - evictorFilter, _ := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, + handle, _, err := frameworktesting.InitFrameworkHandle( + ctx, + clientSet, + evictions.NewOptions(). + WithPolicyGroupVersion(evictionPolicyGroupVersion), + defaultevictor.DefaultEvictorArgs{ + EvictLocalStoragePods: true, }, + nil, ) + if err != nil { + t.Fatalf("Unable to initialize a framework handle: %v", err) + } - podFilter, err := podutil.NewOptions().WithFilter(evictorFilter.(frameworktypes.EvictorPlugin).Filter).BuildFilterFunc() + podFilter, err := podutil.NewOptions().WithFilter(handle.EvictorFilterImpl.Filter).BuildFilterFunc() if err != nil { t.Errorf("Error initializing pod filter function, %v", err) } @@ -614,14 +597,6 @@ func TestLowNodeUtilization(t *testing.T) { podsBefore := len(podsOnMosttUtilizedNode) t.Log("Running LowNodeUtilization plugin") - handle := &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin), - SharedInformerFactoryImpl: sharedInformerFactory, - } - plugin, err := nodeutilization.NewLowNodeUtilization(&nodeutilization.LowNodeUtilizationArgs{ Thresholds: api.ResourceThresholds{ v1.ResourceCPU: 70, @@ -637,7 +612,7 @@ func TestLowNodeUtilization(t *testing.T) { waitForTerminatingPodsToDisappear(ctx, t, clientSet, rc.Namespace) - podFilter, err = podutil.NewOptions().WithFilter(evictorFilter.(frameworktypes.EvictorPlugin).Filter).BuildFilterFunc() + podFilter, err = podutil.NewOptions().WithFilter(handle.EvictorFilterImpl.Filter).BuildFilterFunc() if err != nil { t.Errorf("Error initializing pod filter function, %v", err) } @@ -659,7 +634,7 @@ func TestLowNodeUtilization(t *testing.T) { func TestNamespaceConstraintsInclude(t *testing.T) { ctx := context.Background() - clientSet, _, nodeInformer, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeInformer, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -693,7 +668,7 @@ func TestNamespaceConstraintsInclude(t *testing.T) { t.Logf("run the plugin to delete pods from %v namespace", rc.Namespace) runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, &deschedulerapi.Namespaces{ Include: []string{rc.Namespace}, - }, "", nil, false, false, nil, nil, getPodsAssignedToNode) + }, "", nil, false, false, nil, nil) // All pods are supposed to be deleted, wait until all the old pods are deleted if err := wait.PollUntilContextTimeout(ctx, time.Second, 20*time.Second, true, func(ctx context.Context) (bool, error) { @@ -729,7 +704,7 @@ func TestNamespaceConstraintsInclude(t *testing.T) { func TestNamespaceConstraintsExclude(t *testing.T) { ctx := context.Background() - clientSet, _, nodeInformer, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeInformer, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -763,7 +738,7 @@ func TestNamespaceConstraintsExclude(t *testing.T) { t.Logf("run the plugin to delete pods from namespaces except the %v namespace", rc.Namespace) runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, &deschedulerapi.Namespaces{ Exclude: []string{rc.Namespace}, - }, "", nil, false, false, nil, nil, getPodsAssignedToNode) + }, "", nil, false, false, nil, nil) t.Logf("Waiting 10s") time.Sleep(10 * time.Second) @@ -795,7 +770,7 @@ func testEvictSystemCritical(t *testing.T, isPriorityClass bool) { lowPriority := int32(500) ctx := context.Background() - clientSet, _, nodeInformer, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeInformer, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -875,9 +850,9 @@ func testEvictSystemCritical(t *testing.T, isPriorityClass bool) { t.Logf("Existing pods: %v", initialPodNames) if isPriorityClass { - runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, highPriorityClass.Name, nil, true, false, nil, nil, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, highPriorityClass.Name, nil, true, false, nil, nil) } else { - runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", &highPriority, true, false, nil, nil, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", &highPriority, true, false, nil, nil) } // All pods are supposed to be deleted, wait until all pods in the test namespace are terminating @@ -918,7 +893,7 @@ func TestEvictDaemonSetPod(t *testing.T) { func testEvictDaemonSetPod(t *testing.T, isDaemonSet bool) { ctx := context.Background() - clientSet, _, nodeInformer, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeInformer, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -945,7 +920,7 @@ func testEvictDaemonSetPod(t *testing.T, isDaemonSet bool) { sort.Strings(initialPodNames) t.Logf("Existing pods: %v", initialPodNames) - runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", nil, false, isDaemonSet, nil, nil, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", nil, false, isDaemonSet, nil, nil) // All pods are supposed to be deleted, wait until all pods in the test namespace are terminating t.Logf("All daemonset pods in the test namespace, will be deleted") @@ -991,7 +966,7 @@ func testPriority(t *testing.T, isPriorityClass bool) { lowPriority := int32(500) ctx := context.Background() - clientSet, _, nodeInformer, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeInformer, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -1060,10 +1035,10 @@ func testPriority(t *testing.T, isPriorityClass bool) { if isPriorityClass { t.Logf("run the plugin to delete pods with priority lower than priority class %s", highPriorityClass.Name) - runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, highPriorityClass.Name, nil, false, false, nil, nil, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, highPriorityClass.Name, nil, false, false, nil, nil) } else { t.Logf("run the plugin to delete pods with priority lower than %d", highPriority) - runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", &highPriority, false, false, nil, nil, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", &highPriority, false, false, nil, nil) } t.Logf("Waiting 10s") @@ -1119,7 +1094,7 @@ func testPriority(t *testing.T, isPriorityClass bool) { func TestPodLabelSelector(t *testing.T) { ctx := context.Background() - clientSet, _, nodeInformer, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeInformer, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -1166,7 +1141,7 @@ func TestPodLabelSelector(t *testing.T) { t.Logf("Pods not expected to be evicted: %v, pods expected to be evicted: %v", expectReservePodNames, expectEvictPodNames) t.Logf("run the plugin to delete pods with label test:podlifetime-evict") - runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", nil, false, false, nil, &metav1.LabelSelector{MatchLabels: map[string]string{"test": "podlifetime-evict"}}, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, nil, "", nil, false, false, nil, &metav1.LabelSelector{MatchLabels: map[string]string{"test": "podlifetime-evict"}}) t.Logf("Waiting 10s") time.Sleep(10 * time.Second) @@ -1221,7 +1196,7 @@ func TestPodLabelSelector(t *testing.T) { func TestEvictAnnotation(t *testing.T) { ctx := context.Background() - clientSet, _, nodeLister, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeLister, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -1265,7 +1240,7 @@ func TestEvictAnnotation(t *testing.T) { t.Logf("Existing pods: %v", initialPodNames) t.Log("Running PodLifetime plugin") - runPodLifetimePlugin(ctx, t, clientSet, nodeLister, nil, "", nil, false, false, nil, nil, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeLister, nil, "", nil, false, false, nil, nil) if err := wait.PollUntilContextTimeout(ctx, 5*time.Second, time.Minute, true, func(ctx context.Context) (bool, error) { podList, err = clientSet.CoreV1().Pods(rc.Namespace).List(ctx, metav1.ListOptions{LabelSelector: labels.SelectorFromSet(rc.Spec.Template.Labels).String()}) @@ -1292,7 +1267,7 @@ func TestEvictAnnotation(t *testing.T) { func TestPodLifeTimeOldestEvicted(t *testing.T) { ctx := context.Background() - clientSet, _, nodeLister, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, _, nodeLister, _ := initializeClient(ctx, t) testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}} if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { @@ -1330,7 +1305,7 @@ func TestPodLifeTimeOldestEvicted(t *testing.T) { t.Log("Running PodLifetime plugin with maxPodsToEvictPerNamespace=1 to ensure only the oldest pod is evicted") var maxPodsToEvictPerNamespace uint = 1 - runPodLifetimePlugin(ctx, t, clientSet, nodeLister, nil, "", nil, false, false, &maxPodsToEvictPerNamespace, nil, getPodsAssignedToNode) + runPodLifetimePlugin(ctx, t, clientSet, nodeLister, nil, "", nil, false, false, &maxPodsToEvictPerNamespace, nil) t.Log("Finished PodLifetime plugin") t.Logf("Wait for terminating pod to disappear") @@ -1781,21 +1756,6 @@ func splitNodesAndWorkerNodes(nodes []v1.Node) ([]*v1.Node, []*v1.Node) { return allNodes, workerNodes } -func initPodEvictorOrFail(t *testing.T, clientSet clientset.Interface, getPodsAssignedToNode podutil.GetPodsAssignedToNodeFunc) *evictions.PodEvictor { - evictionPolicyGroupVersion, err := eutils.SupportEviction(clientSet) - if err != nil || len(evictionPolicyGroupVersion) == 0 { - t.Fatalf("Error creating eviction policy group: %v", err) - } - - eventRecorder := &events.FakeRecorder{} - - return evictions.NewPodEvictor( - clientSet, - eventRecorder, - evictions.NewOptions().WithPolicyGroupVersion(evictionPolicyGroupVersion), - ) -} - func getCurrentPodNames(t *testing.T, ctx context.Context, kubeClient clientset.Interface, namespace string) []string { podList, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{}) if err != nil { diff --git a/test/e2e/e2e_topologyspreadconstraint_test.go b/test/e2e/e2e_topologyspreadconstraint_test.go index 6ecc347ae..7de8070ae 100644 --- a/test/e2e/e2e_topologyspreadconstraint_test.go +++ b/test/e2e/e2e_topologyspreadconstraint_test.go @@ -3,6 +3,7 @@ package e2e import ( "context" "math" + "os" "strings" "testing" @@ -10,9 +11,14 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - frameworkfake "sigs.k8s.io/descheduler/pkg/framework/fake" + componentbaseconfig "k8s.io/component-base/config" + + "sigs.k8s.io/descheduler/pkg/descheduler/client" + "sigs.k8s.io/descheduler/pkg/descheduler/evictions" + eutils "sigs.k8s.io/descheduler/pkg/descheduler/evictions/utils" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" "sigs.k8s.io/descheduler/pkg/framework/plugins/removepodsviolatingtopologyspreadconstraint" + frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" "sigs.k8s.io/descheduler/test" ) @@ -21,7 +27,10 @@ const zoneTopologyKey string = "topology.kubernetes.io/zone" func TestTopologySpreadConstraint(t *testing.T) { ctx := context.Background() - clientSet, _, _, getPodsAssignedToNode := initializeClient(ctx, t) + clientSet, err := client.CreateClient(componentbaseconfig.ClientConnectionConfiguration{Kubeconfig: os.Getenv("KUBECONFIG")}, "") + if err != nil { + t.Errorf("Error during client creation with %v", err) + } nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) if err != nil { @@ -138,38 +147,32 @@ func TestTopologySpreadConstraint(t *testing.T) { defer test.DeleteDeployment(ctx, t, clientSet, violatorDeployment) test.WaitForDeploymentPodsRunning(ctx, t, clientSet, violatorDeployment) - podEvictor := initPodEvictorOrFail(t, clientSet, getPodsAssignedToNode) + evictionPolicyGroupVersion, err := eutils.SupportEviction(clientSet) + if err != nil || len(evictionPolicyGroupVersion) == 0 { + t.Fatalf("Error detecting eviction policy group: %v", err) + } + + handle, podEvictor, err := frameworktesting.InitFrameworkHandle( + ctx, + clientSet, + evictions.NewOptions(). + WithPolicyGroupVersion(evictionPolicyGroupVersion), + defaultevictor.DefaultEvictorArgs{ + EvictLocalStoragePods: true, + }, + nil, + ) + if err != nil { + t.Fatalf("Unable to initialize a framework handle: %v", err) + } // Run TopologySpreadConstraint strategy t.Logf("Running RemovePodsViolatingTopologySpreadConstraint strategy for %s", name) - defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ - EvictLocalStoragePods: true, - EvictSystemCriticalPods: false, - IgnorePvcPods: false, - EvictFailedBarePods: false, - } - - filter, err := defaultevictor.New( - defaultevictorArgs, - &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - }, - ) - if err != nil { - t.Fatalf("Unable to initialize the plugin: %v", err) - } - plugin, err := removepodsviolatingtopologyspreadconstraint.New(&removepodsviolatingtopologyspreadconstraint.RemovePodsViolatingTopologySpreadConstraintArgs{ Constraints: []v1.UnsatisfiableConstraintAction{tc.topologySpreadConstraint.WhenUnsatisfiable}, }, - &frameworkfake.HandleImpl{ - ClientsetImpl: clientSet, - PodEvictorImpl: podEvictor, - EvictorFilterImpl: filter.(frameworktypes.EvictorPlugin), - GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, - }, + handle, ) if err != nil { t.Fatalf("Unable to initialize the plugin: %v", err)