Skip to content

Commit 7f98a98

Browse files
committed
controller: integrate node labeling, finalizer, and NRO label-based DaemonSet targeting
AIA: Human-AI blend, New content, Human-initiated, Reviewed, Claude Opus 4.6 v1.0 Signed-off-by: Talor Itzhak <titzhak@redhat.com>
1 parent 616bc74 commit 7f98a98

2 files changed

Lines changed: 57 additions & 7 deletions

File tree

internal/controller/numaresourcesoperator_controller.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
679730
func nodeGroupMatchesMCP(nodeGroup nropv1.NodeGroup, mcpName string, mcpLabels labels.Set) bool {
680731
if nodeGroup.PoolName != nil {
681732
return mcpName == *nodeGroup.PoolName

pkg/objectstate/rte/machineconfigpool.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
nropv1 "github.com/openshift-kni/numaresources-operator/api/v1"
3232
nodegroupv1 "github.com/openshift-kni/numaresources-operator/api/v1/helper/nodegroup"
3333
"github.com/openshift-kni/numaresources-operator/internal/api/annotations"
34+
labels "github.com/openshift-kni/numaresources-operator/internal/api/labels"
3435
"github.com/openshift-kni/numaresources-operator/pkg/objectnames"
3536
"github.com/openshift-kni/numaresources-operator/pkg/objectstate"
3637
"github.com/openshift-kni/numaresources-operator/pkg/objectstate/compare"
@@ -85,12 +86,10 @@ func (obj machineConfigPoolFinder) FindState(mf Manifests, tree nodegroupv1.Tree
8586
desiredDaemonSet := mf.Core.DaemonSet.DeepCopy()
8687
desiredDaemonSet.Name = generatedName
8788

88-
var updateError error
89-
if mcp.Spec.NodeSelector != nil {
90-
desiredDaemonSet.Spec.Template.Spec.NodeSelector = mcp.Spec.NodeSelector.MatchLabels
91-
} else {
92-
updateError = fmt.Errorf("the machine config pool %q does not have node selector", mcp.Name)
89+
desiredDaemonSet.Spec.Template.Spec.NodeSelector = map[string]string{
90+
labels.NodePrimaryPool: mcp.Name,
9391
}
92+
var updateError error
9493

9594
gdm := GeneratedDesiredManifest{
9695
ClusterPlatform: obj.em.plat,

0 commit comments

Comments
 (0)