@@ -250,38 +250,7 @@ func (r *Reconciler) updateClusterRoleBindingNameInStatus(istiocsr *v1alpha1.Ist
250250
251251func (r * Reconciler ) createOrApplyRoles (istiocsr * v1alpha1.IstioCSR , resourceLabels map [string ]string , istioCSRCreateRecon bool ) error {
252252 desired := r .getRoleObject (istiocsr .GetNamespace (), istiocsr .Spec .IstioCSRConfig .Istio .Namespace , resourceLabels )
253-
254- roleName := fmt .Sprintf ("%s/%s" , desired .GetNamespace (), desired .GetName ())
255- r .log .V (4 ).Info ("reconciling role resource" , "name" , roleName )
256- fetched := & rbacv1.Role {}
257- exist , err := r .Exists (r .ctx , client .ObjectKeyFromObject (desired ), fetched )
258- if err != nil {
259- return common .FromClientError (err , "failed to check %s role resource already exists" , roleName )
260- }
261-
262- if exist {
263- if istioCSRCreateRecon {
264- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeWarning , "ResourceAlreadyExists" , "%s role resource already exists, maybe from previous installation" , roleName )
265- }
266- if hasObjectChanged (desired , fetched ) {
267- r .log .V (1 ).Info ("role has been modified, updating to desired state" , "name" , roleName )
268- if err := r .UpdateWithRetry (r .ctx , desired ); err != nil {
269- return common .FromClientError (err , "failed to update %s role resource" , roleName )
270- }
271- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "role resource %s reconciled back to desired state" , roleName )
272- } else {
273- r .log .V (4 ).Info ("role resource already exists and is in expected state" , "name" , roleName )
274- }
275- }
276-
277- if ! exist {
278- if err := r .Create (r .ctx , desired ); err != nil {
279- return common .FromClientError (err , "failed to create %s role resource" , roleName )
280- }
281- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "role resource %s created" , roleName )
282- }
283-
284- return nil
253+ return r .reconcileNamespacedRBACObject (istiocsr , desired , & rbacv1.Role {}, "reconciling role resource" , "role resource" , istioCSRCreateRecon )
285254}
286255
287256func (r * Reconciler ) getRoleObject (istiocsrNamespace , roleNamespace string , resourceLabels map [string ]string ) * rbacv1.Role {
@@ -293,38 +262,7 @@ func (r *Reconciler) getRoleObject(istiocsrNamespace, roleNamespace string, reso
293262
294263func (r * Reconciler ) createOrApplyRoleBindings (istiocsr * v1alpha1.IstioCSR , serviceAccount string , resourceLabels map [string ]string , istioCSRCreateRecon bool ) error {
295264 desired := r .getRoleBindingObject (serviceAccount , istiocsr .GetNamespace (), istiocsr .Spec .IstioCSRConfig .Istio .Namespace , resourceLabels )
296-
297- roleBindingName := fmt .Sprintf ("%s/%s" , desired .GetNamespace (), desired .GetName ())
298- r .log .V (4 ).Info ("reconciling rolebinding resource" , "name" , roleBindingName )
299- fetched := & rbacv1.RoleBinding {}
300- exist , err := r .Exists (r .ctx , client .ObjectKeyFromObject (desired ), fetched )
301- if err != nil {
302- return common .FromClientError (err , "failed to check %s rolebinding resource already exists" , roleBindingName )
303- }
304-
305- if exist {
306- if istioCSRCreateRecon {
307- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeWarning , "ResourceAlreadyExists" , "%s rolebinding resource already exists, maybe from previous installation" , roleBindingName )
308- }
309- if hasObjectChanged (desired , fetched ) {
310- r .log .V (1 ).Info ("rolebinding has been modified, updating to desired state" , "name" , roleBindingName )
311- if err := r .UpdateWithRetry (r .ctx , desired ); err != nil {
312- return common .FromClientError (err , "failed to update %s rolebinding resource" , roleBindingName )
313- }
314- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "rolebinding resource %s reconciled back to desired state" , roleBindingName )
315- } else {
316- r .log .V (4 ).Info ("rolebinding resource already exists and is in expected state" , "name" , roleBindingName )
317- }
318- }
319-
320- if ! exist {
321- if err := r .Create (r .ctx , desired ); err != nil {
322- return common .FromClientError (err , "failed to create %s rolebinding resource" , roleBindingName )
323- }
324- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "rolebinding resource %s created" , roleBindingName )
325- }
326-
327- return nil
265+ return r .reconcileNamespacedRBACObject (istiocsr , desired , & rbacv1.RoleBinding {}, "reconciling rolebinding resource" , "rolebinding resource" , istioCSRCreateRecon )
328266}
329267
330268func (r * Reconciler ) getRoleBindingObject (serviceAccount , istiocsrNamespace , roleNamespace string , resourceLabels map [string ]string ) * rbacv1.RoleBinding {
@@ -337,38 +275,7 @@ func (r *Reconciler) getRoleBindingObject(serviceAccount, istiocsrNamespace, rol
337275
338276func (r * Reconciler ) createOrApplyRoleForLeases (istiocsr * v1alpha1.IstioCSR , resourceLabels map [string ]string , istioCSRCreateRecon bool ) error {
339277 desired := r .getRoleForLeasesObject (istiocsr .GetNamespace (), istiocsr .Spec .IstioCSRConfig .Istio .Namespace , resourceLabels )
340-
341- roleName := fmt .Sprintf ("%s/%s" , desired .GetNamespace (), desired .GetName ())
342- r .log .V (4 ).Info ("reconciling role for lease resource" , "name" , roleName )
343- fetched := & rbacv1.Role {}
344- exist , err := r .Exists (r .ctx , client .ObjectKeyFromObject (desired ), fetched )
345- if err != nil {
346- return common .FromClientError (err , "failed to check %s role resource already exists" , roleName )
347- }
348-
349- if exist {
350- if istioCSRCreateRecon {
351- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeWarning , "ResourceAlreadyExists" , "%s role resource already exists, maybe from previous installation" , roleName )
352- }
353- if hasObjectChanged (desired , fetched ) {
354- r .log .V (1 ).Info ("role has been modified, updating to desired state" , "name" , roleName )
355- if err := r .UpdateWithRetry (r .ctx , desired ); err != nil {
356- return common .FromClientError (err , "failed to update %s role resource" , roleName )
357- }
358- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "role resource %s reconciled back to desired state" , roleName )
359- } else {
360- r .log .V (4 ).Info ("role resource already exists and is in expected state" , "name" , roleName )
361- }
362- }
363-
364- if ! exist {
365- if err := r .Create (r .ctx , desired ); err != nil {
366- return common .FromClientError (err , "failed to create %s role resource" , roleName )
367- }
368- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "role resource %s created" , roleName )
369- }
370-
371- return nil
278+ return r .reconcileNamespacedRBACObject (istiocsr , desired , & rbacv1.Role {}, "reconciling role for lease resource" , "role for lease resource" , istioCSRCreateRecon )
372279}
373280
374281func (r * Reconciler ) getRoleForLeasesObject (istiocsrNamespace , roleNamespace string , resourceLabels map [string ]string ) * rbacv1.Role {
@@ -380,38 +287,7 @@ func (r *Reconciler) getRoleForLeasesObject(istiocsrNamespace, roleNamespace str
380287
381288func (r * Reconciler ) createOrApplyRoleBindingForLeases (istiocsr * v1alpha1.IstioCSR , serviceAccount string , resourceLabels map [string ]string , istioCSRCreateRecon bool ) error {
382289 desired := r .getRoleBindingForLeasesObject (serviceAccount , istiocsr .GetNamespace (), istiocsr .Spec .IstioCSRConfig .Istio .Namespace , resourceLabels )
383-
384- roleBindingName := fmt .Sprintf ("%s/%s" , desired .GetNamespace (), desired .GetName ())
385- r .log .V (4 ).Info ("reconciling rolebinding for lease resource" , "name" , roleBindingName )
386- fetched := & rbacv1.RoleBinding {}
387- exist , err := r .Exists (r .ctx , client .ObjectKeyFromObject (desired ), fetched )
388- if err != nil {
389- return common .FromClientError (err , "failed to check %s rolebinding resource already exists" , roleBindingName )
390- }
391-
392- if exist {
393- if istioCSRCreateRecon {
394- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeWarning , "ResourceAlreadyExists" , "%s rolebinding resource already exists, maybe from previous installation" , roleBindingName )
395- }
396- if hasObjectChanged (desired , fetched ) {
397- r .log .V (1 ).Info ("rolebinding has been modified, updating to desired state" , "name" , roleBindingName )
398- if err := r .UpdateWithRetry (r .ctx , desired ); err != nil {
399- return common .FromClientError (err , "failed to update %s rolebinding resource" , roleBindingName )
400- }
401- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "rolebinding resource %s reconciled back to desired state" , roleBindingName )
402- } else {
403- r .log .V (4 ).Info ("rolebinding resource already exists and is in expected state" , "name" , roleBindingName )
404- }
405- }
406-
407- if ! exist {
408- if err := r .Create (r .ctx , desired ); err != nil {
409- return common .FromClientError (err , "failed to create %s rolebinding resource" , roleBindingName )
410- }
411- r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "rolebinding resource %s created" , roleBindingName )
412- }
413-
414- return nil
290+ return r .reconcileNamespacedRBACObject (istiocsr , desired , & rbacv1.RoleBinding {}, "reconciling rolebinding for lease resource" , "rolebinding for lease resource" , istioCSRCreateRecon )
415291}
416292
417293func (r * Reconciler ) getRoleBindingForLeasesObject (serviceAccount , istiocsrNamespace , roleNamespace string , resourceLabels map [string ]string ) * rbacv1.RoleBinding {
@@ -437,6 +313,40 @@ func updateServiceAccountNamespaceInRBACBindingObject[Object *rbacv1.RoleBinding
437313 }
438314}
439315
316+ // reconcileNamespacedRBACObject handles the common create-or-update logic for namespaced RBAC
317+ // resources (Role and RoleBinding). logMsg is used for the initial reconciliation log; resourceKind
318+ // is used in error and event messages. fetched must be an empty instance of the same type as desired.
319+ func (r * Reconciler ) reconcileNamespacedRBACObject (istiocsr * v1alpha1.IstioCSR , desired , fetched client.Object , logMsg , resourceKind string , istioCSRCreateRecon bool ) error {
320+ resourceName := fmt .Sprintf ("%s/%s" , desired .GetNamespace (), desired .GetName ())
321+ r .log .V (4 ).Info (logMsg , "name" , resourceName )
322+ exist , err := r .Exists (r .ctx , client .ObjectKeyFromObject (desired ), fetched )
323+ if err != nil {
324+ return common .FromClientError (err , "failed to check %s %s already exists" , resourceName , resourceKind )
325+ }
326+
327+ if exist && istioCSRCreateRecon {
328+ r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeWarning , "ResourceAlreadyExists" , "%s %s already exists, maybe from previous installation" , resourceName , resourceKind )
329+ }
330+ if exist && hasObjectChanged (desired , fetched ) {
331+ r .log .V (1 ).Info (resourceKind + " has been modified, updating to desired state" , "name" , resourceName )
332+ if err := r .UpdateWithRetry (r .ctx , desired ); err != nil {
333+ return common .FromClientError (err , "failed to update %s %s" , resourceName , resourceKind )
334+ }
335+ r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "%s %s reconciled back to desired state" , resourceKind , resourceName )
336+ } else if exist {
337+ r .log .V (4 ).Info (resourceKind + " already exists and is in expected state" , "name" , resourceName )
338+ }
339+
340+ if ! exist {
341+ if err := r .Create (r .ctx , desired ); err != nil {
342+ return common .FromClientError (err , "failed to create %s %s" , resourceName , resourceKind )
343+ }
344+ r .eventRecorder .Eventf (istiocsr , corev1 .EventTypeNormal , "Reconciled" , "%s %s created" , resourceKind , resourceName )
345+ }
346+
347+ return nil
348+ }
349+
440350// handleClusterRoleBindingModification reconciles a drifted ClusterRoleBinding back to its desired state.
441351// It copies the live object's name onto the desired spec (which was built with GenerateName for creation)
442352// and then attempts an in-place update. Because the Kubernetes API treats RoleRef as immutable, a RoleRef
0 commit comments