@@ -17,15 +17,84 @@ limitations under the License.
1717package v1beta2
1818
1919import (
20+ apierrors "k8s.io/apimachinery/pkg/api/errors"
21+ "k8s.io/apimachinery/pkg/runtime"
22+ "k8s.io/apimachinery/pkg/runtime/schema"
23+ "k8s.io/apimachinery/pkg/util/validation/field"
2024 ctrl "sigs.k8s.io/controller-runtime"
25+ logf "sigs.k8s.io/controller-runtime/pkg/log"
26+ "sigs.k8s.io/controller-runtime/pkg/webhook"
27+ "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
2128)
2229
23- //+kubebuilder:webhook:path=/mutate-core-v1-pod,mutating=true,failurePolicy=fail,sideEffects=None,groups=core,resources=pods,verbs=create,versions=v1,name=ot-mutate-pod.opstree.com,admissionReviewVersions=v1
30+ const (
31+ webhookPath = "/validate-redis-redis-opstreelabs-in-v1beta2-rediscluster"
32+ )
33+
34+ // log is for logging in this package.
35+ var redisclusterlog = logf .Log .WithName ("rediscluster-v1beta2-validation" )
36+
37+ // +kubebuilder:webhook:path=/validate-redis-redis-opstreelabs-in-v1beta2-rediscluster,mutating=false,failurePolicy=fail,sideEffects=None,groups=redis.redis.opstreelabs.in,resources=redisclusters,verbs=create;update,versions=v1beta2,name=validate-rediscluster.redis.opstreelabs.in,admissionReviewVersions=v1
2438
39+ // SetupWebhookWithManager will setup the manager
2540func (r * RedisCluster ) SetupWebhookWithManager (mgr ctrl.Manager ) error {
2641 return ctrl .NewWebhookManagedBy (mgr ).
2742 For (r ).
2843 Complete ()
2944}
3045
31- // TODO(user): EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
46+ var _ webhook.Validator = & RedisCluster {}
47+
48+ // ValidateCreate implements webhook.Validator so a webhook will be registered for the type
49+ func (r * RedisCluster ) ValidateCreate () (admission.Warnings , error ) {
50+ redisclusterlog .Info ("validate create" , "name" , r .Name )
51+
52+ return r .validate (nil )
53+ }
54+
55+ // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
56+ func (r * RedisCluster ) ValidateUpdate (old runtime.Object ) (admission.Warnings , error ) {
57+ redisclusterlog .Info ("validate update" , "name" , r .Name )
58+
59+ return r .validate (old .(* RedisCluster ))
60+ }
61+
62+ // ValidateDelete implements webhook.Validator so a webhook will be registered for the type
63+ func (r * RedisCluster ) ValidateDelete () (admission.Warnings , error ) {
64+ redisclusterlog .Info ("validate delete" , "name" , r .Name )
65+
66+ return nil , nil
67+ }
68+
69+ // validate validates the Redis Cluster CR
70+ func (r * RedisCluster ) validate (_ * RedisCluster ) (admission.Warnings , error ) {
71+ var errors field.ErrorList
72+ var warnings admission.Warnings
73+
74+ if r .Spec .Size == nil {
75+ return warnings , nil
76+ }
77+
78+ // Check if the Size is at least 3 for proper cluster operation
79+ if * r .Spec .Size < 3 {
80+ errors = append (errors , field .Invalid (
81+ field .NewPath ("spec" ).Child ("clusterSize" ),
82+ * r .Spec .Size ,
83+ "Redis cluster must have at least 3 shards" ,
84+ ))
85+ }
86+
87+ if len (errors ) == 0 {
88+ return nil , nil
89+ }
90+
91+ return nil , apierrors .NewInvalid (
92+ schema.GroupKind {Group : "redis.redis.opstreelabs.in" , Kind : "RedisCluster" },
93+ r .Name ,
94+ errors ,
95+ )
96+ }
97+
98+ func (r * RedisCluster ) WebhookPath () string {
99+ return webhookPath
100+ }
0 commit comments