@@ -68,18 +68,22 @@ func (r *RabbitMQPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Reque
6868
6969 h , _ := helper .NewHelper (instance , r .Client , r .Kclient , r .Scheme , Log )
7070
71- // Initialize status
72- if instance .Status .Conditions == nil {
73- instance .Status .Conditions = condition.Conditions {}
74- cl := condition .CreateList (
75- condition .UnknownCondition (condition .ReadyCondition , condition .InitReason , condition .ReadyInitMessage ),
76- condition .UnknownCondition (rabbitmqv1 .PolicyReadyCondition , condition .InitReason , rabbitmqv1 .PolicyReadyInitMessage ),
77- )
78- instance .Status .Conditions .Init (& cl )
79- instance .Status .ObservedGeneration = instance .Generation
80- }
71+ // Save a copy of the conditions so that we can restore the LastTransitionTime
72+ // when a condition's state doesn't change
73+ savedConditions := instance .Status .Conditions .DeepCopy ()
74+
75+ // Initialize status conditions
76+ cl := condition .CreateList (
77+ condition .UnknownCondition (condition .ReadyCondition , condition .InitReason , condition .ReadyInitMessage ),
78+ condition .UnknownCondition (rabbitmqv1 .RabbitMQPolicyReadyCondition , condition .InitReason , rabbitmqv1 .RabbitMQPolicyReadyInitMessage ),
79+ )
80+ instance .Status .Conditions .Init (& cl )
81+ instance .Status .ObservedGeneration = instance .Generation
8182
8283 defer func () {
84+ // Restore condition timestamps if they haven't changed
85+ condition .RestoreLastTransitionTimes (& instance .Status .Conditions , savedConditions )
86+
8387 if instance .Status .Conditions .IsUnknown (condition .ReadyCondition ) {
8488 instance .Status .Conditions .Set (instance .Status .Conditions .Mirror (condition .ReadyCondition ))
8589 }
@@ -93,10 +97,11 @@ func (r *RabbitMQPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Reque
9397 return r .reconcileDelete (ctx , instance , h )
9498 }
9599
96- // Add finalizer
100+ // Add finalizer if not being deleted
97101 if ! controllerutil .ContainsFinalizer (instance , policyFinalizer ) {
98102 controllerutil .AddFinalizer (instance , policyFinalizer )
99- return ctrl.Result {Requeue : true }, nil
103+ // No need to requeue, the update will trigger a reconcile
104+ return ctrl.Result {}, nil
100105 }
101106
102107 return r .reconcileNormal (ctx , instance , h )
@@ -115,7 +120,7 @@ func (r *RabbitMQPolicyReconciler) reconcileNormal(ctx context.Context, instance
115120 vhost := & rabbitmqv1.RabbitMQVhost {}
116121 err := r .Get (ctx , types.NamespacedName {Name : instance .Spec .VhostRef , Namespace : instance .Namespace }, vhost )
117122 if err != nil {
118- instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .PolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .PolicyReadyErrorMessage , err .Error ()))
123+ instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .RabbitMQPolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .RabbitMQPolicyReadyErrorMessage , err .Error ()))
119124 return ctrl.Result {}, err
120125 }
121126 vhostName = vhost .Spec .Name
@@ -128,14 +133,14 @@ func (r *RabbitMQPolicyReconciler) reconcileNormal(ctx context.Context, instance
128133 rabbit := & rabbitmqclusterv2.RabbitmqCluster {}
129134 err := r .Get (ctx , types.NamespacedName {Name : instance .Spec .RabbitmqClusterName , Namespace : instance .Namespace }, rabbit )
130135 if err != nil {
131- instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .PolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .PolicyReadyErrorMessage , err .Error ()))
136+ instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .RabbitMQPolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .RabbitMQPolicyReadyErrorMessage , err .Error ()))
132137 return ctrl.Result {}, err
133138 }
134139
135140 // Get admin credentials
136141 rabbitSecret , _ , err := oko_secret .GetSecret (ctx , h , rabbit .Status .DefaultUser .SecretReference .Name , instance .Namespace )
137142 if err != nil {
138- instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .PolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .PolicyReadyErrorMessage , err .Error ()))
143+ instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .RabbitMQPolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .RabbitMQPolicyReadyErrorMessage , err .Error ()))
139144 return ctrl.Result {}, err
140145 }
141146
@@ -157,16 +162,16 @@ func (r *RabbitMQPolicyReconciler) reconcileNormal(ctx context.Context, instance
157162 }
158163 var definition map [string ]interface {}
159164 if err := json .Unmarshal (instance .Spec .Definition .Raw , & definition ); err != nil {
160- instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .PolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .PolicyReadyErrorMessage , err .Error ()))
165+ instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .RabbitMQPolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .RabbitMQPolicyReadyErrorMessage , err .Error ()))
161166 return ctrl.Result {}, err
162167 }
163168 err = apiClient .CreateOrUpdatePolicy (vhostName , policyName , instance .Spec .Pattern , definition , instance .Spec .Priority , applyTo )
164169 if err != nil {
165- instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .PolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .PolicyReadyErrorMessage , err .Error ()))
170+ instance .Status .Conditions .Set (condition .FalseCondition (rabbitmqv1 .RabbitMQPolicyReadyCondition , condition .ErrorReason , condition .SeverityWarning , rabbitmqv1 .RabbitMQPolicyReadyErrorMessage , err .Error ()))
166171 return ctrl.Result {}, err
167172 }
168173
169- instance .Status .Conditions .MarkTrue (rabbitmqv1 .PolicyReadyCondition , rabbitmqv1 .PolicyReadyMessage )
174+ instance .Status .Conditions .MarkTrue (rabbitmqv1 .RabbitMQPolicyReadyCondition , rabbitmqv1 .RabbitMQPolicyReadyMessage )
170175 instance .Status .Conditions .MarkTrue (condition .ReadyCondition , condition .ReadyMessage )
171176
172177 return ctrl.Result {}, nil
@@ -182,7 +187,10 @@ func (r *RabbitMQPolicyReconciler) reconcileDelete(ctx context.Context, instance
182187 if instance .Spec .VhostRef != "" {
183188 vhost := & rabbitmqv1.RabbitMQVhost {}
184189 err := r .Get (ctx , types.NamespacedName {Name : instance .Spec .VhostRef , Namespace : instance .Namespace }, vhost )
185- if err == nil {
190+ if err != nil && ! k8s_errors .IsNotFound (err ) {
191+ // Log non-NotFound errors but continue with deletion
192+ log .FromContext (ctx ).Error (err , "Failed to get vhost" , "vhost" , instance .Spec .VhostRef )
193+ } else if err == nil {
186194 vhostName = vhost .Spec .Name
187195 if vhostName == "" {
188196 vhostName = "/"
@@ -193,10 +201,16 @@ func (r *RabbitMQPolicyReconciler) reconcileDelete(ctx context.Context, instance
193201 // Get RabbitMQ cluster
194202 rabbit := & rabbitmqclusterv2.RabbitmqCluster {}
195203 err := r .Get (ctx , types.NamespacedName {Name : instance .Spec .RabbitmqClusterName , Namespace : instance .Namespace }, rabbit )
196- if err == nil {
204+ if err != nil && ! k8s_errors .IsNotFound (err ) {
205+ // Log non-NotFound errors but continue with deletion
206+ log .FromContext (ctx ).Error (err , "Failed to get RabbitMQ cluster" , "cluster" , instance .Spec .RabbitmqClusterName )
207+ } else if err == nil {
197208 // Get admin credentials
198209 rabbitSecret , _ , err := oko_secret .GetSecret (ctx , h , rabbit .Status .DefaultUser .SecretReference .Name , instance .Namespace )
199- if err == nil {
210+ if err != nil && ! k8s_errors .IsNotFound (err ) {
211+ // Log non-NotFound errors but continue with deletion
212+ log .FromContext (ctx ).Error (err , "Failed to get admin secret" )
213+ } else if err == nil {
200214 // Create API client
201215 tlsEnabled := rabbit .Spec .TLS .SecretName != ""
202216 protocol := "http"
@@ -208,7 +222,7 @@ func (r *RabbitMQPolicyReconciler) reconcileDelete(ctx context.Context, instance
208222 baseURL := fmt .Sprintf ("%s://%s:%s" , protocol , string (rabbitSecret .Data ["host" ]), managementPort )
209223 apiClient := rabbitmqapi .NewClient (baseURL , string (rabbitSecret .Data ["username" ]), string (rabbitSecret .Data ["password" ]), tlsEnabled )
210224
211- // Delete policy
225+ // Delete policy - ignore NotFound errors
212226 if err := apiClient .DeletePolicy (vhostName , policyName ); err != nil {
213227 // Log error but don't fail deletion - the policy may already be gone
214228 log .FromContext (ctx ).Error (err , "Failed to delete policy from RabbitMQ" , "policy" , policyName , "vhost" , vhostName )
0 commit comments