Skip to content

Commit 3d4c11e

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 3d4c11e

File tree

3 files changed

+93
-43
lines changed

3 files changed

+93
-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: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package controllers_test
22

33
import (
4+
"fmt"
45
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
56
"github.com/rabbitmq/cluster-operator/internal/resource"
67
corev1 "k8s.io/api/core/v1"
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
79
"k8s.io/apimachinery/pkg/types"
810

911
. "github.com/onsi/ginkgo/v2"
@@ -18,19 +20,25 @@ var _ = Describe("Reconcile status", func() {
1820
defaultNamespace = "default"
1921
)
2022

21-
BeforeEach(func() {
23+
AfterEach(func() {
24+
Expect(client.Delete(ctx, cluster)).To(Succeed())
25+
Eventually(func() bool {
26+
rmq := &rabbitmqv1beta1.RabbitmqCluster{}
27+
err := client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, rmq)
28+
return apierrors.IsNotFound(err)
29+
}, 5).Should(BeTrue())
30+
})
31+
32+
It("reconciles the custom resource status", func() {
2233
cluster = &rabbitmqv1beta1.RabbitmqCluster{
2334
ObjectMeta: metav1.ObjectMeta{
2435
Name: "rabbitmq-status",
2536
Namespace: defaultNamespace,
2637
},
2738
}
28-
2939
Expect(client.Create(ctx, cluster)).To(Succeed())
3040
waitForClusterCreation(ctx, cluster, client)
31-
})
3241

33-
It("reconciles the custom resource status", func() {
3442
By("setting the default-user secret details")
3543
rmq := &rabbitmqv1beta1.RabbitmqCluster{}
3644
secretRef := &rabbitmqv1beta1.RabbitmqClusterSecretReference{}
@@ -87,4 +95,56 @@ var _ = Describe("Reconcile status", func() {
8795

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

0 commit comments

Comments
 (0)