//nolint:revive package v2 import ( runtime "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/conversion" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" v1 "edge-infra.dev/pkg/sds/display/k8s/apis/v1" ) // +kubebuilder:webhook:verbs=create;update,path=/validate-display-edge-ncr-com-v2-nodedisplayconfig,mutating=false,failurePolicy=fail,groups=display.edge.ncr.com,resources=nodedisplayconfigs,versions=v2,name=v2-nodedisplayconfig-validation-webhook.display.edge.ncr.com,sideEffects=None,admissionReviewVersions=v1 func (nodeDisplayConfig *NodeDisplayConfig) SetupWebhookWithManager(mgr ctrl.Manager) error { return ctrl.NewWebhookManagedBy(mgr).For(nodeDisplayConfig).Complete() } // NodeDisplayConfig must satisfy the Validator interface for the validation webhook to start. var _ admission.Validator = &NodeDisplayConfig{} func (nodeDisplayConfig *NodeDisplayConfig) ValidateCreate() (admission.Warnings, error) { return nil, nodeDisplayConfig.Spec.Validate() } func (nodeDisplayConfig *NodeDisplayConfig) ValidateUpdate(runtime.Object) (admission.Warnings, error) { return nil, nodeDisplayConfig.Spec.Validate() } func (*NodeDisplayConfig) ValidateDelete() (admission.Warnings, error) { // delete requests are always valid return nil, nil } // v2 NodeDisplayConfig must be convertible to and from the hub // version (v1) for the conversion webhook to start. var _ conversion.Convertible = &NodeDisplayConfig{} // Converts V1 to V2. // // This simply copies the V1 spec into the V2 NodeDisplayConfig // to be upgraded by displayctl later on. func (dst *NodeDisplayConfig) ConvertFrom(src conversion.Hub) error { nodeDisplayConfig := src.(*v1.NodeDisplayConfig) dst.ObjectMeta = nodeDisplayConfig.ObjectMeta dst.Spec = &DisplayConfig{ V1: nodeDisplayConfig.Spec, } return nil } // Converts V2 to V1. // // V1 is deprecated and not in use. Conversion from V2 to V1 // is unsupported and simply removes the spec from the object. // As V2 is the stored version there is no data loss and the // spec can always be retrieved via the V2 API. func (src *NodeDisplayConfig) ConvertTo(dst conversion.Hub) error { nodeDisplayConfig := dst.(*v1.NodeDisplayConfig) nodeDisplayConfig.ObjectMeta = src.ObjectMeta nodeDisplayConfig.Spec = nil return nil }