Skip to content

Commit 5042a82

Browse files
committed
Set status.defaultUser.serviceReference when vault default
- user is used; this is because downstream, topology operator in this case, may rely on the rabbitmqcluster.status for certain information. topology operator relies on the service reference to get the name of the ingress service to be able to connect to a given rabbitmqcluster
1 parent 8fe0de8 commit 5042a82

File tree

3 files changed

+92
-43
lines changed

3 files changed

+92
-43
lines changed

controllers/rabbitmqcluster_controller.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -261,13 +261,8 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
261261
return ctrl.Result{RequeueAfter: requeueAfter}, err
262262
}
263263

264-
if !rabbitmqCluster.VaultDefaultUserSecretEnabled() {
265-
if err := r.setDefaultUserStatus(ctx, rabbitmqCluster); err != nil {
266-
return ctrl.Result{}, err
267-
}
268-
if err := r.setBinding(ctx, rabbitmqCluster); err != nil {
269-
return ctrl.Result{}, err
270-
}
264+
if err := r.reconcileStatus(ctx, rabbitmqCluster); err != nil {
265+
return ctrl.Result{}, err
271266
}
272267

273268
// By this point the StatefulSet may have finished deploying. Run any

controllers/reconcile_status.go

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,49 +8,44 @@ import (
88
"reflect"
99
)
1010

11-
func (r *RabbitmqClusterReconciler) setDefaultUserStatus(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) error {
12-
13-
defaultUserStatus := &rabbitmqv1beta1.RabbitmqClusterDefaultUser{}
14-
15-
serviceRef := &rabbitmqv1beta1.RabbitmqClusterServiceReference{
16-
Name: rmq.ChildResourceName(""),
17-
Namespace: rmq.Namespace,
18-
}
19-
defaultUserStatus.ServiceReference = serviceRef
11+
// reconcileStatus sets status.defaultUser (secret and service reference) and status.binding.
12+
// when vault is used as secret backend for default user, no user secret object is created
13+
// therefore only status.defaultUser.serviceReference is set.
14+
// status.binding exposes the default user secret which contains the binding
15+
// information for this RabbitmqCluster.
16+
// Default user secret implements the service binding Provisioned Service
17+
// See: https://k8s-service-bindings.github.io/spec/#provisioned-service
18+
func (r *RabbitmqClusterReconciler) reconcileStatus(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) error {
19+
var binding *corev1.LocalObjectReference
2020

21-
secretRef := &rabbitmqv1beta1.RabbitmqClusterSecretReference{
22-
Name: rmq.ChildResourceName(resource.DefaultUserSecretName),
23-
Namespace: rmq.Namespace,
24-
Keys: map[string]string{
25-
"username": "username",
26-
"password": "password",
21+
defaultUserStatus := &rabbitmqv1beta1.RabbitmqClusterDefaultUser{
22+
ServiceReference: &rabbitmqv1beta1.RabbitmqClusterServiceReference{
23+
Name: rmq.ChildResourceName(""),
24+
Namespace: rmq.Namespace,
2725
},
2826
}
29-
defaultUserStatus.SecretReference = secretRef
3027

31-
if !reflect.DeepEqual(rmq.Status.DefaultUser, defaultUserStatus) {
32-
rmq.Status.DefaultUser = defaultUserStatus
33-
if err := r.Status().Update(ctx, rmq); err != nil {
34-
return err
28+
if !rmq.VaultDefaultUserSecretEnabled() {
29+
defaultUserStatus.SecretReference = &rabbitmqv1beta1.RabbitmqClusterSecretReference{
30+
Name: rmq.ChildResourceName(resource.DefaultUserSecretName),
31+
Namespace: rmq.Namespace,
32+
Keys: map[string]string{
33+
"username": "username",
34+
"password": "password",
35+
},
36+
}
37+
binding = &corev1.LocalObjectReference{
38+
Name: rmq.ChildResourceName(resource.DefaultUserSecretName),
3539
}
3640
}
3741

38-
return nil
39-
}
40-
41-
// Status.Binding exposes the default user secret which contains the binding
42-
// information for this RabbitmqCluster.
43-
// Default user secret implements the service binding Provisioned Service
44-
// See: https://k8s-service-bindings.github.io/spec/#provisioned-service
45-
func (r *RabbitmqClusterReconciler) setBinding(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) error {
46-
binding := &corev1.LocalObjectReference{
47-
Name: rmq.ChildResourceName(resource.DefaultUserSecretName),
48-
}
49-
if !reflect.DeepEqual(rmq.Status.Binding, binding) {
42+
if !reflect.DeepEqual(rmq.Status.DefaultUser, defaultUserStatus) || !reflect.DeepEqual(rmq.Status.Binding, binding) {
43+
rmq.Status.DefaultUser = defaultUserStatus
5044
rmq.Status.Binding = binding
5145
if err := r.Status().Update(ctx, rmq); err != nil {
5246
return err
5347
}
5448
}
49+
5550
return nil
5651
}

controllers/reconcile_status_test.go

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
55
"github.com/rabbitmq/cluster-operator/internal/resource"
66
corev1 "k8s.io/api/core/v1"
7+
apierrors "k8s.io/apimachinery/pkg/api/errors"
78
"k8s.io/apimachinery/pkg/types"
89

910
. "github.com/onsi/ginkgo/v2"
@@ -18,19 +19,25 @@ var _ = Describe("Reconcile status", func() {
1819
defaultNamespace = "default"
1920
)
2021

21-
BeforeEach(func() {
22+
AfterEach(func() {
23+
Expect(client.Delete(ctx, cluster)).To(Succeed())
24+
Eventually(func() bool {
25+
rmq := &rabbitmqv1beta1.RabbitmqCluster{}
26+
err := client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, rmq)
27+
return apierrors.IsNotFound(err)
28+
}, 5).Should(BeTrue())
29+
})
30+
31+
It("reconciles the custom resource status", func() {
2232
cluster = &rabbitmqv1beta1.RabbitmqCluster{
2333
ObjectMeta: metav1.ObjectMeta{
2434
Name: "rabbitmq-status",
2535
Namespace: defaultNamespace,
2636
},
2737
}
28-
2938
Expect(client.Create(ctx, cluster)).To(Succeed())
3039
waitForClusterCreation(ctx, cluster, client)
31-
})
3240

33-
It("reconciles the custom resource status", func() {
3441
By("setting the default-user secret details")
3542
rmq := &rabbitmqv1beta1.RabbitmqCluster{}
3643
secretRef := &rabbitmqv1beta1.RabbitmqClusterSecretReference{}
@@ -87,4 +94,56 @@ var _ = Describe("Reconcile status", func() {
8794

8895
Expect(binding.Name).To(Equal(rmq.ChildResourceName(resource.DefaultUserSecretName)))
8996
})
97+
98+
When("secret backend vault is enabled", func() {
99+
It("sets service reference status correctly", func() {
100+
cluster = &rabbitmqv1beta1.RabbitmqCluster{
101+
ObjectMeta: metav1.ObjectMeta{
102+
Name: "rabbitmq-vault-status",
103+
Namespace: defaultNamespace,
104+
},
105+
Spec: rabbitmqv1beta1.RabbitmqClusterSpec{
106+
SecretBackend: rabbitmqv1beta1.SecretBackend{
107+
Vault: &rabbitmqv1beta1.VaultSpec{
108+
Role: "rabbit",
109+
DefaultUserPath: "test-test",
110+
},
111+
},
112+
},
113+
}
114+
Expect(client.Create(ctx, cluster)).To(Succeed())
115+
waitForClusterCreation(ctx, cluster, client)
116+
117+
By("setting the service details")
118+
rmq := &rabbitmqv1beta1.RabbitmqCluster{}
119+
serviceRef := &rabbitmqv1beta1.RabbitmqClusterServiceReference{}
120+
Eventually(func() *rabbitmqv1beta1.RabbitmqClusterServiceReference {
121+
err := client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, rmq)
122+
if err != nil {
123+
return nil
124+
}
125+
if rmq.Status.DefaultUser != nil && rmq.Status.DefaultUser.ServiceReference != nil {
126+
serviceRef = rmq.Status.DefaultUser.ServiceReference
127+
return serviceRef
128+
}
129+
return nil
130+
}, 5).ShouldNot(BeNil())
131+
132+
Expect(serviceRef.Name).To(Equal(rmq.ChildResourceName("")))
133+
Expect(serviceRef.Namespace).To(Equal(rmq.Namespace))
134+
135+
By("leaving status.binding and secret reference empty")
136+
rmq = &rabbitmqv1beta1.RabbitmqCluster{}
137+
Consistently(func() *corev1.LocalObjectReference {
138+
Expect(client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, rmq)).To(Succeed())
139+
return rmq.Status.Binding
140+
}).Should(BeNil())
141+
142+
Consistently(func() *rabbitmqv1beta1.RabbitmqClusterSecretReference {
143+
Expect(client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, rmq)).To(Succeed())
144+
return rmq.Status.DefaultUser.SecretReference
145+
}).Should(BeNil())
146+
})
147+
})
148+
90149
})

0 commit comments

Comments
 (0)