@@ -57,7 +57,9 @@ import (
5757 "github.com/openshift-kni/numaresources-operator/api/v1/helper/namespacedname"
5858 nodegroupv1 "github.com/openshift-kni/numaresources-operator/api/v1/helper/nodegroup"
5959 "github.com/openshift-kni/numaresources-operator/internal/api/annotations"
60+ nrolabels "github.com/openshift-kni/numaresources-operator/internal/api/labels"
6061 "github.com/openshift-kni/numaresources-operator/internal/dangling"
62+ "github.com/openshift-kni/numaresources-operator/internal/nodes"
6163 intreconcile "github.com/openshift-kni/numaresources-operator/internal/reconcile"
6264 "github.com/openshift-kni/numaresources-operator/internal/relatedobjects"
6365 "github.com/openshift-kni/numaresources-operator/pkg/apply"
@@ -119,8 +121,8 @@ type NUMAResourcesOperatorReconciler struct {
119121//+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=clusterrolebindings,verbs=*
120122//+kubebuilder:rbac:groups="",resources=serviceaccounts,verbs=*
121123//+kubebuilder:rbac:groups="",resources=pods,verbs=get;list;watch
122- //+kubebuilder:rbac:groups="",resources=nodes,verbs=list
123- //+kubebuilder:rbac:groups=nodetopology.openshift.io,resources=numaresourcesoperators,verbs=get;list;watch
124+ //+kubebuilder:rbac:groups="",resources=nodes,verbs=get; list;watch;patch
125+ //+kubebuilder:rbac:groups=nodetopology.openshift.io,resources=numaresourcesoperators,verbs=get;list;watch;update
124126//+kubebuilder:rbac:groups=nodetopology.openshift.io,resources=numaresourcesoperators/status,verbs=get;update;patch
125127//+kubebuilder:rbac:groups=nodetopology.openshift.io,resources=numaresourcesoperators/finalizers,verbs=update
126128
@@ -146,6 +148,26 @@ func (r *NUMAResourcesOperatorReconciler) Reconcile(ctx context.Context, req ctr
146148 return ctrl.Result {}, err
147149 }
148150
151+ if ! instance .DeletionTimestamp .IsZero () {
152+ if controllerutil .ContainsFinalizer (instance , nrolabels .NodeFinalizer ) {
153+ if err := nodes .RemoveAllLabels (ctx , r .Client ); err != nil {
154+ return ctrl.Result {}, fmt .Errorf ("failed to clean up node labels: %w" , err )
155+ }
156+ controllerutil .RemoveFinalizer (instance , nrolabels .NodeFinalizer )
157+ if err := r .Update (ctx , instance ); err != nil {
158+ return ctrl.Result {}, err
159+ }
160+ }
161+ return ctrl.Result {}, nil
162+ }
163+
164+ if ! controllerutil .ContainsFinalizer (instance , nrolabels .NodeFinalizer ) {
165+ controllerutil .AddFinalizer (instance , nrolabels .NodeFinalizer )
166+ if err := r .Update (ctx , instance ); err != nil {
167+ return ctrl.Result {}, err
168+ }
169+ }
170+
149171 initialInstance := instance .DeepCopy ()
150172 if len (initialInstance .Status .Conditions ) == 0 {
151173 instance .Status .Conditions = status .NewNUMAResourcesOperatorConditions ()
@@ -298,6 +320,10 @@ func (r *NUMAResourcesOperatorReconciler) reconcileResource(ctx context.Context,
298320 }
299321 }
300322
323+ if err := nodes .LabelForTrees (ctx , r .Client , r .Platform , trees ); err != nil {
324+ return intreconcile .StepFailed (fmt .Errorf ("failed to label nodes for primary pools: %w" , err ))
325+ }
326+
301327 dsPerPool , step := r .reconcileResourceDaemonSet (ctx , instance , existing , trees )
302328 if step .EarlyStop () {
303329 return step
@@ -618,12 +644,29 @@ func (r *NUMAResourcesOperatorReconciler) SetupWithManager(mgr ctrl.Manager) err
618644 return ok
619645 })
620646
647+ nodePredicates := predicate.Funcs {
648+ UpdateFunc : func (e event.UpdateEvent ) bool {
649+ if ! validateUpdateEvent (& e ) {
650+ return false
651+ }
652+ _ , oldHas := e .ObjectOld .GetLabels ()[nrolabels .NodePrimaryPool ]
653+ _ , newHas := e .ObjectNew .GetLabels ()[nrolabels .NodePrimaryPool ]
654+ if oldHas || newHas {
655+ return true
656+ }
657+ return ! apiequality .Semantic .DeepEqual (e .ObjectOld .GetLabels (), e .ObjectNew .GetLabels ())
658+ },
659+ }
660+
621661 b := ctrl .NewControllerManagedBy (mgr ).For (& nropv1.NUMAResourcesOperator {})
622662 if r .Platform == platform .OpenShift {
623663 b .Watches (
624664 & machineconfigv1.MachineConfigPool {},
625665 handler .EnqueueRequestsFromMapFunc (r .mcpToNUMAResourceOperator ),
626666 builder .WithPredicates (mcpPredicates )).
667+ Watches (& corev1.Node {},
668+ handler .EnqueueRequestsFromMapFunc (r .nodeToNUMAResourceOperator ),
669+ builder .WithPredicates (nodePredicates )).
627670 Owns (& securityv1.SecurityContextConstraints {}).
628671 Owns (& machineconfigv1.MachineConfig {}, builder .WithPredicates (p ))
629672 }
@@ -676,6 +719,14 @@ func (r *NUMAResourcesOperatorReconciler) mcpToNUMAResourceOperator(ctx context.
676719 return requests
677720}
678721
722+ func (r * NUMAResourcesOperatorReconciler ) nodeToNUMAResourceOperator (ctx context.Context , nodeObj client.Object ) []reconcile.Request {
723+ return []reconcile.Request {{
724+ NamespacedName : client.ObjectKey {
725+ Name : objectnames .DefaultNUMAResourcesOperatorCrName ,
726+ },
727+ }}
728+ }
729+
679730func nodeGroupMatchesMCP (nodeGroup nropv1.NodeGroup , mcpName string , mcpLabels labels.Set ) bool {
680731 if nodeGroup .PoolName != nil {
681732 return mcpName == * nodeGroup .PoolName
0 commit comments