@@ -31,6 +31,18 @@ import (
3131
3232var rabbitmquserlog = logf .Log .WithName ("rabbitmquser-resource" )
3333
34+ //+kubebuilder:webhook:path=/mutate-rabbitmq-openstack-org-v1beta1-rabbitmquser,mutating=true,failurePolicy=fail,sideEffects=None,groups=rabbitmq.openstack.org,resources=rabbitmqusers,verbs=create;update,versions=v1beta1,name=mrabbitmquser.kb.io,admissionReviewVersions=v1
35+
36+ // Default implements defaulting for RabbitMQUser
37+ func (r * RabbitMQUser ) Default (_ client.Client ) {
38+ rabbitmquserlog .Info ("default" , "name" , r .Name )
39+
40+ // Default the username to the CR name if not specified
41+ if r .Spec .Username == "" {
42+ r .Spec .Username = r .Name
43+ }
44+ }
45+
3446//+kubebuilder:webhook:path=/validate-rabbitmq-openstack-org-v1beta1-rabbitmquser,mutating=false,failurePolicy=fail,sideEffects=None,groups=rabbitmq.openstack.org,resources=rabbitmqusers,verbs=create;update,versions=v1beta1,name=vrabbitmquser.kb.io,admissionReviewVersions=v1
3547
3648// ValidateCreate validates the RabbitMQUser on creation
@@ -40,8 +52,28 @@ func (r *RabbitMQUser) ValidateCreate(k8sClient client.Client) (admission.Warnin
4052}
4153
4254// ValidateUpdate validates the RabbitMQUser on update
43- func (r * RabbitMQUser ) ValidateUpdate (k8sClient client.Client , _ runtime.Object ) (admission.Warnings , error ) {
55+ func (r * RabbitMQUser ) ValidateUpdate (k8sClient client.Client , old runtime.Object ) (admission.Warnings , error ) {
4456 rabbitmquserlog .Info ("validate update" , "name" , r .Name )
57+
58+ oldUser , ok := old .(* RabbitMQUser )
59+ if ! ok {
60+ return nil , fmt .Errorf ("expected RabbitMQUser but got %T" , old )
61+ }
62+
63+ // Prevent changing the username after creation
64+ if r .Spec .Username != oldUser .Spec .Username {
65+ return nil , apierrors .NewInvalid (
66+ schema.GroupKind {Group : "rabbitmq.openstack.org" , Kind : "RabbitMQUser" },
67+ r .Name ,
68+ field.ErrorList {
69+ field .Forbidden (
70+ field .NewPath ("spec" , "username" ),
71+ "username cannot be changed after creation" ,
72+ ),
73+ },
74+ )
75+ }
76+
4577 return nil , r .validateUniqueUsername (k8sClient )
4678}
4779
@@ -52,16 +84,6 @@ func (r *RabbitMQUser) ValidateDelete(client.Client) (admission.Warnings, error)
5284
5385// validateUniqueUsername checks that no other RabbitMQUser exists with the same username, vhost, and cluster
5486func (r * RabbitMQUser ) validateUniqueUsername (k8sClient client.Client ) error {
55- if k8sClient == nil {
56- return nil
57- }
58-
59- // Determine the username that will be used
60- username := r .Spec .Username
61- if username == "" {
62- username = r .Name
63- }
64-
6587 // List all RabbitMQUsers in the same namespace
6688 userList := & RabbitMQUserList {}
6789 if err := k8sClient .List (context .TODO (), userList , client .InNamespace (r .Namespace )); err != nil {
@@ -85,22 +107,16 @@ func (r *RabbitMQUser) validateUniqueUsername(k8sClient client.Client) error {
85107 continue
86108 }
87109
88- // Determine the other user's username
89- otherUsername := user .Spec .Username
90- if otherUsername == "" {
91- otherUsername = user .Name
92- }
93-
94110 // If usernames match, reject
95- if username == otherUsername {
111+ if r . Spec . Username == user . Spec . Username {
96112 return apierrors .NewInvalid (
97113 schema.GroupKind {Group : "rabbitmq.openstack.org" , Kind : "RabbitMQUser" },
98114 r .Name ,
99115 field.ErrorList {
100116 field .Duplicate (
101117 field .NewPath ("spec" , "username" ),
102118 fmt .Sprintf ("username %q already exists in vhost %q on cluster %q (existing RabbitMQUser: %s)" ,
103- username , r .Spec .VhostRef , r .Spec .RabbitmqClusterName , user .Name ),
119+ r . Spec . Username , r .Spec .VhostRef , r .Spec .RabbitmqClusterName , user .Name ),
104120 ),
105121 },
106122 )
0 commit comments