Skip to content

Commit 39a33a2

Browse files
authored
Merge pull request #1031 from rabbitmq/vault-svc-reference
Vault svc reference
2 parents 5b1ac79 + 5042a82 commit 39a33a2

File tree

3 files changed

+94
-45
lines changed

3 files changed

+94
-45
lines changed

controllers/rabbitmqcluster_controller.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
167167
return ctrl.Result{}, err
168168
}
169169

170-
if requeueAfter, err := r.updateStatus(ctx, rabbitmqCluster); err != nil || requeueAfter > 0 {
170+
if requeueAfter, err := r.updateStatusConditions(ctx, rabbitmqCluster); err != nil || requeueAfter > 0 {
171171
return ctrl.Result{RequeueAfter: requeueAfter}, err
172172
}
173173

@@ -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
@@ -322,7 +317,7 @@ func (r *RabbitmqClusterReconciler) logAndRecordOperationResult(logger logr.Logg
322317
}
323318
}
324319

325-
func (r *RabbitmqClusterReconciler) updateStatus(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) (time.Duration, error) {
320+
func (r *RabbitmqClusterReconciler) updateStatusConditions(ctx context.Context, rmq *rabbitmqv1beta1.RabbitmqCluster) (time.Duration, error) {
326321
logger := ctrl.LoggerFrom(ctx)
327322
childResources, err := r.getChildResources(ctx, rmq)
328323
if err != nil {

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)