@@ -22,6 +22,7 @@ import (
2222
2323 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2424 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
25+ k8sclient "k8s.io/client-go/kubernetes"
2526 restclient "k8s.io/client-go/rest"
2627 "k8s.io/client-go/tools/cache"
2728 "k8s.io/klog/v2"
@@ -46,12 +47,16 @@ type nfdController struct {
4647 updateOneNodeChan chan string
4748 updateAllNodeFeatureGroupsChan chan struct {}
4849 updateNodeFeatureGroupChan chan string
50+
51+ namespaceLister * NamespaceLister
4952}
5053
5154type nfdApiControllerOptions struct {
52- DisableNodeFeature bool
53- DisableNodeFeatureGroup bool
54- ResyncPeriod time.Duration
55+ DisableNodeFeature bool
56+ DisableNodeFeatureGroup bool
57+ ResyncPeriod time.Duration
58+ K8sClient k8sclient.Interface
59+ NodeFeatureNamespaceSelector * metav1.LabelSelector
5560}
5661
5762func init () {
@@ -67,8 +72,16 @@ func newNfdController(config *restclient.Config, nfdApiControllerOptions nfdApiC
6772 updateNodeFeatureGroupChan : make (chan string ),
6873 }
6974
70- nfdClient := nfdclientset .NewForConfigOrDie (config )
75+ if nfdApiControllerOptions .NodeFeatureNamespaceSelector != nil {
76+ labelMap , err := metav1 .LabelSelectorAsSelector (nfdApiControllerOptions .NodeFeatureNamespaceSelector )
77+ if err != nil {
78+ klog .ErrorS (err , "failed to convert label selector to map" , "selector" , nfdApiControllerOptions .NodeFeatureNamespaceSelector )
79+ return nil , err
80+ }
81+ c .namespaceLister = newNamespaceLister (nfdApiControllerOptions .K8sClient , labelMap )
82+ }
7183
84+ nfdClient := nfdclientset .NewForConfigOrDie (config )
7285 klog .V (2 ).InfoS ("initializing new NFD API controller" , "options" , utils .DelayedDumper (nfdApiControllerOptions ))
7386
7487 informerFactory := nfdinformers .NewSharedInformerFactory (nfdClient , nfdApiControllerOptions .ResyncPeriod )
@@ -89,7 +102,11 @@ func newNfdController(config *restclient.Config, nfdApiControllerOptions nfdApiC
89102 AddFunc : func (obj interface {}) {
90103 nfr := obj .(* nfdv1alpha1.NodeFeature )
91104 klog .V (2 ).InfoS ("NodeFeature added" , "nodefeature" , klog .KObj (nfr ))
92- c .updateOneNode ("NodeFeature" , nfr )
105+ if c .isNamespaceSelected (nfr .Namespace ) {
106+ c .updateOneNode ("NodeFeature" , nfr )
107+ } else {
108+ klog .V (2 ).InfoS ("NodeFeature namespace is not selected, skipping" , "nodefeature" , klog .KObj (nfr ))
109+ }
93110 if ! nfdApiControllerOptions .DisableNodeFeatureGroup {
94111 c .updateAllNodeFeatureGroups ()
95112 }
@@ -187,6 +204,7 @@ func newNfdController(config *restclient.Config, nfdApiControllerOptions nfdApiC
187204
188205func (c * nfdController ) stop () {
189206 close (c .stopChan )
207+ c .namespaceLister .stop ()
190208}
191209
192210func getNodeNameForObj (obj metav1.Object ) (string , error ) {
@@ -212,6 +230,28 @@ func (c *nfdController) updateOneNode(typ string, obj metav1.Object) {
212230 }
213231}
214232
233+ func (c * nfdController ) isNamespaceSelected (namespace string ) bool {
234+ // this means that the user didn't specify any namespace selector
235+ // which means that we allow all namespaces
236+ if c .namespaceLister == nil {
237+ return true
238+ }
239+
240+ namespaces , err := c .namespaceLister .list ()
241+ if err != nil {
242+ klog .ErrorS (err , "failed to query namespaces by the namespace lister" )
243+ return false
244+ }
245+
246+ for _ , ns := range namespaces {
247+ if ns .Name == namespace {
248+ return true
249+ }
250+ }
251+
252+ return false
253+ }
254+
215255func (c * nfdController ) updateAllNodes () {
216256 select {
217257 case c .updateAllNodesChan <- struct {}{}:
0 commit comments