diff --git a/pkg/nfd-master/namespace-lister.go b/pkg/nfd-master/namespace-lister.go index ea8b97a4c..1665a824d 100644 --- a/pkg/nfd-master/namespace-lister.go +++ b/pkg/nfd-master/namespace-lister.go @@ -16,6 +16,7 @@ limitations under the License. package nfdmaster import ( + "fmt" "time" corev1 "k8s.io/api/core/v1" @@ -23,6 +24,7 @@ import ( "k8s.io/client-go/informers" k8sclient "k8s.io/client-go/kubernetes" v1lister "k8s.io/client-go/listers/core/v1" + "k8s.io/klog/v2" ) // NamespaceLister lists kubernetes namespaces. @@ -32,19 +34,27 @@ type NamespaceLister struct { stopChan chan struct{} } -func newNamespaceLister(k8sClient k8sclient.Interface, labelsSelector labels.Selector) *NamespaceLister { +func newNamespaceLister(k8sClient k8sclient.Interface, labelsSelector labels.Selector) (*NamespaceLister, error) { factory := informers.NewSharedInformerFactory(k8sClient, time.Hour) namespaceLister := factory.Core().V1().Namespaces().Lister() stopChan := make(chan struct{}) factory.Start(stopChan) // runs in background - factory.WaitForCacheSync(stopChan) + + start := time.Now() + ret := factory.WaitForCacheSync(stopChan) + for res, ok := range ret { + if !ok { + return &NamespaceLister{}, fmt.Errorf("namespace informer cache failed to sync (%s)", res) + } + } + klog.InfoS("namespace informer cache synced", "duration", time.Since(start)) return &NamespaceLister{ namespaceLister: namespaceLister, labelsSelector: labelsSelector, stopChan: stopChan, - } + }, nil } // list returns all kubernetes namespaces. diff --git a/pkg/nfd-master/nfd-api-controller.go b/pkg/nfd-master/nfd-api-controller.go index 5ba38e588..a3870f489 100644 --- a/pkg/nfd-master/nfd-api-controller.go +++ b/pkg/nfd-master/nfd-api-controller.go @@ -78,7 +78,12 @@ func newNfdController(config *restclient.Config, nfdApiControllerOptions nfdApiC klog.ErrorS(err, "failed to convert label selector to map", "selector", nfdApiControllerOptions.NodeFeatureNamespaceSelector) return nil, err } - c.namespaceLister = newNamespaceLister(nfdApiControllerOptions.K8sClient, labelMap) + c.namespaceLister, err = newNamespaceLister(nfdApiControllerOptions.K8sClient, labelMap) + if err != nil { + klog.ErrorS(err, "coudn't create namespace lister") + return nil, err + } + } nfdClient := nfdclientset.NewForConfigOrDie(config) diff --git a/pkg/nfd-master/nfd-api-controller_test.go b/pkg/nfd-master/nfd-api-controller_test.go index a49c4939b..c7e217ec5 100644 --- a/pkg/nfd-master/nfd-api-controller_test.go +++ b/pkg/nfd-master/nfd-api-controller_test.go @@ -104,7 +104,9 @@ func TestIsNamespaceSelected(t *testing.T) { for _, tc := range testcases { labelMap, _ := metav1.LabelSelectorAsSelector(tc.nodeFeatureNamespaceSelector) - c.namespaceLister = newNamespaceLister(fakeCli, labelMap) + lister, err := newNamespaceLister(fakeCli, labelMap) + assert.Nil(t, err) + c.namespaceLister = lister res := c.isNamespaceSelected(tc.objectNamespace) assert.Equal(t, res, tc.expectedResult) }