github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/apis/workloads/v1alpha1/replicatedstatemachine_webhook.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package v1alpha1 21 22 import ( 23 apierrors "k8s.io/apimachinery/pkg/api/errors" 24 "k8s.io/apimachinery/pkg/runtime" 25 "k8s.io/apimachinery/pkg/runtime/schema" 26 "k8s.io/apimachinery/pkg/util/validation/field" 27 ctrl "sigs.k8s.io/controller-runtime" 28 logf "sigs.k8s.io/controller-runtime/pkg/log" 29 "sigs.k8s.io/controller-runtime/pkg/webhook" 30 "sigs.k8s.io/controller-runtime/pkg/webhook/admission" 31 ) 32 33 // log is for logging in this package. 34 var replicatedstatemachinelog = logf.Log.WithName("replicatedstatemachine-resource") 35 36 func (r *ReplicatedStateMachine) SetupWebhookWithManager(mgr ctrl.Manager) error { 37 return ctrl.NewWebhookManagedBy(mgr). 38 For(r). 39 Complete() 40 } 41 42 // TODO(user): EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! 43 44 //+kubebuilder:webhook:path=/mutate-workloads-kubeblocks-io-v1alpha1-replicatedstatemachine,mutating=true,failurePolicy=fail,sideEffects=None,groups=workloads.kubeblocks.io,resources=replicatedstatemachines,verbs=create;update,versions=v1alpha1,name=mreplicatedstatemachine.kb.io,admissionReviewVersions=v1 45 46 var _ webhook.Defaulter = &ReplicatedStateMachine{} 47 48 // Default implements webhook.Defaulter so a webhook will be registered for the type 49 func (r *ReplicatedStateMachine) Default() { 50 replicatedstatemachinelog.Info("default", "name", r.Name) 51 52 // TODO(user): fill in your defaulting logic. 53 } 54 55 // TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation. 56 //+kubebuilder:webhook:path=/validate-workloads-kubeblocks-io-v1alpha1-replicatedstatemachine,mutating=false,failurePolicy=fail,sideEffects=None,groups=workloads.kubeblocks.io,resources=replicatedstatemachines,verbs=create;update,versions=v1alpha1,name=vreplicatedstatemachine.kb.io,admissionReviewVersions=v1 57 58 var _ webhook.Validator = &ReplicatedStateMachine{} 59 60 // ValidateCreate implements webhook.Validator so a webhook will be registered for the type 61 func (r *ReplicatedStateMachine) ValidateCreate() (admission.Warnings, error) { 62 replicatedstatemachinelog.Info("validate create", "name", r.Name) 63 64 return nil, r.validate() 65 } 66 67 // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type 68 func (r *ReplicatedStateMachine) ValidateUpdate(old runtime.Object) (admission.Warnings, error) { 69 replicatedstatemachinelog.Info("validate update", "name", r.Name) 70 71 return nil, r.validate() 72 } 73 74 // ValidateDelete implements webhook.Validator so a webhook will be registered for the type 75 func (r *ReplicatedStateMachine) ValidateDelete() (admission.Warnings, error) { 76 replicatedstatemachinelog.Info("validate delete", "name", r.Name) 77 78 return nil, r.validate() 79 } 80 81 func (r *ReplicatedStateMachine) validate() error { 82 var allErrs field.ErrorList 83 84 if len(r.Spec.Roles) > 0 { 85 // Leader is required 86 hasHeader := false 87 for _, role := range r.Spec.Roles { 88 if role.IsLeader && len(role.Name) > 0 { 89 hasHeader = true 90 break 91 } 92 } 93 if !hasHeader { 94 allErrs = append(allErrs, 95 field.Required(field.NewPath("spec.roles"), 96 "leader is required")) 97 } 98 } 99 100 // servicePort must provide if spec.service is not nil 101 if r.Spec.Service != nil && len(r.Spec.Service.Spec.Ports) == 0 { 102 allErrs = append(allErrs, 103 field.Required(field.NewPath("spec.service.ports"), 104 "servicePort must provide")) 105 } 106 107 if len(allErrs) > 0 { 108 return apierrors.NewInvalid( 109 schema.GroupKind{ 110 Group: "workloads.kubeblocks.io/v1alpha1", 111 Kind: "ReplicatedStateMachine", 112 }, 113 r.Name, allErrs) 114 } 115 116 return nil 117 }