@@ -224,6 +224,10 @@ func (r *OpenStackDataPlaneNodeSetReconciler) manageServiceFinalizers(
224224 isCurrentlyInUse := currentUsernames [rabbitmqUser .Name ] || currentUsernames [rabbitmqUser .Status .Username ]
225225
226226 hasFinalizer := slices .Contains (rabbitmqUser .Finalizers , finalizerName )
227+ hasCleanupBlockedFinalizer := slices .Contains (rabbitmqUser .Finalizers , rabbitmqv1 .RabbitMQUserCleanupBlockedFinalizer )
228+
229+ needsUpdate := false
230+ newFinalizers := make ([]string , 0 , len (rabbitmqUser .Finalizers ))
227231
228232 if isCurrentlyInUse && ! hasFinalizer {
229233 // Add finalizer to this RabbitMqUser (this is the current user)
@@ -232,14 +236,9 @@ func (r *OpenStackDataPlaneNodeSetReconciler) manageServiceFinalizers(
232236 "service" , serviceName ,
233237 "user" , rabbitmqUser .Name ,
234238 "finalizer" , finalizerName )
235- rabbitmqUser .Finalizers = append (rabbitmqUser .Finalizers , finalizerName )
236- err = r .Update (ctx , rabbitmqUser )
237- if err != nil {
238- Log .Error (err , "Failed to add finalizer to RabbitMQUser" ,
239- "service" , serviceName ,
240- "user" , rabbitmqUser .Name )
241- // Don't fail reconciliation, just log the error
242- }
239+ newFinalizers = append (newFinalizers , rabbitmqUser .Finalizers ... )
240+ newFinalizers = append (newFinalizers , finalizerName )
241+ needsUpdate = true
243242 } else if ! isCurrentlyInUse && hasFinalizer && shouldRemoveOldFinalizers {
244243 // Remove finalizer from this RabbitMqUser (no longer in use)
245244 // Safe to remove because we only reach here when:
@@ -252,20 +251,12 @@ func (r *OpenStackDataPlaneNodeSetReconciler) manageServiceFinalizers(
252251 "service" , serviceName ,
253252 "user" , rabbitmqUser .Name ,
254253 "finalizer" , finalizerName )
255- var newFinalizers []string
256254 for _ , f := range rabbitmqUser .Finalizers {
257255 if f != finalizerName {
258256 newFinalizers = append (newFinalizers , f )
259257 }
260258 }
261- rabbitmqUser .Finalizers = newFinalizers
262- err = r .Update (ctx , rabbitmqUser )
263- if err != nil {
264- Log .Error (err , "Failed to remove finalizer from RabbitMQUser" ,
265- "service" , serviceName ,
266- "user" , rabbitmqUser .Name )
267- // Don't fail reconciliation, just log the error
268- }
259+ needsUpdate = true
269260 } else if ! isCurrentlyInUse && hasFinalizer && ! shouldRemoveOldFinalizers {
270261 // This user is no longer in use but we can't remove the finalizer yet
271262 // because not all nodes/nodesets have been updated
@@ -275,6 +266,39 @@ func (r *OpenStackDataPlaneNodeSetReconciler) manageServiceFinalizers(
275266 "finalizer" , finalizerName ,
276267 "updatedNodes" , len (tracking .UpdatedNodes ),
277268 "totalNodes" , len (allNodeNames ))
269+ newFinalizers = append (newFinalizers , rabbitmqUser .Finalizers ... )
270+ } else {
271+ // No change to nodeset finalizers
272+ newFinalizers = append (newFinalizers , rabbitmqUser .Finalizers ... )
273+ }
274+
275+ // Remove the temporary cleanup-blocked finalizer if present
276+ // This finalizer was added by infra-operator as a temporary safeguard during
277+ // credential rotation, but should be removed now that proper finalizer management is in place
278+ if hasCleanupBlockedFinalizer {
279+ Log .Info ("Removing temporary cleanup-blocked finalizer from RabbitMqUser" ,
280+ "user" , rabbitmqUser .Name ,
281+ "finalizer" , rabbitmqv1 .RabbitMQUserCleanupBlockedFinalizer )
282+ filteredFinalizers := make ([]string , 0 , len (newFinalizers ))
283+ for _ , f := range newFinalizers {
284+ if f != rabbitmqv1 .RabbitMQUserCleanupBlockedFinalizer {
285+ filteredFinalizers = append (filteredFinalizers , f )
286+ }
287+ }
288+ newFinalizers = filteredFinalizers
289+ needsUpdate = true
290+ }
291+
292+ // Apply all finalizer changes in a single update
293+ if needsUpdate {
294+ rabbitmqUser .Finalizers = newFinalizers
295+ err = r .Update (ctx , rabbitmqUser )
296+ if err != nil {
297+ Log .Error (err , "Failed to update finalizers on RabbitMQUser" ,
298+ "service" , serviceName ,
299+ "user" , rabbitmqUser .Name )
300+ // Don't fail reconciliation, just log the error
301+ }
278302 }
279303 }
280304}
0 commit comments