Skip to content

Commit 85b6224

Browse files
committed
pr feedback 1
1 parent 36272eb commit 85b6224

14 files changed

+260
-164
lines changed

apis/bases/rabbitmq.openstack.org_rabbitmqvhosts.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ spec:
6060
name:
6161
default: /
6262
description: Name - the vhost name in RabbitMQ (defaults to "/")
63+
minLength: 1
6364
type: string
6465
rabbitmqClusterName:
6566
description: RabbitmqClusterName - the name of the RabbitMQ cluster

apis/rabbitmq/v1beta1/conditions.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import (
2323
const (
2424
// TransportURLReadyCondition Status=True condition which indicates if TransportURL is configured and operational
2525
TransportURLReadyCondition condition.Type = "TransportURLReady"
26+
27+
// TransportURLFinalizer - finalizer to add to RabbitMQUsers owned by TransportURL
28+
TransportURLFinalizer = "transporturl.rabbitmq.openstack.org/finalizer"
2629
)
2730

2831
// TransportURL Reasons used by API objects.

apis/rabbitmq/v1beta1/rabbitmq_types.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ const (
4343
CrMaxLengthCorrection = 11
4444
errInvalidOverride = "invalid spec override (%s)"
4545
warnOverrideStatefulSet = "%s: is deprecated and will be removed in a future API version"
46+
47+
// Queue types
48+
// QueueTypeMirrored - mirrored queue type
49+
QueueTypeMirrored = "Mirrored"
50+
// QueueTypeQuorum - quorum queue type
51+
QueueTypeQuorum = "Quorum"
52+
// QueueTypeNone - no special queue type
53+
QueueTypeNone = "None"
4654
)
4755

4856
// PodOverride defines per-pod service configurations

apis/rabbitmq/v1beta1/rabbitmqpolicy_types.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,15 @@ func (instance RabbitMQPolicy) IsReady() bool {
104104
}
105105

106106
const (
107-
// PolicyReadyCondition indicates that the policy is ready
108-
PolicyReadyCondition condition.Type = "PolicyReady"
107+
// RabbitMQPolicyReadyCondition indicates that the policy is ready
108+
RabbitMQPolicyReadyCondition condition.Type = "RabbitMQPolicyReady"
109109

110-
// PolicyReadyMessage is the message for the PolicyReady condition
111-
PolicyReadyMessage = "RabbitMQ policy is ready"
110+
// RabbitMQPolicyReadyMessage is the message for the RabbitMQPolicyReady condition
111+
RabbitMQPolicyReadyMessage = "RabbitMQ policy is ready"
112112

113-
// PolicyReadyInitMessage is the message for the PolicyReady condition when not started
114-
PolicyReadyInitMessage = "RabbitMQ policy not started"
113+
// RabbitMQPolicyReadyInitMessage is the message for the RabbitMQPolicyReady condition when not started
114+
RabbitMQPolicyReadyInitMessage = "RabbitMQ policy not started"
115115

116-
// PolicyReadyErrorMessage is the message format for the PolicyReady condition when an error occurs
117-
PolicyReadyErrorMessage = "RabbitMQ policy error occurred %s"
116+
// RabbitMQPolicyReadyErrorMessage is the message format for the RabbitMQPolicyReady condition when an error occurs
117+
RabbitMQPolicyReadyErrorMessage = "RabbitMQ policy error occurred %s"
118118
)

apis/rabbitmq/v1beta1/rabbitmquser_types.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,15 @@ const (
120120
// UserFinalizer - finalizer to protect user from deletion when owned by TransportURL
121121
UserFinalizer = "rabbitmquser.rabbitmq.openstack.org/finalizer"
122122

123-
// UserReadyCondition indicates that the user is ready
124-
UserReadyCondition condition.Type = "UserReady"
123+
// RabbitMQUserReadyCondition indicates that the user is ready
124+
RabbitMQUserReadyCondition condition.Type = "RabbitMQUserReady"
125125

126-
// UserReadyMessage is the message for the UserReady condition
127-
UserReadyMessage = "RabbitMQ user is ready"
126+
// RabbitMQUserReadyMessage is the message for the RabbitMQUserReady condition
127+
RabbitMQUserReadyMessage = "RabbitMQ user is ready"
128128

129-
// UserReadyInitMessage is the message for the UserReady condition when not started
130-
UserReadyInitMessage = "RabbitMQ user not started"
129+
// RabbitMQUserReadyInitMessage is the message for the RabbitMQUserReady condition when not started
130+
RabbitMQUserReadyInitMessage = "RabbitMQ user not started"
131131

132-
// UserReadyErrorMessage is the message format for the UserReady condition when an error occurs
133-
UserReadyErrorMessage = "RabbitMQ user error occurred %s"
132+
// RabbitMQUserReadyErrorMessage is the message format for the RabbitMQUserReady condition when an error occurs
133+
RabbitMQUserReadyErrorMessage = "RabbitMQ user error occurred %s"
134134
)

apis/rabbitmq/v1beta1/rabbitmqvhost_types.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type RabbitMQVhostSpec struct {
2828
RabbitmqClusterName string `json:"rabbitmqClusterName"`
2929

3030
// +kubebuilder:validation:Optional
31+
// +kubebuilder:validation:MinLength=1
3132
// +kubebuilder:default="/"
3233
// Name - the vhost name in RabbitMQ (defaults to "/")
3334
Name string `json:"name"`
@@ -81,15 +82,15 @@ const (
8182
// VhostFinalizer - finalizer to protect vhost from deletion when owned by TransportURL
8283
VhostFinalizer = "rabbitmqvhost.rabbitmq.openstack.org/finalizer"
8384

84-
// VhostReadyCondition indicates that the vhost is ready
85-
VhostReadyCondition condition.Type = "VhostReady"
85+
// RabbitMQVhostReadyCondition indicates that the vhost is ready
86+
RabbitMQVhostReadyCondition condition.Type = "RabbitMQVhostReady"
8687

87-
// VhostReadyMessage is the message for the VhostReady condition
88-
VhostReadyMessage = "RabbitMQ vhost is ready"
88+
// RabbitMQVhostReadyMessage is the message for the RabbitMQVhostReady condition
89+
RabbitMQVhostReadyMessage = "RabbitMQ vhost is ready"
8990

90-
// VhostReadyInitMessage is the message for the VhostReady condition when not started
91-
VhostReadyInitMessage = "RabbitMQ vhost not started"
91+
// RabbitMQVhostReadyInitMessage is the message for the RabbitMQVhostReady condition when not started
92+
RabbitMQVhostReadyInitMessage = "RabbitMQ vhost not started"
9293

93-
// VhostReadyErrorMessage is the message format for the VhostReady condition when an error occurs
94-
VhostReadyErrorMessage = "RabbitMQ vhost error occurred %s"
94+
// RabbitMQVhostReadyErrorMessage is the message format for the RabbitMQVhostReady condition when an error occurs
95+
RabbitMQVhostReadyErrorMessage = "RabbitMQ vhost error occurred %s"
9596
)

config/crd/bases/rabbitmq.openstack.org_rabbitmqvhosts.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ spec:
6060
name:
6161
default: /
6262
description: Name - the vhost name in RabbitMQ (defaults to "/")
63+
minLength: 1
6364
type: string
6465
rabbitmqClusterName:
6566
description: RabbitmqClusterName - the name of the RabbitMQ cluster

internal/controller/rabbitmq/rabbitmq_controller.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ct
466466
// Let's wait DeploymentReadyCondition=True to apply the policy
467467
// QueueType should never be nil due to webhook defaulting, but add safety check
468468
if instance.Spec.QueueType != nil {
469-
if *instance.Spec.QueueType == "Mirrored" && *instance.Spec.Replicas > 1 && instance.Status.QueueType != "Mirrored" {
469+
if *instance.Spec.QueueType == rabbitmqv1beta1.QueueTypeMirrored && *instance.Spec.Replicas > 1 && instance.Status.QueueType != rabbitmqv1beta1.QueueTypeMirrored {
470470
Log.Info("ha-all policy not present. Applying.")
471471
err := updateMirroredPolicy(ctx, helper, instance, true)
472472
if err != nil {
@@ -478,8 +478,8 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ct
478478
condition.DeploymentReadyErrorMessage, err.Error()))
479479
return ctrl.Result{}, err
480480
}
481-
instance.Status.QueueType = "Mirrored"
482-
} else if *instance.Spec.QueueType != "Mirrored" && instance.Status.QueueType == "Mirrored" {
481+
instance.Status.QueueType = rabbitmqv1beta1.QueueTypeMirrored
482+
} else if *instance.Spec.QueueType != rabbitmqv1beta1.QueueTypeMirrored && instance.Status.QueueType == rabbitmqv1beta1.QueueTypeMirrored {
483483
Log.Info("QueueType changed from Mirrored. Removing ha-all policy")
484484
err := updateMirroredPolicy(ctx, helper, instance, false)
485485
if err != nil {
@@ -495,16 +495,16 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ct
495495
}
496496

497497
// Update status for Quorum queue type
498-
if *instance.Spec.QueueType == "Quorum" && instance.Status.QueueType != "Quorum" {
498+
if *instance.Spec.QueueType == rabbitmqv1beta1.QueueTypeQuorum && instance.Status.QueueType != rabbitmqv1beta1.QueueTypeQuorum {
499499
Log.Info("Setting queue type status to quorum")
500-
instance.Status.QueueType = "Quorum"
501-
} else if *instance.Spec.QueueType != "Quorum" && instance.Status.QueueType == "Quorum" {
500+
instance.Status.QueueType = rabbitmqv1beta1.QueueTypeQuorum
501+
} else if *instance.Spec.QueueType != rabbitmqv1beta1.QueueTypeQuorum && instance.Status.QueueType == rabbitmqv1beta1.QueueTypeQuorum {
502502
Log.Info("Removing quorum queue type status")
503503
instance.Status.QueueType = ""
504504
}
505505

506506
// Update status for None queue type
507-
if *instance.Spec.QueueType == "None" && instance.Status.QueueType != "" {
507+
if *instance.Spec.QueueType == rabbitmqv1beta1.QueueTypeNone && instance.Status.QueueType != "" {
508508
Log.Info("Setting queue type status to None (clearing)")
509509
instance.Status.QueueType = ""
510510
}

internal/controller/rabbitmq/rabbitmqpolicy_controller.go

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

Comments
 (0)