Skip to content

Commit bfacd76

Browse files
Support of the namespaceLabelSelector in DefaultEvictor
plugin
1 parent 03983e5 commit bfacd76

File tree

1 file changed

+46
-44
lines changed

1 file changed

+46
-44
lines changed

pkg/framework/plugins/defaultevictor/defaultevictor.go

+46-44
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ import (
2525
"k8s.io/apimachinery/pkg/labels"
2626
"k8s.io/apimachinery/pkg/runtime"
2727
utilerrors "k8s.io/apimachinery/pkg/util/errors"
28-
clientset "k8s.io/client-go/kubernetes"
29-
listersv1 "k8s.io/client-go/listers/core/v1"
30-
3128
"k8s.io/client-go/tools/cache"
3229
"k8s.io/klog/v2"
3330

@@ -234,19 +231,26 @@ func (d *DefaultEvictor) PreEvictionFilter(pod *v1.Pod) bool {
234231
}
235232
}
236233

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
248236
}
249237

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+
}
250254
return true
251255
}
252256

@@ -310,40 +314,38 @@ func getPodIndexerByOwnerRefs(indexName string, handle frameworktypes.Handle) (c
310314
return indexer, nil
311315
}
312316

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()
328320

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
341325
}
342326
}
343327

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
346348
}
347349

348-
return ret, nil
350+
return indexer, nil
349351
}

0 commit comments

Comments
 (0)