@@ -18,6 +18,7 @@ package v1beta1
1818
1919import (
2020 "fmt"
21+ "regexp"
2122
2223 apierrors "k8s.io/apimachinery/pkg/api/errors"
2324 "k8s.io/apimachinery/pkg/runtime"
@@ -30,8 +31,6 @@ import (
3031
3132var rabbitmqpolicylog = logf .Log .WithName ("rabbitmqpolicy-resource" )
3233
33- //+kubebuilder:webhook:path=/mutate-rabbitmq-openstack-org-v1beta1-rabbitmqpolicy,mutating=true,failurePolicy=fail,sideEffects=None,groups=rabbitmq.openstack.org,resources=rabbitmqpolicies,verbs=create;update,versions=v1beta1,name=mrabbitmqpolicy.kb.io,admissionReviewVersions=v1
34-
3534// Default implements defaulting for RabbitMQPolicy
3635func (r * RabbitMQPolicy ) Default (_ client.Client ) {
3736 rabbitmqpolicylog .Info ("default" , "name" , r .Name )
@@ -42,8 +41,6 @@ func (r *RabbitMQPolicy) Default(_ client.Client) {
4241 }
4342}
4443
45- //+kubebuilder:webhook:path=/validate-rabbitmq-openstack-org-v1beta1-rabbitmqpolicy,mutating=false,failurePolicy=fail,sideEffects=None,groups=rabbitmq.openstack.org,resources=rabbitmqpolicies,verbs=create;update,versions=v1beta1,name=vrabbitmqpolicy.kb.io,admissionReviewVersions=v1
46-
4744// ValidateCreate validates the RabbitMQPolicy on creation
4845func (r * RabbitMQPolicy ) ValidateCreate (_ client.Client ) (admission.Warnings , error ) {
4946 rabbitmqpolicylog .Info ("validate create" , "name" , r .Name )
@@ -56,6 +53,10 @@ func (r *RabbitMQPolicy) ValidateCreate(_ client.Client) (admission.Warnings, er
5653 )
5754 }
5855
56+ if err := r .validatePattern (); err != nil {
57+ return nil , err
58+ }
59+
5960 return nil , nil
6061}
6162
@@ -68,6 +69,20 @@ func (r *RabbitMQPolicy) ValidateUpdate(_ client.Client, old runtime.Object) (ad
6869 return nil , fmt .Errorf ("expected RabbitMQPolicy but got %T" , old )
6970 }
7071
72+ // Prevent changing the cluster after creation
73+ if r .Spec .RabbitmqClusterName != oldPolicy .Spec .RabbitmqClusterName {
74+ return nil , apierrors .NewInvalid (
75+ schema.GroupKind {Group : "rabbitmq.openstack.org" , Kind : "RabbitMQPolicy" },
76+ r .Name ,
77+ field.ErrorList {
78+ field .Forbidden (
79+ field .NewPath ("spec" , "rabbitmqClusterName" ),
80+ "rabbitmqClusterName cannot be changed after creation" ,
81+ ),
82+ },
83+ )
84+ }
85+
7186 // Prevent changing the policy name after creation
7287 if r .Spec .Name != oldPolicy .Spec .Name {
7388 return nil , apierrors .NewInvalid (
@@ -82,10 +97,29 @@ func (r *RabbitMQPolicy) ValidateUpdate(_ client.Client, old runtime.Object) (ad
8297 )
8398 }
8499
100+ if err := r .validatePattern (); err != nil {
101+ return nil , err
102+ }
103+
85104 return nil , nil
86105}
87106
88107// ValidateDelete validates the RabbitMQPolicy on deletion
89108func (r * RabbitMQPolicy ) ValidateDelete (_ client.Client ) (admission.Warnings , error ) {
90109 return nil , nil
91110}
111+
112+ // validatePattern validates that the Pattern field is a valid regex
113+ func (r * RabbitMQPolicy ) validatePattern () error {
114+ if _ , err := regexp .Compile (r .Spec .Pattern ); err != nil {
115+ return apierrors .NewInvalid (
116+ schema.GroupKind {Group : "rabbitmq.openstack.org" , Kind : "RabbitMQPolicy" },
117+ r .Name ,
118+ field.ErrorList {
119+ field .Invalid (field .NewPath ("spec" , "pattern" ), r .Spec .Pattern ,
120+ fmt .Sprintf ("invalid regex pattern: %v" , err )),
121+ },
122+ )
123+ }
124+ return nil
125+ }
0 commit comments