mirror of
https://github.com/kubernetes-sigs/descheduler.git
synced 2026-01-28 06:29:29 +01:00
fix sharedInformerFactory register
This commit is contained in:
@@ -29,10 +29,10 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
corev1informers "k8s.io/client-go/informers/core/v1"
|
|
||||||
schedulingv1informers "k8s.io/client-go/informers/scheduling/v1"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
fakeclientset "k8s.io/client-go/kubernetes/fake"
|
fakeclientset "k8s.io/client-go/kubernetes/fake"
|
||||||
|
listersv1 "k8s.io/client-go/listers/core/v1"
|
||||||
|
schedulingv1 "k8s.io/client-go/listers/scheduling/v1"
|
||||||
core "k8s.io/client-go/testing"
|
core "k8s.io/client-go/testing"
|
||||||
|
|
||||||
"sigs.k8s.io/descheduler/cmd/descheduler/app/options"
|
"sigs.k8s.io/descheduler/cmd/descheduler/app/options"
|
||||||
@@ -93,10 +93,10 @@ type strategyFunction func(ctx context.Context, client clientset.Interface, stra
|
|||||||
|
|
||||||
func cachedClient(
|
func cachedClient(
|
||||||
realClient clientset.Interface,
|
realClient clientset.Interface,
|
||||||
podInformer corev1informers.PodInformer,
|
podLister listersv1.PodLister,
|
||||||
nodeInformer corev1informers.NodeInformer,
|
nodeLister listersv1.NodeLister,
|
||||||
namespaceInformer corev1informers.NamespaceInformer,
|
namespaceLister listersv1.NamespaceLister,
|
||||||
priorityClassInformer schedulingv1informers.PriorityClassInformer,
|
priorityClassLister schedulingv1.PriorityClassLister,
|
||||||
) (clientset.Interface, error) {
|
) (clientset.Interface, error) {
|
||||||
fakeClient := fakeclientset.NewSimpleClientset()
|
fakeClient := fakeclientset.NewSimpleClientset()
|
||||||
// simulate a pod eviction by deleting a pod
|
// simulate a pod eviction by deleting a pod
|
||||||
@@ -120,7 +120,7 @@ func cachedClient(
|
|||||||
})
|
})
|
||||||
|
|
||||||
klog.V(3).Infof("Pulling resources for the cached client from the cluster")
|
klog.V(3).Infof("Pulling resources for the cached client from the cluster")
|
||||||
pods, err := podInformer.Lister().List(labels.Everything())
|
pods, err := podLister.List(labels.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to list pods: %v", err)
|
return nil, fmt.Errorf("unable to list pods: %v", err)
|
||||||
}
|
}
|
||||||
@@ -131,7 +131,7 @@ func cachedClient(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes, err := nodeInformer.Lister().List(labels.Everything())
|
nodes, err := nodeLister.List(labels.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to list nodes: %v", err)
|
return nil, fmt.Errorf("unable to list nodes: %v", err)
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ func cachedClient(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespaces, err := namespaceInformer.Lister().List(labels.Everything())
|
namespaces, err := namespaceLister.List(labels.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to list namespaces: %v", err)
|
return nil, fmt.Errorf("unable to list namespaces: %v", err)
|
||||||
}
|
}
|
||||||
@@ -153,7 +153,7 @@ func cachedClient(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
priorityClasses, err := priorityClassInformer.Lister().List(labels.Everything())
|
priorityClasses, err := priorityClassLister.List(labels.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to list priorityclasses: %v", err)
|
return nil, fmt.Errorf("unable to list priorityclasses: %v", err)
|
||||||
}
|
}
|
||||||
@@ -227,18 +227,15 @@ func (hi *handleImpl) Evictor() framework.Evictor {
|
|||||||
|
|
||||||
func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer, deschedulerPolicy *api.DeschedulerPolicy, evictionPolicyGroupVersion string) error {
|
func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer, deschedulerPolicy *api.DeschedulerPolicy, evictionPolicyGroupVersion string) error {
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(rs.Client, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(rs.Client, 0)
|
||||||
nodeInformer := sharedInformerFactory.Core().V1().Nodes()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podLister := sharedInformerFactory.Core().V1().Pods().Lister()
|
||||||
namespaceInformer := sharedInformerFactory.Core().V1().Namespaces()
|
nodeLister := sharedInformerFactory.Core().V1().Nodes().Lister()
|
||||||
priorityClassInformer := sharedInformerFactory.Scheduling().V1().PriorityClasses()
|
namespaceLister := sharedInformerFactory.Core().V1().Namespaces().Lister()
|
||||||
|
priorityClassLister := sharedInformerFactory.Scheduling().V1().PriorityClasses().Lister()
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
ctx, cancel := context.WithCancel(ctx)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
// create the informers
|
|
||||||
namespaceInformer.Informer()
|
|
||||||
priorityClassInformer.Informer()
|
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("build get pods assigned to node function error: %v", err)
|
return fmt.Errorf("build get pods assigned to node function error: %v", err)
|
||||||
@@ -302,7 +299,7 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
|
|||||||
defer eventBroadcaster.Shutdown()
|
defer eventBroadcaster.Shutdown()
|
||||||
|
|
||||||
wait.NonSlidingUntil(func() {
|
wait.NonSlidingUntil(func() {
|
||||||
nodes, err := nodeutil.ReadyNodes(ctx, rs.Client, nodeInformer, nodeSelector)
|
nodes, err := nodeutil.ReadyNodes(ctx, rs.Client, nodeLister, nodeSelector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.V(1).InfoS("Unable to get ready nodes", "err", err)
|
klog.V(1).InfoS("Unable to get ready nodes", "err", err)
|
||||||
cancel()
|
cancel()
|
||||||
@@ -322,14 +319,14 @@ func RunDeschedulerStrategies(ctx context.Context, rs *options.DeschedulerServer
|
|||||||
if rs.DryRun {
|
if rs.DryRun {
|
||||||
klog.V(3).Infof("Building a cached client from the cluster for the dry run")
|
klog.V(3).Infof("Building a cached client from the cluster for the dry run")
|
||||||
// Create a new cache so we start from scratch without any leftovers
|
// Create a new cache so we start from scratch without any leftovers
|
||||||
fakeClient, err := cachedClient(rs.Client, podInformer, nodeInformer, namespaceInformer, priorityClassInformer)
|
fakeClient, err := cachedClient(rs.Client, podLister, nodeLister, namespaceLister, priorityClassLister)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Error(err)
|
klog.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fakeSharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
fakeSharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
getPodsAssignedToNode, err = podutil.BuildGetPodsAssignedToNodeFunc(fakeSharedInformerFactory.Core().V1().Pods())
|
getPodsAssignedToNode, err = podutil.BuildGetPodsAssignedToNodeFunc(fakeSharedInformerFactory.Core().V1().Pods().Informer())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Errorf("build get pods assigned to node function error: %v", err)
|
klog.Errorf("build get pods assigned to node function error: %v", err)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ import (
|
|||||||
"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"
|
||||||
coreinformers "k8s.io/client-go/informers/core/v1"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
listersv1 "k8s.io/client-go/listers/core/v1"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod"
|
podutil "sigs.k8s.io/descheduler/pkg/descheduler/pod"
|
||||||
"sigs.k8s.io/descheduler/pkg/utils"
|
"sigs.k8s.io/descheduler/pkg/utils"
|
||||||
@@ -33,7 +33,7 @@ import (
|
|||||||
|
|
||||||
// ReadyNodes returns ready nodes irrespective of whether they are
|
// ReadyNodes returns ready nodes irrespective of whether they are
|
||||||
// schedulable or not.
|
// schedulable or not.
|
||||||
func ReadyNodes(ctx context.Context, client clientset.Interface, nodeInformer coreinformers.NodeInformer, nodeSelector string) ([]*v1.Node, error) {
|
func ReadyNodes(ctx context.Context, client clientset.Interface, nodeLister listersv1.NodeLister, nodeSelector string) ([]*v1.Node, error) {
|
||||||
ns, err := labels.Parse(nodeSelector)
|
ns, err := labels.Parse(nodeSelector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []*v1.Node{}, err
|
return []*v1.Node{}, err
|
||||||
@@ -41,7 +41,7 @@ func ReadyNodes(ctx context.Context, client clientset.Interface, nodeInformer co
|
|||||||
|
|
||||||
var nodes []*v1.Node
|
var nodes []*v1.Node
|
||||||
// err is defined above
|
// err is defined above
|
||||||
if nodes, err = nodeInformer.Lister().List(ns); err != nil {
|
if nodes, err = nodeLister.List(ns); err != nil {
|
||||||
return []*v1.Node{}, err
|
return []*v1.Node{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,14 +70,14 @@ func TestReadyNodesWithNodeSelector(t *testing.T) {
|
|||||||
nodeSelector := "type=compute"
|
nodeSelector := "type=compute"
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
nodeInformer := sharedInformerFactory.Core().V1().Nodes()
|
nodeLister := sharedInformerFactory.Core().V1().Nodes().Lister()
|
||||||
|
|
||||||
stopChannel := make(chan struct{})
|
stopChannel := make(chan struct{})
|
||||||
sharedInformerFactory.Start(stopChannel)
|
sharedInformerFactory.Start(stopChannel)
|
||||||
sharedInformerFactory.WaitForCacheSync(stopChannel)
|
sharedInformerFactory.WaitForCacheSync(stopChannel)
|
||||||
defer close(stopChannel)
|
defer close(stopChannel)
|
||||||
|
|
||||||
nodes, _ := ReadyNodes(ctx, fakeClient, nodeInformer, nodeSelector)
|
nodes, _ := ReadyNodes(ctx, fakeClient, nodeLister, nodeSelector)
|
||||||
|
|
||||||
if nodes[0].Name != "node1" {
|
if nodes[0].Name != "node1" {
|
||||||
t.Errorf("Expected node1, got %s", nodes[0].Name)
|
t.Errorf("Expected node1, got %s", nodes[0].Name)
|
||||||
@@ -207,7 +207,7 @@ func TestPodFitsCurrentNode(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -737,7 +737,7 @@ func TestPodFitsAnyOtherNode(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import (
|
|||||||
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/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
coreinformers "k8s.io/client-go/informers/core/v1"
|
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
|
|
||||||
"sigs.k8s.io/descheduler/pkg/utils"
|
"sigs.k8s.io/descheduler/pkg/utils"
|
||||||
@@ -118,9 +117,9 @@ func (o *Options) BuildFilterFunc() (FilterFunc, error) {
|
|||||||
|
|
||||||
// BuildGetPodsAssignedToNodeFunc establishes an indexer to map the pods and their assigned nodes.
|
// BuildGetPodsAssignedToNodeFunc establishes an indexer to map the pods and their assigned nodes.
|
||||||
// It returns a function to help us get all the pods that assigned to a node based on the indexer.
|
// It returns a function to help us get all the pods that assigned to a node based on the indexer.
|
||||||
func BuildGetPodsAssignedToNodeFunc(podInformer coreinformers.PodInformer) (GetPodsAssignedToNodeFunc, error) {
|
func BuildGetPodsAssignedToNodeFunc(podInformer cache.SharedIndexInformer) (GetPodsAssignedToNodeFunc, error) {
|
||||||
// Establish an indexer to map the pods and their assigned nodes.
|
// Establish an indexer to map the pods and their assigned nodes.
|
||||||
err := podInformer.Informer().AddIndexers(cache.Indexers{
|
err := podInformer.AddIndexers(cache.Indexers{
|
||||||
nodeNameKeyIndex: func(obj interface{}) ([]string, error) {
|
nodeNameKeyIndex: func(obj interface{}) ([]string, error) {
|
||||||
pod, ok := obj.(*v1.Pod)
|
pod, ok := obj.(*v1.Pod)
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -137,7 +136,7 @@ func BuildGetPodsAssignedToNodeFunc(podInformer coreinformers.PodInformer) (GetP
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The indexer helps us get all the pods that assigned to a node.
|
// The indexer helps us get all the pods that assigned to a node.
|
||||||
podIndexer := podInformer.Informer().GetIndexer()
|
podIndexer := podInformer.GetIndexer()
|
||||||
getPodsAssignedToNode := func(nodeName string, filter FilterFunc) ([]*v1.Pod, error) {
|
getPodsAssignedToNode := func(nodeName string, filter FilterFunc) ([]*v1.Pod, error) {
|
||||||
objs, err := podIndexer.ByIndex(nodeNameKeyIndex, nodeName)
|
objs, err := podIndexer.ByIndex(nodeNameKeyIndex, nodeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ func TestListPodsOnANode(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ func (d *DefaultEvictor) Name() string {
|
|||||||
func (d *DefaultEvictor) PreEvictionFilter(pod *v1.Pod) bool {
|
func (d *DefaultEvictor) PreEvictionFilter(pod *v1.Pod) bool {
|
||||||
defaultEvictorArgs := d.args.(*DefaultEvictorArgs)
|
defaultEvictorArgs := d.args.(*DefaultEvictorArgs)
|
||||||
if defaultEvictorArgs.NodeFit {
|
if defaultEvictorArgs.NodeFit {
|
||||||
nodes, err := nodeutil.ReadyNodes(context.TODO(), d.handle.ClientSet(), d.handle.SharedInformerFactory().Core().V1().Nodes(), defaultEvictorArgs.NodeSelector)
|
nodes, err := nodeutil.ReadyNodes(context.TODO(), d.handle.ClientSet(), d.handle.SharedInformerFactory().Core().V1().Nodes().Lister(), defaultEvictorArgs.NodeSelector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.V(1).ErrorS(fmt.Errorf("Pod fails the following checks"), "pod", klog.KObj(pod))
|
klog.V(1).ErrorS(fmt.Errorf("Pod fails the following checks"), "pod", klog.KObj(pod))
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ func TestDefaultEvictorPreEvictionFilter(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -722,7 +722,7 @@ func TestDefaultEvictorFilter(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -451,7 +451,7 @@ func TestHighNodeUtilization(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -625,7 +625,7 @@ func TestHighNodeUtilizationWithTaints(t *testing.T) {
|
|||||||
|
|
||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -717,7 +717,7 @@ func TestLowNodeUtilization(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -911,7 +911,7 @@ func TestLowNodeUtilizationWithTaints(t *testing.T) {
|
|||||||
|
|
||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -334,7 +334,7 @@ func TestPodLifeTime(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ func TestFindDuplicatePods(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -751,7 +751,7 @@ func TestRemoveDuplicatesUniformly(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ func TestRemoveFailedPods(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ func TestRemovePodsHavingTooManyRestarts(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ func TestPodAntiAffinity(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ func TestRemovePodsViolatingNodeAffinity(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ func TestDeletePodsViolatingNodeTaints(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1136,7 +1136,7 @@ func TestTopologySpreadConstraint(t *testing.T) {
|
|||||||
fakeClient := fake.NewSimpleClientset(objs...)
|
fakeClient := fake.NewSimpleClientset(objs...)
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(fakeClient, 0)
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/uuid"
|
"k8s.io/apimachinery/pkg/util/uuid"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
coreinformers "k8s.io/client-go/informers/core/v1"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
listersv1 "k8s.io/client-go/listers/core/v1"
|
||||||
"k8s.io/client-go/tools/events"
|
"k8s.io/client-go/tools/events"
|
||||||
"k8s.io/utils/pointer"
|
"k8s.io/utils/pointer"
|
||||||
"sigs.k8s.io/descheduler/cmd/descheduler/app/options"
|
"sigs.k8s.io/descheduler/cmd/descheduler/app/options"
|
||||||
@@ -110,7 +110,7 @@ func RcByNameContainer(name, namespace string, replicas int32, labels map[string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func initializeClient(t *testing.T) (clientset.Interface, informers.SharedInformerFactory, coreinformers.NodeInformer, podutil.GetPodsAssignedToNodeFunc, chan struct{}) {
|
func initializeClient(t *testing.T) (clientset.Interface, informers.SharedInformerFactory, listersv1.NodeLister, podutil.GetPodsAssignedToNodeFunc, chan struct{}) {
|
||||||
clientSet, err := client.CreateClient(os.Getenv("KUBECONFIG"), "")
|
clientSet, err := client.CreateClient(os.Getenv("KUBECONFIG"), "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Error during client creation with %v", err)
|
t.Errorf("Error during client creation with %v", err)
|
||||||
@@ -119,8 +119,8 @@ func initializeClient(t *testing.T) (clientset.Interface, informers.SharedInform
|
|||||||
stopChannel := make(chan struct{})
|
stopChannel := make(chan struct{})
|
||||||
|
|
||||||
sharedInformerFactory := informers.NewSharedInformerFactory(clientSet, 0)
|
sharedInformerFactory := informers.NewSharedInformerFactory(clientSet, 0)
|
||||||
nodeInformer := sharedInformerFactory.Core().V1().Nodes()
|
nodeLister := sharedInformerFactory.Core().V1().Nodes().Lister()
|
||||||
podInformer := sharedInformerFactory.Core().V1().Pods()
|
podInformer := sharedInformerFactory.Core().V1().Pods().Informer()
|
||||||
|
|
||||||
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
getPodsAssignedToNode, err := podutil.BuildGetPodsAssignedToNodeFunc(podInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -130,18 +130,18 @@ func initializeClient(t *testing.T) (clientset.Interface, informers.SharedInform
|
|||||||
sharedInformerFactory.Start(stopChannel)
|
sharedInformerFactory.Start(stopChannel)
|
||||||
sharedInformerFactory.WaitForCacheSync(stopChannel)
|
sharedInformerFactory.WaitForCacheSync(stopChannel)
|
||||||
|
|
||||||
waitForNodesReady(context.Background(), t, clientSet, nodeInformer)
|
waitForNodesReady(context.Background(), t, clientSet, nodeLister)
|
||||||
return clientSet, sharedInformerFactory, nodeInformer, getPodsAssignedToNode, stopChannel
|
return clientSet, sharedInformerFactory, nodeLister, getPodsAssignedToNode, stopChannel
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitForNodesReady(ctx context.Context, t *testing.T, clientSet clientset.Interface, nodeInformer coreinformers.NodeInformer) {
|
func waitForNodesReady(ctx context.Context, t *testing.T, clientSet clientset.Interface, nodeLister listersv1.NodeLister) {
|
||||||
if err := wait.PollImmediate(5*time.Second, 30*time.Second, func() (bool, error) {
|
if err := wait.PollImmediate(5*time.Second, 30*time.Second, func() (bool, error) {
|
||||||
nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
|
nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
readyNodes, err := nodeutil.ReadyNodes(ctx, clientSet, nodeInformer, "")
|
readyNodes, err := nodeutil.ReadyNodes(ctx, clientSet, nodeLister, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,7 @@ func runPodLifetimePlugin(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
t *testing.T,
|
t *testing.T,
|
||||||
clientset clientset.Interface,
|
clientset clientset.Interface,
|
||||||
nodeInformer coreinformers.NodeInformer,
|
nodeLister listersv1.NodeLister,
|
||||||
namespaces *deschedulerapi.Namespaces,
|
namespaces *deschedulerapi.Namespaces,
|
||||||
priorityClass string,
|
priorityClass string,
|
||||||
priority *int32,
|
priority *int32,
|
||||||
@@ -174,7 +174,7 @@ func runPodLifetimePlugin(
|
|||||||
t.Fatalf("%v", err)
|
t.Fatalf("%v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes, err := nodeutil.ReadyNodes(ctx, clientset, nodeInformer, "")
|
nodes, err := nodeutil.ReadyNodes(ctx, clientset, nodeLister, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("%v", err)
|
t.Fatalf("%v", err)
|
||||||
}
|
}
|
||||||
@@ -930,7 +930,7 @@ func TestPodLabelSelector(t *testing.T) {
|
|||||||
func TestEvictAnnotation(t *testing.T) {
|
func TestEvictAnnotation(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
clientSet, _, nodeInformer, getPodsAssignedToNode, stopCh := initializeClient(t)
|
clientSet, _, nodeLister, getPodsAssignedToNode, stopCh := initializeClient(t)
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
|
testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
|
||||||
@@ -975,7 +975,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, nodeInformer, nil, "", nil, false, nil, nil, getPodsAssignedToNode)
|
runPodLifetimePlugin(ctx, t, clientSet, nodeLister, nil, "", nil, false, nil, nil, getPodsAssignedToNode)
|
||||||
|
|
||||||
if err := wait.PollImmediate(5*time.Second, time.Minute, func() (bool, error) {
|
if err := wait.PollImmediate(5*time.Second, time.Minute, func() (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()})
|
||||||
@@ -1002,7 +1002,7 @@ func TestEvictAnnotation(t *testing.T) {
|
|||||||
func TestPodLifeTimeOldestEvicted(t *testing.T) {
|
func TestPodLifeTimeOldestEvicted(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
clientSet, _, nodeInformer, getPodsAssignedToNode, stopCh := initializeClient(t)
|
clientSet, _, nodeLister, getPodsAssignedToNode, stopCh := initializeClient(t)
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
|
testNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "e2e-" + strings.ToLower(t.Name())}}
|
||||||
@@ -1041,7 +1041,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, nodeInformer, nil, "", nil, false, &maxPodsToEvictPerNamespace, nil, getPodsAssignedToNode)
|
runPodLifetimePlugin(ctx, t, clientSet, nodeLister, nil, "", nil, false, &maxPodsToEvictPerNamespace, nil, getPodsAssignedToNode)
|
||||||
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")
|
||||||
|
|||||||
Reference in New Issue
Block a user