Skip to content

Commit 60556f8

Browse files
user controller: allow definition of a username without password (#483)
1 parent 4ce9927 commit 60556f8

2 files changed

Lines changed: 63 additions & 1 deletion

File tree

controllers/user_controller.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"context"
1414
"errors"
1515
"fmt"
16+
1617
topology "github.com/rabbitmq/messaging-topology-operator/api/v1beta1"
1718
"github.com/rabbitmq/messaging-topology-operator/internal"
1819
"github.com/rabbitmq/messaging-topology-operator/rabbitmqclient"
@@ -52,6 +53,15 @@ func (r *UserReconciler) declareCredentials(ctx context.Context, user *topology.
5253
logger.Error(err, "failed to generate credentials")
5354
return "", err
5455
}
56+
// Password wasn't in the provided input secret we need to generate a random one
57+
if password == "" {
58+
password, err = internal.RandomEncodedString(24)
59+
if err != nil {
60+
return "", fmt.Errorf("failed to generate random password: %w", err)
61+
}
62+
63+
}
64+
5565
logger.Info("Credentials generated for User", "user", user.Name, "generatedUsername", username)
5666

5767
credentialSecret := corev1.Secret{
@@ -133,7 +143,7 @@ func (r *UserReconciler) importCredentials(ctx context.Context, secretName, secr
133143
}
134144
password, ok := credentialsSecret.Data["password"]
135145
if !ok {
136-
return "", "", fmt.Errorf("could not find password key in credentials secret: %s", credentialsSecret.Name)
146+
return string(username), "", nil
137147
}
138148

139149
logger.Info("Retrieved credentials from Secret", "secretName", secretName, "retrievedUsername", string(username))

system_tests/user_system_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,56 @@ var _ = Describe("Users", func() {
192192
Expect(generatedSecret.Data).To(HaveKeyWithValue("password", []uint8("-grace.hopper_9453$")))
193193
})
194194
})
195+
When("providing a pre-defined username but autogenerated password", func() {
196+
var credentialSecret corev1.Secret
197+
BeforeEach(func() {
198+
credentialSecret = corev1.Secret{
199+
ObjectMeta: metav1.ObjectMeta{
200+
Name: "credential-list-secret",
201+
Namespace: namespace,
202+
},
203+
Type: corev1.SecretTypeOpaque,
204+
Data: map[string][]byte{
205+
"some.irrelevant.key": []byte("some-useless-value"),
206+
"username": []byte("`got*special_ch$racter5"),
207+
},
208+
}
209+
Expect(k8sClient.Create(ctx, &credentialSecret, &client.CreateOptions{})).To(Succeed())
210+
user = &topology.User{
211+
ObjectMeta: metav1.ObjectMeta{
212+
Name: "user-2",
213+
Namespace: namespace,
214+
},
215+
Spec: topology.UserSpec{
216+
RabbitmqClusterReference: topology.RabbitmqClusterReference{
217+
Name: rmq.Name,
218+
},
219+
ImportCredentialsSecret: &corev1.LocalObjectReference{
220+
Name: credentialSecret.Name,
221+
},
222+
},
223+
}
224+
})
225+
AfterEach(func() {
226+
Expect(k8sClient.Delete(context.Background(), &credentialSecret)).ToNot(HaveOccurred())
227+
Expect(k8sClient.Delete(context.Background(), user)).To(Succeed())
228+
})
229+
230+
It("sets the value of the Secret according to the provided user", func() {
231+
By("declaring user")
232+
Expect(k8sClient.Create(ctx, user, &client.CreateOptions{})).To(Succeed())
233+
234+
By("Creating a new Secret with the provided credentials secret")
235+
generatedSecretKey := types.NamespacedName{
236+
Name: "user-2-user-credentials",
237+
Namespace: namespace,
238+
}
239+
var generatedSecret = &corev1.Secret{}
240+
Eventually(func() error {
241+
return k8sClient.Get(ctx, generatedSecretKey, generatedSecret)
242+
}, 30, 2).Should(Succeed())
243+
Expect(generatedSecret.Data).To(HaveKeyWithValue("username", []uint8("`got*special_ch$racter5")))
244+
Expect(generatedSecret.Data).To(HaveKey("password"))
245+
})
246+
})
195247
})

0 commit comments

Comments
 (0)