Skip to content

Commit f2ab5ce

Browse files
authored
Extract operator defaults to a separate func (#1068)
- to keep Reconciler shorter and more concise
1 parent 79c0fa7 commit f2ab5ce

File tree

3 files changed

+126
-43
lines changed

3 files changed

+126
-43
lines changed

controllers/rabbitmqcluster_controller.go

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -117,49 +117,8 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
117117
return ctrl.Result{}, nil
118118
}
119119

120-
if rabbitmqCluster.Spec.Image == "" {
121-
rabbitmqCluster.Spec.Image = r.DefaultRabbitmqImage
122-
if err = r.Update(ctx, rabbitmqCluster); err != nil {
123-
if k8serrors.IsConflict(err) {
124-
logger.Info("failed to update image because of conflict; requeueing...",
125-
"namespace", rabbitmqCluster.Namespace,
126-
"name", rabbitmqCluster.Name)
127-
return ctrl.Result{RequeueAfter: 2 * time.Second}, nil
128-
}
129-
return ctrl.Result{}, err
130-
}
131-
}
132-
133-
if rabbitmqCluster.Spec.ImagePullSecrets == nil {
134-
// split the comma separated list of default image pull secrets from
135-
// the 'DEFAULT_IMAGE_PULL_SECRETS' env var, but ignore empty strings.
136-
for _, reference := range strings.Split(r.DefaultImagePullSecrets, ",") {
137-
if len(reference) > 0 {
138-
rabbitmqCluster.Spec.ImagePullSecrets = append(rabbitmqCluster.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: reference})
139-
}
140-
}
141-
if err = r.Update(ctx, rabbitmqCluster); err != nil {
142-
if k8serrors.IsConflict(err) {
143-
logger.Info("failed to update image pull secrets because of conflict; requeueing...",
144-
"namespace", rabbitmqCluster.Namespace,
145-
"name", rabbitmqCluster.Name)
146-
return ctrl.Result{RequeueAfter: 2 * time.Second}, nil
147-
}
148-
return ctrl.Result{}, err
149-
}
150-
}
151-
152-
if rabbitmqCluster.UsesDefaultUserUpdaterImage() {
153-
rabbitmqCluster.Spec.SecretBackend.Vault.DefaultUserUpdaterImage = &r.DefaultUserUpdaterImage
154-
if err = r.Update(ctx, rabbitmqCluster); err != nil {
155-
if k8serrors.IsConflict(err) {
156-
logger.Info("failed to update image because of conflict; requeueing...",
157-
"namespace", rabbitmqCluster.Namespace,
158-
"name", rabbitmqCluster.Name)
159-
return ctrl.Result{RequeueAfter: 2 * time.Second}, nil
160-
}
161-
return ctrl.Result{}, err
162-
}
120+
if requeueAfter, err := r.reconcileOperatorDefaults(ctx, rabbitmqCluster); err != nil || requeueAfter > 0 {
121+
return ctrl.Result{RequeueAfter: requeueAfter}, err
163122
}
164123

165124
// Ensure the resource have a deletion marker
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package controllers
2+
3+
import (
4+
"context"
5+
"fmt"
6+
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
7+
corev1 "k8s.io/api/core/v1"
8+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
9+
ctrl "sigs.k8s.io/controller-runtime"
10+
"strings"
11+
"time"
12+
)
13+
14+
// reconcileOperatorDefaults updates current rabbitmqCluster with operator defaults from the Reconciler
15+
// it handles RabbitMQ image, imagePullSecrets, and user updater image
16+
func (r *RabbitmqClusterReconciler) reconcileOperatorDefaults(ctx context.Context, rabbitmqCluster *rabbitmqv1beta1.RabbitmqCluster) (time.Duration, error) {
17+
if rabbitmqCluster.Spec.Image == "" {
18+
rabbitmqCluster.Spec.Image = r.DefaultRabbitmqImage
19+
if requeue, err := r.updateRabbitmqCluster(ctx, rabbitmqCluster, "image"); err != nil {
20+
return requeue, err
21+
}
22+
}
23+
24+
if rabbitmqCluster.Spec.ImagePullSecrets == nil {
25+
// split the comma separated list of default image pull secrets from
26+
// the 'DEFAULT_IMAGE_PULL_SECRETS' env var, but ignore empty strings.
27+
for _, reference := range strings.Split(r.DefaultImagePullSecrets, ",") {
28+
if len(reference) > 0 {
29+
rabbitmqCluster.Spec.ImagePullSecrets = append(rabbitmqCluster.Spec.ImagePullSecrets, corev1.LocalObjectReference{Name: reference})
30+
}
31+
}
32+
if requeue, err := r.updateRabbitmqCluster(ctx, rabbitmqCluster, "image pull secrets"); err != nil {
33+
return requeue, err
34+
}
35+
}
36+
37+
if rabbitmqCluster.UsesDefaultUserUpdaterImage() {
38+
rabbitmqCluster.Spec.SecretBackend.Vault.DefaultUserUpdaterImage = &r.DefaultUserUpdaterImage
39+
if requeue, err := r.updateRabbitmqCluster(ctx, rabbitmqCluster, "default user image"); err != nil {
40+
return requeue, err
41+
}
42+
}
43+
return 0, nil
44+
}
45+
46+
// updateRabbitmqCluster updates a RabbitmqCluster with the given definition
47+
// it returns a 2 seconds requeue request if update failed due to conflict error
48+
func (r *RabbitmqClusterReconciler) updateRabbitmqCluster(ctx context.Context, rabbitmqCluster *rabbitmqv1beta1.RabbitmqCluster, updateType string) (time.Duration, error) {
49+
logger := ctrl.LoggerFrom(ctx)
50+
if err := r.Update(ctx, rabbitmqCluster); err != nil {
51+
if k8serrors.IsConflict(err) {
52+
logger.Info(fmt.Sprintf("failed to update %s because of conflict; requeueing...", updateType),
53+
"namespace", rabbitmqCluster.Namespace,
54+
"name", rabbitmqCluster.Name)
55+
return 2 * time.Second, nil
56+
}
57+
return 0, err
58+
}
59+
return 0, nil
60+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package controllers_test
2+
3+
import (
4+
. "github.com/onsi/ginkgo/v2"
5+
. "github.com/onsi/gomega"
6+
. "github.com/onsi/gomega/gstruct"
7+
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
8+
corev1 "k8s.io/api/core/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/apimachinery/pkg/types"
11+
)
12+
13+
var _ = Describe("ReconcileOperatorDefaults", func() {
14+
var cluster *rabbitmqv1beta1.RabbitmqCluster
15+
16+
BeforeEach(func() {
17+
cluster = &rabbitmqv1beta1.RabbitmqCluster{
18+
ObjectMeta: metav1.ObjectMeta{
19+
Name: "test-default",
20+
Namespace: "default",
21+
},
22+
Spec: rabbitmqv1beta1.RabbitmqClusterSpec{
23+
SecretBackend: rabbitmqv1beta1.SecretBackend{
24+
Vault: &rabbitmqv1beta1.VaultSpec{
25+
DefaultUserPath: "some-path",
26+
},
27+
},
28+
},
29+
}
30+
31+
Expect(client.Create(ctx, cluster)).To(Succeed())
32+
waitForClusterCreation(ctx, cluster, client)
33+
})
34+
35+
AfterEach(func() {
36+
Expect(client.Delete(ctx, cluster)).To(Succeed())
37+
})
38+
39+
It("handles operator defaults correctly", func() {
40+
fetchedCluster := &rabbitmqv1beta1.RabbitmqCluster{}
41+
Expect(client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, fetchedCluster)).To(Succeed())
42+
43+
By("setting the image spec with the default image")
44+
Expect(fetchedCluster.Spec.Image).To(Equal(defaultRabbitmqImage))
45+
46+
By("setting the default user updater image to the controller default")
47+
Expect(fetchedCluster.Spec.SecretBackend.Vault.DefaultUserUpdaterImage).To(PointTo(Equal(defaultUserUpdaterImage)))
48+
49+
By("setting the default imagePullSecrets")
50+
Expect(statefulSet(ctx, cluster).Spec.Template.Spec.ImagePullSecrets).To(ConsistOf(
51+
[]corev1.LocalObjectReference{
52+
{
53+
Name: "image-secret-1",
54+
},
55+
{
56+
Name: "image-secret-2",
57+
},
58+
{
59+
Name: "image-secret-3",
60+
},
61+
},
62+
))
63+
})
64+
})

0 commit comments

Comments
 (0)