@@ -25,9 +25,6 @@ import (
25
25
"k8s.io/apimachinery/pkg/labels"
26
26
"k8s.io/apimachinery/pkg/runtime"
27
27
utilerrors "k8s.io/apimachinery/pkg/util/errors"
28
- clientset "k8s.io/client-go/kubernetes"
29
- listersv1 "k8s.io/client-go/listers/core/v1"
30
-
31
28
"k8s.io/client-go/tools/cache"
32
29
"k8s.io/klog/v2"
33
30
@@ -234,19 +231,26 @@ func (d *DefaultEvictor) PreEvictionFilter(pod *v1.Pod) bool {
234
231
}
235
232
}
236
233
237
- // check pod by namespace label filter
238
- if d .args .NamespaceLabelSelector != nil {
239
- ns , err := getNamespacesListByLabelSelector (context .TODO (), d .handle .ClientSet (), d .handle .SharedInformerFactory ().Core ().V1 ().Namespaces ().Lister (), metav1 .FormatLabelSelector (d .args .NamespaceLabelSelector ))
240
- if err != nil {
241
- klog .ErrorS (err , "unable to list namespaces" , "pod" , klog .KObj (pod ))
242
- }
243
-
244
- if _ , ok := ns [pod .Namespace ]; ! ok {
245
- klog .InfoS ("pod namespace do not match the namespaceLabelSelector filter in the policy parameter" , "pod" , klog .KObj (pod ))
246
- return false
247
- }
234
+ if d .args .NamespaceLabelSelector == nil {
235
+ return true
248
236
}
249
237
238
+ // check pod by namespace label filter
239
+ indexName := "metadata.namespace"
240
+ indexer , err := getNamespacesListByLabelSelector (indexName , d .args .NamespaceLabelSelector , d .handle )
241
+ if err != nil {
242
+ klog .ErrorS (err , "unable to list namespaces" , "pod" , klog .KObj (pod ))
243
+ return false
244
+ }
245
+ objs , err := indexer .ByIndex (indexName , pod .Namespace )
246
+ if err != nil {
247
+ klog .ErrorS (err , "unable to list namespaces for namespaceLabelSelector filter in the policy parameter" , "pod" , klog .KObj (pod ))
248
+ return false
249
+ }
250
+ if len (objs ) == 0 {
251
+ klog .InfoS ("pod namespace do not match the namespaceLabelSelector filter in the policy parameter" , "pod" , klog .KObj (pod ))
252
+ return false
253
+ }
250
254
return true
251
255
}
252
256
@@ -310,40 +314,38 @@ func getPodIndexerByOwnerRefs(indexName string, handle frameworktypes.Handle) (c
310
314
return indexer , nil
311
315
}
312
316
313
- func getNamespacesListByLabelSelector (ctx context.Context , client clientset.Interface , nsLister listersv1.NamespaceLister , labelSelector string ) (map [string ]struct {}, error ) {
314
- ret := make (map [string ]struct {})
315
- namespaceSelector , err := labels .Parse (labelSelector )
316
- if err != nil {
317
- return ret , err
318
- }
319
-
320
- var ns []* v1.Namespace
321
- // err is defined above
322
- if ns , err = nsLister .List (namespaceSelector ); err != nil {
323
- return ret , err
324
- }
325
-
326
- if len (ns ) == 0 {
327
- klog .V (2 ).InfoS ("Namespace lister returned empty list, now fetch directly" )
317
+ func getNamespacesListByLabelSelector (indexName string , labelSelector * metav1.LabelSelector , handle frameworktypes.Handle ) (cache.Indexer , error ) {
318
+ nsInformer := handle .SharedInformerFactory ().Core ().V1 ().Namespaces ().Informer ()
319
+ indexer := nsInformer .GetIndexer ()
328
320
329
- nItems , err := client .CoreV1 ().Namespaces ().List (ctx , metav1.ListOptions {LabelSelector : labelSelector })
330
- if err != nil {
331
- return ret , err
332
- }
333
-
334
- if nItems == nil || len (nItems .Items ) == 0 {
335
- return ret , nil
336
- }
337
-
338
- for i := range nItems .Items {
339
- namespace := nItems .Items [i ]
340
- ns = append (ns , & namespace )
321
+ // do not reinitialize the indexer, if it's been defined already
322
+ for name := range indexer .GetIndexers () {
323
+ if name == indexName {
324
+ return indexer , nil
341
325
}
342
326
}
343
327
344
- for _ , n := range ns {
345
- ret [n .Name ] = struct {}{}
328
+ if err := nsInformer .AddIndexers (cache.Indexers {
329
+ indexName : func (obj interface {}) ([]string , error ) {
330
+ ns , ok := obj .(* v1.Namespace )
331
+ if ! ok {
332
+ return []string {}, errors .New ("unexpected object" )
333
+ }
334
+
335
+ selector , err := metav1 .LabelSelectorAsSelector (labelSelector )
336
+ if err != nil {
337
+ return []string {}, errors .New ("could not get selector from label selector" )
338
+ }
339
+ if labelSelector != nil && ! selector .Empty () {
340
+ if ! selector .Matches (labels .Set (ns .Labels )) {
341
+ return []string {}, nil
342
+ }
343
+ }
344
+ return []string {ns .GetName ()}, nil
345
+ },
346
+ }); err != nil {
347
+ return nil , err
346
348
}
347
349
348
- return ret , nil
350
+ return indexer , nil
349
351
}
0 commit comments