Skip to content

Commit f52529a

Browse files
committed
Remove rabbitmqv1.RabbitMQUserCleanupBlockedFinalizer on cleanup
1 parent 17dd638 commit f52529a

File tree

4 files changed

+229
-37
lines changed

4 files changed

+229
-37
lines changed

internal/controller/dataplane/manage_service_finalizers.go

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

internal/controller/dataplane/openstackdataplanenodeset_controller.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151

5252
"github.com/go-logr/logr"
5353
infranetworkv1 "github.com/openstack-k8s-operators/infra-operator/apis/network/v1beta1"
54+
rabbitmqv1 "github.com/openstack-k8s-operators/infra-operator/apis/rabbitmq/v1beta1"
5455
condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
5556
"github.com/openstack-k8s-operators/lib-common/modules/common/helper"
5657
"github.com/openstack-k8s-operators/lib-common/modules/common/rolebinding"
@@ -1095,7 +1096,7 @@ func (r *OpenStackDataPlaneNodeSetReconciler) isNodesetFullyUpdated(
10951096
helper *helper.Helper,
10961097
nodeset *dataplanev1.OpenStackDataPlaneNodeSet,
10971098
serviceName string,
1098-
secretsLastModified map[string]time.Time,
1099+
_ map[string]time.Time,
10991100
) (bool, error) {
11001101
Log := r.GetLogger(ctx)
11011102

@@ -1269,13 +1270,18 @@ func (r *OpenStackDataPlaneNodeSetReconciler) reconcileDelete(
12691270
updatedFinalizers := []string{}
12701271

12711272
// Keep only finalizers that don't belong to this nodeset
1273+
// Also remove the temporary cleanup-blocked finalizer if present
12721274
for _, f := range originalFinalizers {
1273-
if !strings.HasPrefix(f, finalizerPrefix) {
1274-
updatedFinalizers = append(updatedFinalizers, f)
1275-
} else {
1275+
if strings.HasPrefix(f, finalizerPrefix) {
12761276
Log.Info("Removing finalizer from RabbitMQ user during nodeset deletion",
12771277
"user", user.GetName(),
12781278
"finalizer", f)
1279+
} else if f == rabbitmqv1.RabbitMQUserCleanupBlockedFinalizer {
1280+
Log.Info("Removing temporary cleanup-blocked finalizer from RabbitMQ user during nodeset deletion",
1281+
"user", user.GetName(),
1282+
"finalizer", f)
1283+
} else {
1284+
updatedFinalizers = append(updatedFinalizers, f)
12791285
}
12801286
}
12811287

internal/dataplane/rabbitmq_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package deployment
1818

1919
import (
2020
"context"
21-
"fmt"
2221
"testing"
2322

2423
"github.com/openstack-k8s-operators/lib-common/modules/common/helper"
@@ -432,11 +431,11 @@ func TestGetNovaCellRabbitMqUserFromSecret_EdgeCases(t *testing.T) {
432431
Namespace: namespace,
433432
},
434433
Data: map[string][]byte{
435-
"01-nova.conf": []byte(fmt.Sprintf(`[DEFAULT]
434+
"01-nova.conf": []byte(`[DEFAULT]
436435
debug = true
437436
transport_url = rabbit://complex-user:p@ssw0rd@host1:5672,host2:5672,host3:5672/cell1
438437
log_dir = /var/log/nova
439-
`)),
438+
`),
440439
},
441440
}
442441

0 commit comments

Comments
 (0)