@@ -508,11 +508,12 @@ func (r *IronicReconciler) reconcileNormal(ctx context.Context, instance *ironic
508508 }
509509 // Create ConfigMaps and Secrets - end
510510
511- // Manage consumer finalizer for ironic AC secret
512- if instance .Spec .Auth .ApplicationCredentialSecret != "" || instance .Status .ApplicationCredentialSecret != "" {
511+ // Add consumer finalizer to the new ironic AC secret (early phase of the
512+ // split pattern -- old secret finalizer removal is deferred to end of reconcile).
513+ if instance .Spec .Auth .ApplicationCredentialSecret != "" {
513514 if err := keystonev1 .ManageACSecretFinalizer (ctx , helper , instance .Namespace ,
514515 instance .Spec .Auth .ApplicationCredentialSecret ,
515- instance . Status . ApplicationCredentialSecret ,
516+ "" ,
516517 ironic .ACConsumerFinalizer ); err != nil {
517518 instance .Status .Conditions .Set (condition .FalseCondition (
518519 condition .ServiceConfigReadyCondition ,
@@ -523,13 +524,12 @@ func (r *IronicReconciler) reconcileNormal(ctx context.Context, instance *ironic
523524 return ctrl.Result {}, err
524525 }
525526 }
526- instance .Status .ApplicationCredentialSecret = instance .Spec .Auth .ApplicationCredentialSecret
527527
528- // Manage consumer finalizer for ironic-inspector AC secret
529- if instance .Spec .IronicInspector .Auth .ApplicationCredentialSecret != "" || instance . Status . InspectorApplicationCredentialSecret != "" {
528+ // Add consumer finalizer to the new ironic-inspector AC secret.
529+ if instance .Spec .IronicInspector .Auth .ApplicationCredentialSecret != "" {
530530 if err := keystonev1 .ManageACSecretFinalizer (ctx , helper , instance .Namespace ,
531531 instance .Spec .IronicInspector .Auth .ApplicationCredentialSecret ,
532- instance . Status . InspectorApplicationCredentialSecret ,
532+ "" ,
533533 ironic .InspectorACConsumerFinalizer ); err != nil {
534534 instance .Status .Conditions .Set (condition .FalseCondition (
535535 condition .ServiceConfigReadyCondition ,
@@ -540,7 +540,6 @@ func (r *IronicReconciler) reconcileNormal(ctx context.Context, instance *ironic
540540 return ctrl.Result {}, err
541541 }
542542 }
543- instance .Status .InspectorApplicationCredentialSecret = instance .Spec .IronicInspector .Auth .ApplicationCredentialSecret
544543
545544 instance .Status .Conditions .MarkTrue (condition .ServiceConfigReadyCondition , condition .ServiceConfigReadyMessage )
546545
@@ -793,6 +792,37 @@ func (r *IronicReconciler) reconcileNormal(ctx context.Context, instance *ironic
793792 return ctrl.Result {}, err
794793 }
795794
795+ // Late phase of the AC split pattern: remove the old AC secret's finalizer
796+ // and update status only after all sub-services are ready with the new
797+ // credentials. This prevents premature revocation during rapid rotations.
798+ isIronicRotation := instance .Status .ApplicationCredentialSecret != "" &&
799+ instance .Status .ApplicationCredentialSecret != instance .Spec .Auth .ApplicationCredentialSecret
800+ if isIronicRotation {
801+ if instance .Status .Conditions .AllSubConditionIsTrue () {
802+ if err := keystonev1 .RemoveACSecretConsumerFinalizer (ctx , helper , instance .Namespace ,
803+ instance .Status .ApplicationCredentialSecret , ironic .ACConsumerFinalizer ); err != nil {
804+ return ctrl.Result {}, err
805+ }
806+ instance .Status .ApplicationCredentialSecret = instance .Spec .Auth .ApplicationCredentialSecret
807+ }
808+ } else {
809+ instance .Status .ApplicationCredentialSecret = instance .Spec .Auth .ApplicationCredentialSecret
810+ }
811+
812+ isInspectorRotation := instance .Status .InspectorApplicationCredentialSecret != "" &&
813+ instance .Status .InspectorApplicationCredentialSecret != instance .Spec .IronicInspector .Auth .ApplicationCredentialSecret
814+ if isInspectorRotation {
815+ if instance .Status .Conditions .AllSubConditionIsTrue () {
816+ if err := keystonev1 .RemoveACSecretConsumerFinalizer (ctx , helper , instance .Namespace ,
817+ instance .Status .InspectorApplicationCredentialSecret , ironic .InspectorACConsumerFinalizer ); err != nil {
818+ return ctrl.Result {}, err
819+ }
820+ instance .Status .InspectorApplicationCredentialSecret = instance .Spec .IronicInspector .Auth .ApplicationCredentialSecret
821+ }
822+ } else {
823+ instance .Status .InspectorApplicationCredentialSecret = instance .Spec .IronicInspector .Auth .ApplicationCredentialSecret
824+ }
825+
796826 // We reached the end of the Reconcile, update the Ready condition based on
797827 // the sub conditions
798828 if instance .Status .Conditions .AllSubConditionIsTrue () {
0 commit comments