@@ -17,9 +17,12 @@ limitations under the License.
1717package v1beta1
1818
1919import (
20+ "fmt"
21+
2022 . "github.com/onsi/ginkgo/v2" //revive:disable:dot-imports
2123 . "github.com/onsi/gomega" //revive:disable:dot-imports
2224 rabbitmqv1beta1 "github.com/openstack-k8s-operators/infra-operator/apis/rabbitmq/v1beta1"
25+ corev1 "k8s.io/api/core/v1"
2326 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2427)
2528
@@ -126,6 +129,93 @@ var _ = Describe("RabbitMQUser webhook", func() {
126129 Expect (err ).To (HaveOccurred ())
127130 Expect (err .Error ()).To (ContainSubstring ("invalid character" ))
128131 })
132+
133+ It ("should reject username matching the cluster's default user" , func () {
134+ clusterName := "my-cluster"
135+ defaultUsername := fmt .Sprintf ("default_user_%s" , clusterName )
136+
137+ // Create the default user secret that the cluster controller would create
138+ secret := & corev1.Secret {
139+ ObjectMeta : metav1.ObjectMeta {
140+ Name : fmt .Sprintf ("%s-default-user" , clusterName ),
141+ Namespace : "default" ,
142+ },
143+ Data : map [string ][]byte {
144+ "username" : []byte (defaultUsername ),
145+ "password" : []byte ("secret-password" ),
146+ },
147+ }
148+ Expect (k8sClient .Create (ctx , secret )).To (Succeed ())
149+ DeferCleanup (func () {
150+ Expect (k8sClient .Delete (ctx , secret )).To (Succeed ())
151+ })
152+
153+ user := & rabbitmqv1beta1.RabbitMQUser {
154+ ObjectMeta : metav1.ObjectMeta {
155+ Name : "conflicting-user" ,
156+ Namespace : "default" ,
157+ },
158+ Spec : rabbitmqv1beta1.RabbitMQUserSpec {
159+ RabbitmqClusterName : clusterName ,
160+ Username : defaultUsername ,
161+ },
162+ }
163+
164+ _ , err := user .ValidateCreate (k8sClient )
165+ Expect (err ).To (HaveOccurred ())
166+ Expect (err .Error ()).To (ContainSubstring ("conflicts with the default user" ))
167+ })
168+
169+ It ("should accept username not matching the cluster's default user" , func () {
170+ clusterName := "other-cluster"
171+ defaultUsername := fmt .Sprintf ("default_user_%s" , clusterName )
172+
173+ // Create the default user secret
174+ secret := & corev1.Secret {
175+ ObjectMeta : metav1.ObjectMeta {
176+ Name : fmt .Sprintf ("%s-default-user" , clusterName ),
177+ Namespace : "default" ,
178+ },
179+ Data : map [string ][]byte {
180+ "username" : []byte (defaultUsername ),
181+ "password" : []byte ("secret-password" ),
182+ },
183+ }
184+ Expect (k8sClient .Create (ctx , secret )).To (Succeed ())
185+ DeferCleanup (func () {
186+ Expect (k8sClient .Delete (ctx , secret )).To (Succeed ())
187+ })
188+
189+ user := & rabbitmqv1beta1.RabbitMQUser {
190+ ObjectMeta : metav1.ObjectMeta {
191+ Name : "non-conflicting-user" ,
192+ Namespace : "default" ,
193+ },
194+ Spec : rabbitmqv1beta1.RabbitMQUserSpec {
195+ RabbitmqClusterName : clusterName ,
196+ Username : "my-custom-user" ,
197+ },
198+ }
199+
200+ _ , err := user .ValidateCreate (k8sClient )
201+ Expect (err ).NotTo (HaveOccurred ())
202+ })
203+
204+ It ("should accept username when cluster default user secret does not exist" , func () {
205+ user := & rabbitmqv1beta1.RabbitMQUser {
206+ ObjectMeta : metav1.ObjectMeta {
207+ Name : "early-user" ,
208+ Namespace : "default" ,
209+ },
210+ Spec : rabbitmqv1beta1.RabbitMQUserSpec {
211+ RabbitmqClusterName : "nonexistent-cluster" ,
212+ Username : "default_user_nonexistent-cluster" ,
213+ },
214+ }
215+
216+ _ , err := user .ValidateCreate (k8sClient )
217+ Expect (err ).NotTo (HaveOccurred ())
218+ })
129219 })
130220
131221 Context ("ValidateUpdate method" , func () {
0 commit comments