@@ -35,6 +35,7 @@ import (
3535 "github.com/openshift/windows-machine-config-operator/pkg/condition"
3636 "github.com/openshift/windows-machine-config-operator/pkg/metadata"
3737 "github.com/openshift/windows-machine-config-operator/pkg/nodeconfig"
38+ wmcorbac "github.com/openshift/windows-machine-config-operator/pkg/rbac"
3839 "github.com/openshift/windows-machine-config-operator/pkg/secrets"
3940 "github.com/openshift/windows-machine-config-operator/pkg/signer"
4041)
@@ -45,6 +46,10 @@ const (
4546)
4647
4748// nodeReconciler holds the info required to reconcile a Node object, inclduing that of the underlying Windows instance
49+ //+kubebuilder:rbac:groups="",resources=nodes,verbs=patch
50+ //+kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=clusterroles,verbs=get;create;delete
51+ //+kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=clusterrolebindings,verbs=get;create;delete
52+
4853type nodeReconciler struct {
4954 instanceReconciler
5055}
@@ -84,15 +89,23 @@ func (r *nodeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (resul
8489 node := & core.Node {}
8590 if err := r .client .Get (ctx , req .NamespacedName , node ); err != nil {
8691 if k8sapierrors .IsNotFound (err ) {
87- // Request object not found, could have been deleted after reconcile request.
88- // Owned objects are automatically garbage collected. For additional cleanup logic use finalizers.
89- // Return and don't requeue
92+ // Node was deleted - clean up any node-specific RBAC
93+ if err := r .cleanupNodeSpecificRBAC (ctx , req .NamespacedName .Name ); err != nil {
94+ r .log .Error (err , "failed to cleanup node-specific RBAC" , "node" , req .NamespacedName .Name )
95+ // Don't return error to avoid requeue on cleanup
96+ }
9097 return ctrl.Result {}, nil
9198 }
9299 // Error reading the object - return error to requeue the request.
93100 return ctrl.Result {}, err
94101 }
95102
103+ // Ensure node-specific RBAC exists for this Windows node
104+ if err := r .ensureNodeSpecificRBAC (ctx , node .Name ); err != nil {
105+ r .log .Error (err , "failed to ensure node-specific RBAC" , "node" , node .Name )
106+ return ctrl.Result {}, err
107+ }
108+
96109 if _ , ok := node .GetAnnotations ()[metadata .RebootAnnotation ]; ok {
97110 // Create a new signer using the private key that the instances will be reconciled with
98111 signer , err := signer .Create (ctx , types.NamespacedName {Namespace : r .watchNamespace ,
@@ -130,7 +143,7 @@ func (r *nodeReconciler) SetupWithManager(mgr ctrl.Manager) error {
130143 return isWindowsNode (e .Object )
131144 },
132145 DeleteFunc : func (e event.DeleteEvent ) bool {
133- return false
146+ return isWindowsNode ( e . Object ) // Enable delete events for RBAC cleanup
134147 },
135148 }
136149 return ctrl .NewControllerManagedBy (mgr ).
@@ -147,3 +160,13 @@ func isWindowsNode(obj runtime.Object) bool {
147160 value , ok := node .Labels [core .LabelOSStable ]
148161 return ok && value == "windows"
149162}
163+
164+ // ensureNodeSpecificRBAC creates node-specific RBAC for the given node
165+ func (r * nodeReconciler ) ensureNodeSpecificRBAC (ctx context.Context , nodeName string ) error {
166+ return wmcorbac .EnsureNodeSpecificRBAC (ctx , r .client , r .k8sclientset , r .watchNamespace , nodeName )
167+ }
168+
169+ // cleanupNodeSpecificRBAC removes node-specific RBAC resources for a deleted node
170+ func (r * nodeReconciler ) cleanupNodeSpecificRBAC (ctx context.Context , nodeName string ) error {
171+ return wmcorbac .CleanupNodeSpecificRBAC (ctx , r .client , r .k8sclientset , r .watchNamespace , nodeName )
172+ }
0 commit comments