1
0
mirror of https://github.com/kubernetes-sigs/descheduler.git synced 2026-01-28 06:29:29 +01:00

Merge pull request #1483 from ingvagabund/dedup-framework-init

tests: de-duplicate framework handle initialization
This commit is contained in:
Kubernetes Prow Robot
2024-08-14 01:20:26 -07:00
committed by GitHub
16 changed files with 308 additions and 804 deletions

View File

@@ -25,16 +25,13 @@ import (
policy "k8s.io/api/policy/v1" policy "k8s.io/api/policy/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
core "k8s.io/client-go/testing" core "k8s.io/client-go/testing"
"k8s.io/client-go/tools/events"
"sigs.k8s.io/descheduler/pkg/api" "sigs.k8s.io/descheduler/pkg/api"
"sigs.k8s.io/descheduler/pkg/descheduler/evictions" "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" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/pkg/utils"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
@@ -450,20 +447,16 @@ func TestHighNodeUtilization(t *testing.T) {
for _, pod := range testCase.pods { for _, pod := range testCase.pods {
objs = append(objs, pod) 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{}) podsForEviction := make(map[string]struct{})
for _, pod := range testCase.evictedPods { for _, pod := range testCase.evictedPods {
podsForEviction[pod] = struct{}{} 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 evictionFailed := false
if len(testCase.evictedPods) > 0 { 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{ plugin, err := NewHighNodeUtilization(&HighNodeUtilizationArgs{
Thresholds: testCase.thresholds, Thresholds: testCase.thresholds,
}, },
@@ -616,50 +574,16 @@ func TestHighNodeUtilizationWithTaints(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) 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(
if err != nil { ctx,
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, fakeClient,
eventRecorder,
evictions.NewOptions().WithMaxPodsToEvictPerNode(&item.evictionsExpected), evictions.NewOptions().WithMaxPodsToEvictPerNode(&item.evictionsExpected),
) defaultevictor.DefaultEvictorArgs{},
nil,
defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{
EvictLocalStoragePods: false,
EvictSystemCriticalPods: false,
IgnorePvcPods: false,
EvictFailedBarePods: false,
}
evictorFilter, err := defaultevictor.New(
defaultevictorArgs,
&frameworkfake.HandleImpl{
ClientsetImpl: fakeClient,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
SharedInformerFactoryImpl: sharedInformerFactory,
},
) )
if err != 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,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
} }
plugin, err := NewHighNodeUtilization(&HighNodeUtilizationArgs{ plugin, err := NewHighNodeUtilization(&HighNodeUtilizationArgs{

View File

@@ -22,21 +22,18 @@ import (
"testing" "testing"
"sigs.k8s.io/descheduler/pkg/api" "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/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
policy "k8s.io/api/policy/v1" policy "k8s.io/api/policy/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
core "k8s.io/client-go/testing" core "k8s.io/client-go/testing"
"k8s.io/client-go/tools/events"
"sigs.k8s.io/descheduler/pkg/descheduler/evictions" "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/pkg/utils"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -869,14 +866,6 @@ func TestLowNodeUtilization(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) 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{}) podsForEviction := make(map[string]struct{})
for _, pod := range tc.evictedPods { for _, pod := range tc.evictedPods {
podsForEviction[pod] = struct{}{} podsForEviction[pod] = struct{}{}
@@ -898,39 +887,9 @@ func TestLowNodeUtilization(t *testing.T) {
}) })
} }
sharedInformerFactory.Start(ctx.Done()) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{NodeFit: true}, nil)
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,
},
)
if err != 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,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
} }
plugin, err := NewLowNodeUtilization(&LowNodeUtilizationArgs{ plugin, err := NewLowNodeUtilization(&LowNodeUtilizationArgs{
@@ -1076,51 +1035,16 @@ func TestLowNodeUtilizationWithTaints(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) 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(
if err != nil { ctx,
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, fakeClient,
eventRecorder,
evictions.NewOptions().WithMaxPodsToEvictPerNode(&item.evictionsExpected), evictions.NewOptions().WithMaxPodsToEvictPerNode(&item.evictionsExpected),
) defaultevictor.DefaultEvictorArgs{NodeFit: true},
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,
},
) )
if err != 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,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
} }
plugin, err := NewLowNodeUtilization(&LowNodeUtilizationArgs{ plugin, err := NewLowNodeUtilization(&LowNodeUtilizationArgs{

View File

@@ -24,15 +24,12 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/events"
utilptr "k8s.io/utils/ptr" utilptr "k8s.io/utils/ptr"
"sigs.k8s.io/descheduler/pkg/descheduler/evictions" "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" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -632,53 +629,21 @@ func TestPodLifeTime(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
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(
fakeClient, fakeClient,
eventRecorder,
evictions.NewOptions(). evictions.NewOptions().
WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode).
WithMaxPodsToEvictPerNamespace(tc.maxPodsToEvictPerNamespace). WithMaxPodsToEvictPerNamespace(tc.maxPodsToEvictPerNamespace).
WithMaxPodsToEvictTotal(tc.maxPodsToEvictTotal), WithMaxPodsToEvictTotal(tc.maxPodsToEvictTotal),
) defaultevictor.DefaultEvictorArgs{IgnorePvcPods: tc.ignorePvcPods},
nil,
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,
},
) )
if err != 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{ plugin, err := New(tc.args, handle)
ClientsetImpl: fakeClient,
PodEvictorImpl: podEvictor,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
})
if err != nil { if err != nil {
t.Fatalf("Unable to initialize the plugin: %v", err) t.Fatalf("Unable to initialize the plugin: %v", err)
} }

View File

@@ -20,20 +20,15 @@ import (
"context" "context"
"testing" "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" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
"sigs.k8s.io/descheduler/pkg/descheduler/evictions" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" 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/pkg/utils"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -299,46 +294,9 @@ func TestFindDuplicatePods(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{NodeFit: testCase.nodefit}, nil)
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
if err != nil { 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)
}
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,
} }
plugin, err := New(&RemoveDuplicatesArgs{ plugin, err := New(&RemoveDuplicatesArgs{
@@ -739,46 +697,9 @@ func TestRemoveDuplicatesUniformly(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{}, nil)
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
if err != nil { 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)
}
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,
} }
plugin, err := New(&RemoveDuplicatesArgs{}, plugin, err := New(&RemoveDuplicatesArgs{},

View File

@@ -23,15 +23,11 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/events"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" 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" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -361,39 +357,9 @@ func TestRemoveFailedPods(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(ctx, fakeClient, nil, defaultevictor.DefaultEvictorArgs{NodeFit: tc.nodeFit}, nil)
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
if err != nil { 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)
}
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)
} }
plugin, err := New(&RemoveFailedPodsArgs{ plugin, err := New(&RemoveFailedPodsArgs{
@@ -405,13 +371,7 @@ func TestRemoveFailedPods(t *testing.T) {
LabelSelector: tc.args.LabelSelector, LabelSelector: tc.args.LabelSelector,
Namespaces: tc.args.Namespaces, Namespaces: tc.args.Namespaces,
}, },
&frameworkfake.HandleImpl{ handle,
ClientsetImpl: fakeClient,
PodEvictorImpl: podEvictor,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
},
) )
if err != nil { if err != nil {
t.Fatalf("Unable to initialize the plugin: %v", err) t.Fatalf("Unable to initialize the plugin: %v", err)

View File

@@ -24,14 +24,11 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/events"
"sigs.k8s.io/descheduler/pkg/descheduler/evictions" "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" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -330,56 +327,22 @@ func TestRemovePodsHavingTooManyRestarts(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
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(
fakeClient, fakeClient,
eventRecorder,
evictions.NewOptions(). evictions.NewOptions().
WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode).
WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace), WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace),
) defaultevictor.DefaultEvictorArgs{NodeFit: tc.nodeFit},
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 { 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( plugin, err := New(
&tc.args, &tc.args,
&frameworkfake.HandleImpl{ handle)
ClientsetImpl: fakeClient,
PodEvictorImpl: podEvictor,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
})
if err != nil { if err != nil {
t.Fatalf("Unable to initialize the plugin: %v", err) t.Fatalf("Unable to initialize the plugin: %v", err)
} }

View File

@@ -23,15 +23,12 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "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" "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" "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/pkg/utils"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -228,55 +225,20 @@ func TestPodAntiAffinity(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
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(
fakeClient, fakeClient,
eventRecorder,
evictions.NewOptions(). evictions.NewOptions().
WithMaxPodsToEvictPerNode(test.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNode(test.maxPodsToEvictPerNode).
WithMaxPodsToEvictPerNamespace(test.maxNoOfPodsToEvictPerNamespace). WithMaxPodsToEvictPerNamespace(test.maxNoOfPodsToEvictPerNamespace).
WithMaxPodsToEvictTotal(test.maxNoOfPodsToEvictTotal), WithMaxPodsToEvictTotal(test.maxNoOfPodsToEvictTotal),
) defaultevictor.DefaultEvictorArgs{NodeFit: test.nodeFit},
nil,
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,
},
) )
if err != 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( plugin, err := New(
&RemovePodsViolatingInterPodAntiAffinityArgs{}, &RemovePodsViolatingInterPodAntiAffinityArgs{},
handle, handle,

View File

@@ -23,15 +23,12 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "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" "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" "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" "sigs.k8s.io/descheduler/test"
) )
@@ -357,54 +354,18 @@ func TestRemovePodsViolatingNodeAffinity(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
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(
fakeClient, fakeClient,
eventRecorder,
evictions.NewOptions(). evictions.NewOptions().
WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode).
WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace). WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace).
WithMaxPodsToEvictTotal(tc.maxNoOfPodsToEvictTotal), WithMaxPodsToEvictTotal(tc.maxNoOfPodsToEvictTotal),
) defaultevictor.DefaultEvictorArgs{NodeFit: tc.nodefit},
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 { 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( plugin, err := New(

View File

@@ -24,14 +24,11 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/events"
"sigs.k8s.io/descheduler/pkg/descheduler/evictions" "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" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/pkg/utils"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
@@ -410,54 +407,22 @@ func TestDeletePodsViolatingNodeTaints(t *testing.T) {
} }
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
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(
fakeClient, fakeClient,
eventRecorder,
evictions.NewOptions(). evictions.NewOptions().
WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode). WithMaxPodsToEvictPerNode(tc.maxPodsToEvictPerNode).
WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace). WithMaxPodsToEvictPerNamespace(tc.maxNoOfPodsToEvictPerNamespace).
WithMaxPodsToEvictTotal(tc.maxNoOfPodsToEvictTotal), WithMaxPodsToEvictTotal(tc.maxNoOfPodsToEvictTotal),
) defaultevictor.DefaultEvictorArgs{
EvictLocalStoragePods: tc.evictLocalStoragePods,
defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ EvictSystemCriticalPods: tc.evictSystemCriticalPods,
EvictLocalStoragePods: tc.evictLocalStoragePods, NodeFit: tc.nodeFit,
EvictSystemCriticalPods: tc.evictSystemCriticalPods,
IgnorePvcPods: false,
EvictFailedBarePods: false,
NodeFit: tc.nodeFit,
}
evictorFilter, err := defaultevictor.New(
defaultevictorArgs,
&frameworkfake.HandleImpl{
ClientsetImpl: fakeClient,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
SharedInformerFactoryImpl: sharedInformerFactory,
}, },
nil,
) )
if err != 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,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
} }
plugin, err := New(&RemovePodsViolatingNodeTaintsArgs{ plugin, err := New(&RemovePodsViolatingNodeTaintsArgs{

View File

@@ -12,17 +12,13 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
core "k8s.io/client-go/testing" core "k8s.io/client-go/testing"
"k8s.io/client-go/tools/events"
utilptr "k8s.io/utils/ptr" utilptr "k8s.io/utils/ptr"
"sigs.k8s.io/descheduler/pkg/api" "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" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -1419,27 +1415,22 @@ func TestTopologySpreadConstraint(t *testing.T) {
objs = append(objs, &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "ns1"}}) objs = append(objs, &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "ns1"}})
fakeClient := fake.NewSimpleClientset(objs...) fakeClient := fake.NewSimpleClientset(objs...)
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
fakeClient,
podsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) 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 { 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 var evictedPods []string
fakeClient.PrependReactor("create", "pods", func(action core.Action) (bool, runtime.Object, error) { fakeClient.PrependReactor("create", "pods", func(action core.Action) (bool, runtime.Object, error) {
if action.GetSubresource() == "eviction" { if action.GetSubresource() == "eviction" {
@@ -1454,38 +1445,6 @@ func TestTopologySpreadConstraint(t *testing.T) {
return false, nil, nil // fallback to the default reactor 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) SetDefaults_RemovePodsViolatingTopologySpreadConstraintArgs(&tc.args)
plugin, err := New( plugin, err := New(

View File

@@ -13,18 +13,16 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/informers"
fakeclientset "k8s.io/client-go/kubernetes/fake" fakeclientset "k8s.io/client-go/kubernetes/fake"
core "k8s.io/client-go/testing" core "k8s.io/client-go/testing"
"sigs.k8s.io/descheduler/pkg/api" "sigs.k8s.io/descheduler/pkg/api"
"sigs.k8s.io/descheduler/pkg/descheduler/evictions" "sigs.k8s.io/descheduler/pkg/descheduler/evictions"
podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod"
fakeplugin "sigs.k8s.io/descheduler/pkg/framework/fake/plugin" fakeplugin "sigs.k8s.io/descheduler/pkg/framework/fake/plugin"
"sigs.k8s.io/descheduler/pkg/framework/pluginregistry" "sigs.k8s.io/descheduler/pkg/framework/pluginregistry"
"sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/pkg/utils"
testutils "sigs.k8s.io/descheduler/test" testutils "sigs.k8s.io/descheduler/test"
) )
@@ -232,29 +230,24 @@ func TestProfileDescheduleBalanceExtensionPointsEviction(t *testing.T) {
var evictedPods []string var evictedPods []string
client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods)) client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods))
sharedInformerFactory := informers.NewSharedInformerFactory(client, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) client,
nil,
defaultevictor.DefaultEvictorArgs{},
nil,
)
if err != 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( prfl, err := NewProfile(
test.config, test.config,
pluginregistry.PluginRegistry, pluginregistry.PluginRegistry,
WithClientSet(client), WithClientSet(client),
WithSharedInformerFactory(sharedInformerFactory), WithSharedInformerFactory(handle.SharedInformerFactoryImpl),
WithPodEvictor(podEvictor), WithPodEvictor(podEvictor),
WithGetPodsAssignedToNodeFnc(getPodsAssignedToNode), WithGetPodsAssignedToNodeFnc(handle.GetPodsAssignedToNodeFuncImpl),
) )
if err != nil { if err != nil {
t.Fatalf("unable to create %q profile: %v", test.config.Name, err) t.Fatalf("unable to create %q profile: %v", test.config.Name, err)
@@ -380,22 +373,17 @@ func TestProfileExtensionPoints(t *testing.T) {
var evictedPods []string var evictedPods []string
client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods)) client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods))
sharedInformerFactory := informers.NewSharedInformerFactory(client, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) client,
nil,
defaultevictor.DefaultEvictorArgs{},
nil,
)
if err != 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( prfl, err := NewProfile(
api.DeschedulerProfile{ api.DeschedulerProfile{
Name: "strategy-test-profile", Name: "strategy-test-profile",
@@ -435,9 +423,9 @@ func TestProfileExtensionPoints(t *testing.T) {
}, },
pluginregistry.PluginRegistry, pluginregistry.PluginRegistry,
WithClientSet(client), WithClientSet(client),
WithSharedInformerFactory(sharedInformerFactory), WithSharedInformerFactory(handle.SharedInformerFactoryImpl),
WithPodEvictor(podEvictor), WithPodEvictor(podEvictor),
WithGetPodsAssignedToNodeFnc(getPodsAssignedToNode), WithGetPodsAssignedToNodeFnc(handle.GetPodsAssignedToNodeFuncImpl),
) )
if err != nil { if err != nil {
t.Fatalf("unable to create profile: %v", err) t.Fatalf("unable to create profile: %v", err)
@@ -592,22 +580,17 @@ func TestProfileExtensionPointOrdering(t *testing.T) {
var evictedPods []string var evictedPods []string
client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods)) client.PrependReactor("create", "pods", podEvictionReactionFuc(&evictedPods))
sharedInformerFactory := informers.NewSharedInformerFactory(client, 0) handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
podInformer := sharedInformerFactory.Core().V1().Pods().Informer() ctx,
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer) client,
nil,
defaultevictor.DefaultEvictorArgs{},
nil,
)
if err != 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( prfl, err := NewProfile(
api.DeschedulerProfile{ api.DeschedulerProfile{
Name: "strategy-test-profile", Name: "strategy-test-profile",
@@ -662,9 +645,9 @@ func TestProfileExtensionPointOrdering(t *testing.T) {
}, },
pluginregistry.PluginRegistry, pluginregistry.PluginRegistry,
WithClientSet(client), WithClientSet(client),
WithSharedInformerFactory(sharedInformerFactory), WithSharedInformerFactory(handle.SharedInformerFactoryImpl),
WithPodEvictor(podEvictor), WithPodEvictor(podEvictor),
WithGetPodsAssignedToNodeFnc(getPodsAssignedToNode), WithGetPodsAssignedToNodeFnc(handle.GetPodsAssignedToNodeFuncImpl),
) )
if err != nil { if err != nil {
t.Fatalf("unable to create profile: %v", err) t.Fatalf("unable to create profile: %v", err)

View File

@@ -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
}

View File

@@ -18,30 +18,34 @@ package e2e
import ( import (
"context" "context"
"os"
"strings" "strings"
"testing" "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" appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/tools/events" componentbaseconfig "k8s.io/component-base/config"
utilptr "k8s.io/utils/ptr" 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" 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) { func TestRemoveDuplicates(t *testing.T) {
ctx := context.Background() 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{}) nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
if err != nil { if err != nil {
@@ -169,37 +173,18 @@ func TestRemoveDuplicates(t *testing.T) {
t.Fatalf("Error creating eviction policy group %v", err) t.Fatalf("Error creating eviction policy group %v", err)
} }
eventRecorder := &events.FakeRecorder{} handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
ctx,
podEvictor := evictions.NewPodEvictor(clientSet, eventRecorder, nil) clientSet,
nil,
defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ defaultevictor.DefaultEvictorArgs{
EvictLocalStoragePods: true, EvictLocalStoragePods: true,
EvictSystemCriticalPods: false, MinReplicas: tc.minReplicas,
IgnorePvcPods: false,
EvictFailedBarePods: false,
NodeFit: false,
MinReplicas: tc.minReplicas,
}
evictorFilter, err := defaultevictor.New(
defaultevictorArgs,
&frameworkfake.HandleImpl{
ClientsetImpl: clientSet,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
SharedInformerFactoryImpl: sharedInformerFactory,
}, },
nil,
) )
if err != 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: clientSet,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
PodEvictorImpl: podEvictor,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
} }
plugin, err := removeduplicates.New(&removeduplicates.RemoveDuplicatesArgs{ plugin, err := removeduplicates.New(&removeduplicates.RemoveDuplicatesArgs{

View File

@@ -2,6 +2,7 @@ package e2e
import ( import (
"context" "context"
"os"
"strings" "strings"
"testing" "testing"
"time" "time"
@@ -12,10 +13,15 @@ import (
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
componentbaseconfig "k8s.io/component-base/config"
utilptr "k8s.io/utils/ptr" 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/defaultevictor"
"sigs.k8s.io/descheduler/pkg/framework/plugins/removefailedpods" "sigs.k8s.io/descheduler/pkg/framework/plugins/removefailedpods"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -24,7 +30,12 @@ var oneHourPodLifetimeSeconds uint = 3600
func TestFailedPods(t *testing.T) { func TestFailedPods(t *testing.T) {
ctx := context.Background() 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{}) nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
if err != nil { if err != nil {
t.Errorf("Error listing node with %v", err) 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}) defer jobClient.Delete(ctx, job.Name, metav1.DeleteOptions{PropagationPolicy: &deletePropagationPolicy})
waitForJobPodPhase(ctx, t, clientSet, job, v1.PodFailed) waitForJobPodPhase(ctx, t, clientSet, job, v1.PodFailed)
podEvictor := initPodEvictorOrFail(t, clientSet, getPodsAssignedToNode) evictionPolicyGroupVersion, err := eutils.SupportEviction(clientSet)
if err != nil || len(evictionPolicyGroupVersion) == 0 {
defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ t.Fatalf("Error detecting eviction policy group: %v", err)
EvictLocalStoragePods: true,
EvictSystemCriticalPods: false,
IgnorePvcPods: false,
EvictFailedBarePods: false,
} }
evictorFilter, err := defaultevictor.New( handle, podEvictor, err := frameworktesting.InitFrameworkHandle(
defaultevictorArgs, ctx,
&frameworkfake.HandleImpl{ clientSet,
ClientsetImpl: clientSet, evictions.NewOptions().
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, WithPolicyGroupVersion(evictionPolicyGroupVersion),
SharedInformerFactoryImpl: sharedInformerFactory, defaultevictor.DefaultEvictorArgs{
EvictLocalStoragePods: true,
}, },
nil,
) )
if err != 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) t.Logf("Running RemoveFailedPods strategy for %s", name)
@@ -106,13 +115,7 @@ func TestFailedPods(t *testing.T) {
LabelSelector: tc.args.LabelSelector, LabelSelector: tc.args.LabelSelector,
Namespaces: tc.args.Namespaces, Namespaces: tc.args.Namespaces,
}, },
&frameworkfake.HandleImpl{ handle,
ClientsetImpl: clientSet,
PodEvictorImpl: podEvictor,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
SharedInformerFactoryImpl: sharedInformerFactory,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
},
) )
if err != nil { if err != nil {
t.Fatalf("Unable to initialize the plugin: %v", err) t.Fatalf("Unable to initialize the plugin: %v", err)

View File

@@ -41,7 +41,6 @@ import (
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
listersv1 "k8s.io/client-go/listers/core/v1" listersv1 "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/tools/events"
componentbaseconfig "k8s.io/component-base/config" componentbaseconfig "k8s.io/component-base/config"
"k8s.io/klog/v2" "k8s.io/klog/v2"
utilptr "k8s.io/utils/ptr" utilptr "k8s.io/utils/ptr"
@@ -56,12 +55,12 @@ import (
eutils "sigs.k8s.io/descheduler/pkg/descheduler/evictions/utils" eutils "sigs.k8s.io/descheduler/pkg/descheduler/evictions/utils"
nodeutil "sigs.k8s.io/descheduler/pkg/descheduler/node" nodeutil "sigs.k8s.io/descheduler/pkg/descheduler/node"
podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod" 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/pluginregistry"
"sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor" "sigs.k8s.io/descheduler/pkg/framework/plugins/defaultevictor"
"sigs.k8s.io/descheduler/pkg/framework/plugins/nodeutilization" "sigs.k8s.io/descheduler/pkg/framework/plugins/nodeutilization"
"sigs.k8s.io/descheduler/pkg/framework/plugins/podlifetime" "sigs.k8s.io/descheduler/pkg/framework/plugins/podlifetime"
"sigs.k8s.io/descheduler/pkg/framework/plugins/removepodshavingtoomanyrestarts" "sigs.k8s.io/descheduler/pkg/framework/plugins/removepodshavingtoomanyrestarts"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/pkg/utils" "sigs.k8s.io/descheduler/pkg/utils"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
@@ -392,7 +391,6 @@ func runPodLifetimePlugin(
evictDaemonSet bool, evictDaemonSet bool,
maxPodsToEvictPerNamespace *uint, maxPodsToEvictPerNamespace *uint,
labelSelector *metav1.LabelSelector, labelSelector *metav1.LabelSelector,
getPodsAssignedToNode podutil.GetPodsAssignedToNodeFunc,
) { ) {
evictionPolicyGroupVersion, err := eutils.SupportEviction(clientset) evictionPolicyGroupVersion, err := eutils.SupportEviction(clientset)
if err != nil || len(evictionPolicyGroupVersion) == 0 { if err != nil || len(evictionPolicyGroupVersion) == 0 {
@@ -404,14 +402,6 @@ func runPodLifetimePlugin(
t.Fatalf("%v", err) t.Fatalf("%v", err)
} }
podEvictor := evictions.NewPodEvictor(
clientset,
&events.FakeRecorder{},
evictions.NewOptions().
WithPolicyGroupVersion(evictionPolicyGroupVersion).
WithMaxPodsToEvictPerNamespace(maxPodsToEvictPerNamespace),
)
var thresholdPriority int32 var thresholdPriority int32
if priority != nil { if priority != nil {
thresholdPriority = *priority thresholdPriority = *priority
@@ -422,26 +412,23 @@ func runPodLifetimePlugin(
} }
} }
defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{ handle, _, err := frameworktesting.InitFrameworkHandle(
EvictLocalStoragePods: false, ctx,
EvictSystemCriticalPods: evictCritical, clientset,
EvictDaemonSetPods: evictDaemonSet, evictions.NewOptions().
IgnorePvcPods: false, WithPolicyGroupVersion(evictionPolicyGroupVersion).
EvictFailedBarePods: false, WithMaxPodsToEvictPerNamespace(maxPodsToEvictPerNamespace),
PriorityThreshold: &api.PriorityThreshold{ defaultevictor.DefaultEvictorArgs{
Value: &thresholdPriority, EvictSystemCriticalPods: evictCritical,
}, EvictDaemonSetPods: evictDaemonSet,
} PriorityThreshold: &api.PriorityThreshold{
Value: &thresholdPriority,
evictorFilter, err := defaultevictor.New( },
defaultevictorArgs,
&frameworkfake.HandleImpl{
ClientsetImpl: clientset,
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
}, },
nil,
) )
if err != 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) maxPodLifeTimeSeconds := uint(1)
@@ -450,12 +437,7 @@ func runPodLifetimePlugin(
MaxPodLifeTimeSeconds: &maxPodLifeTimeSeconds, MaxPodLifeTimeSeconds: &maxPodLifeTimeSeconds,
LabelSelector: labelSelector, LabelSelector: labelSelector,
Namespaces: namespaces, Namespaces: namespaces,
}, &frameworkfake.HandleImpl{ }, handle)
ClientsetImpl: clientset,
PodEvictorImpl: podEvictor,
EvictorFilterImpl: evictorFilter.(frameworktypes.EvictorPlugin),
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
})
if err != nil { if err != nil {
t.Fatalf("Unable to initialize the plugin: %v", err) t.Fatalf("Unable to initialize the plugin: %v", err)
} }
@@ -489,7 +471,7 @@ func intersectStrings(lista, listb []string) []string {
func TestLowNodeUtilization(t *testing.T) { func TestLowNodeUtilization(t *testing.T) {
ctx := context.Background() ctx := context.Background()
clientSet, sharedInformerFactory, _, getPodsAssignedToNode := initializeClient(ctx, t) clientSet, _, _, getPodsAssignedToNode := initializeClient(ctx, t)
nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
if err != nil { if err != nil {
@@ -584,25 +566,26 @@ func TestLowNodeUtilization(t *testing.T) {
defer deleteRC(ctx, t, clientSet, rc) defer deleteRC(ctx, t, clientSet, rc)
waitForRCPodsRunning(ctx, t, clientSet, rc) waitForRCPodsRunning(ctx, t, clientSet, rc)
// Run LowNodeUtilization plugin evictionPolicyGroupVersion, err := eutils.SupportEviction(clientSet)
podEvictor := initPodEvictorOrFail(t, clientSet, getPodsAssignedToNode) if err != nil || len(evictionPolicyGroupVersion) == 0 {
t.Fatalf("Error detecting eviction policy group: %v", err)
defaultevictorArgs := &defaultevictor.DefaultEvictorArgs{
EvictLocalStoragePods: true,
EvictSystemCriticalPods: false,
IgnorePvcPods: false,
EvictFailedBarePods: false,
} }
evictorFilter, _ := defaultevictor.New( handle, _, err := frameworktesting.InitFrameworkHandle(
defaultevictorArgs, ctx,
&frameworkfake.HandleImpl{ clientSet,
ClientsetImpl: clientSet, evictions.NewOptions().
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode, 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 { if err != nil {
t.Errorf("Error initializing pod filter function, %v", err) t.Errorf("Error initializing pod filter function, %v", err)
} }
@@ -614,14 +597,6 @@ func TestLowNodeUtilization(t *testing.T) {
podsBefore := len(podsOnMosttUtilizedNode) podsBefore := len(podsOnMosttUtilizedNode)
t.Log("Running LowNodeUtilization plugin") 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{ plugin, err := nodeutilization.NewLowNodeUtilization(&nodeutilization.LowNodeUtilizationArgs{
Thresholds: api.ResourceThresholds{ Thresholds: api.ResourceThresholds{
v1.ResourceCPU: 70, v1.ResourceCPU: 70,
@@ -637,7 +612,7 @@ func TestLowNodeUtilization(t *testing.T) {
waitForTerminatingPodsToDisappear(ctx, t, clientSet, rc.Namespace) 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 { if err != nil {
t.Errorf("Error initializing pod filter function, %v", err) t.Errorf("Error initializing pod filter function, %v", err)
} }
@@ -659,7 +634,7 @@ func TestLowNodeUtilization(t *testing.T) {
func TestNamespaceConstraintsInclude(t *testing.T) { func TestNamespaceConstraintsInclude(t *testing.T) {
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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) t.Logf("run the plugin to delete pods from %v namespace", rc.Namespace)
runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, &deschedulerapi.Namespaces{ runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, &deschedulerapi.Namespaces{
Include: []string{rc.Namespace}, 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 // 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) { 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) { func TestNamespaceConstraintsExclude(t *testing.T) {
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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) t.Logf("run the plugin to delete pods from namespaces except the %v namespace", rc.Namespace)
runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, &deschedulerapi.Namespaces{ runPodLifetimePlugin(ctx, t, clientSet, nodeInformer, &deschedulerapi.Namespaces{
Exclude: []string{rc.Namespace}, Exclude: []string{rc.Namespace},
}, "", nil, false, false, nil, nil, getPodsAssignedToNode) }, "", nil, false, false, nil, nil)
t.Logf("Waiting 10s") t.Logf("Waiting 10s")
time.Sleep(10 * time.Second) time.Sleep(10 * time.Second)
@@ -795,7 +770,7 @@ func testEvictSystemCritical(t *testing.T, isPriorityClass bool) {
lowPriority := int32(500) lowPriority := int32(500)
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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) t.Logf("Existing pods: %v", initialPodNames)
if isPriorityClass { 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 { } 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 // 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) { func testEvictDaemonSetPod(t *testing.T, isDaemonSet bool) {
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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) sort.Strings(initialPodNames)
t.Logf("Existing pods: %v", 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 // 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") 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) lowPriority := int32(500)
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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 { if isPriorityClass {
t.Logf("run the plugin to delete pods with priority lower than priority class %s", highPriorityClass.Name) 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 { } else {
t.Logf("run the plugin to delete pods with priority lower than %d", highPriority) 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") t.Logf("Waiting 10s")
@@ -1119,7 +1094,7 @@ func testPriority(t *testing.T, isPriorityClass bool) {
func TestPodLabelSelector(t *testing.T) { func TestPodLabelSelector(t *testing.T) {
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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("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") 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") t.Logf("Waiting 10s")
time.Sleep(10 * time.Second) time.Sleep(10 * time.Second)
@@ -1221,7 +1196,7 @@ func TestPodLabelSelector(t *testing.T) {
func TestEvictAnnotation(t *testing.T) { func TestEvictAnnotation(t *testing.T) {
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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.Logf("Existing pods: %v", initialPodNames)
t.Log("Running PodLifetime plugin") 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) { 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()}) 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) { func TestPodLifeTimeOldestEvicted(t *testing.T) {
ctx := context.Background() 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())}} testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
if _, err := clientSet.CoreV1().Namespaces().Create(ctx, testNamespace, metav1.CreateOptions{}); err != nil { 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") t.Log("Running PodLifetime plugin with maxPodsToEvictPerNamespace=1 to ensure only the oldest pod is evicted")
var maxPodsToEvictPerNamespace uint = 1 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.Log("Finished PodLifetime plugin")
t.Logf("Wait for terminating pod to disappear") t.Logf("Wait for terminating pod to disappear")
@@ -1781,21 +1756,6 @@ func splitNodesAndWorkerNodes(nodes []v1.Node) ([]*v1.Node, []*v1.Node) {
return allNodes, workerNodes 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 { func getCurrentPodNames(t *testing.T, ctx context.Context, kubeClient clientset.Interface, namespace string) []string {
podList, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{}) podList, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{})
if err != nil { if err != nil {

View File

@@ -3,6 +3,7 @@ package e2e
import ( import (
"context" "context"
"math" "math"
"os"
"strings" "strings"
"testing" "testing"
@@ -10,9 +11,14 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels" "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/defaultevictor"
"sigs.k8s.io/descheduler/pkg/framework/plugins/removepodsviolatingtopologyspreadconstraint" "sigs.k8s.io/descheduler/pkg/framework/plugins/removepodsviolatingtopologyspreadconstraint"
frameworktesting "sigs.k8s.io/descheduler/pkg/framework/testing"
frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types" frameworktypes "sigs.k8s.io/descheduler/pkg/framework/types"
"sigs.k8s.io/descheduler/test" "sigs.k8s.io/descheduler/test"
) )
@@ -21,7 +27,10 @@ const zoneTopologyKey string = "topology.kubernetes.io/zone"
func TestTopologySpreadConstraint(t *testing.T) { func TestTopologySpreadConstraint(t *testing.T) {
ctx := context.Background() 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{}) nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
if err != nil { if err != nil {
@@ -138,38 +147,32 @@ func TestTopologySpreadConstraint(t *testing.T) {
defer test.DeleteDeployment(ctx, t, clientSet, violatorDeployment) defer test.DeleteDeployment(ctx, t, clientSet, violatorDeployment)
test.WaitForDeploymentPodsRunning(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 // Run TopologySpreadConstraint strategy
t.Logf("Running RemovePodsViolatingTopologySpreadConstraint strategy for %s", name) 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{ plugin, err := removepodsviolatingtopologyspreadconstraint.New(&removepodsviolatingtopologyspreadconstraint.RemovePodsViolatingTopologySpreadConstraintArgs{
Constraints: []v1.UnsatisfiableConstraintAction{tc.topologySpreadConstraint.WhenUnsatisfiable}, Constraints: []v1.UnsatisfiableConstraintAction{tc.topologySpreadConstraint.WhenUnsatisfiable},
}, },
&frameworkfake.HandleImpl{ handle,
ClientsetImpl: clientSet,
PodEvictorImpl: podEvictor,
EvictorFilterImpl: filter.(frameworktypes.EvictorPlugin),
GetPodsAssignedToNodeFuncImpl: getPodsAssignedToNode,
},
) )
if err != nil { if err != nil {
t.Fatalf("Unable to initialize the plugin: %v", err) t.Fatalf("Unable to initialize the plugin: %v", err)