karmada/operator/pkg/karmadaresource/webhookconfiguration/webhookconfiguration.go

66 lines
2.4 KiB
Go

package webhookconfiguration
import (
"fmt"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
kuberuntime "k8s.io/apimachinery/pkg/runtime"
clientset "k8s.io/client-go/kubernetes"
clientsetscheme "k8s.io/client-go/kubernetes/scheme"
"github.com/karmada-io/karmada/operator/pkg/util"
"github.com/karmada-io/karmada/operator/pkg/util/apiclient"
)
// EnsureWebhookconfiguration creates karmada webhook mutatingWebhookConfiguration and validatingWebhookConfiguration
func EnsureWebhookconfiguration(client clientset.Interface, namespace, name, caBundle string) error {
if err := mutatingWebhookConfiguration(client, namespace, name, caBundle); err != nil {
return err
}
return validatingWebhookConfiguration(client, namespace, name, caBundle)
}
func mutatingWebhookConfiguration(client clientset.Interface, namespace, name, caBundle string) error {
configurationBytes, err := util.ParseTemplate(KarmadaWebhookMutatingWebhookConfiguration, struct {
Service string
Namespace string
CaBundle string
}{
Service: util.KarmadaWebhookName(name),
Namespace: namespace,
CaBundle: caBundle,
})
if err != nil {
return fmt.Errorf("error when parsing Webhook MutatingWebhookConfiguration template: %w", err)
}
mwc := &admissionregistrationv1.MutatingWebhookConfiguration{}
if err := kuberuntime.DecodeInto(clientsetscheme.Codecs.UniversalDecoder(), configurationBytes, mwc); err != nil {
return fmt.Errorf("err when decoding Webhook MutatingWebhookConfiguration: %w", err)
}
return apiclient.CreateOrUpdateMutatingWebhookConfiguration(client, mwc)
}
func validatingWebhookConfiguration(client clientset.Interface, namespace, name, caBundle string) error {
configurationBytes, err := util.ParseTemplate(KarmadaWebhookValidatingWebhookConfiguration, struct {
Service string
Namespace string
CaBundle string
}{
Service: util.KarmadaWebhookName(name),
Namespace: namespace,
CaBundle: caBundle,
})
if err != nil {
return fmt.Errorf("error when parsing Webhook ValidatingWebhookConfiguration template: %w", err)
}
vwc := &admissionregistrationv1.ValidatingWebhookConfiguration{}
if err := kuberuntime.DecodeInto(clientsetscheme.Codecs.UniversalDecoder(), configurationBytes, vwc); err != nil {
return fmt.Errorf("err when decoding Webhook ValidatingWebhookConfiguration: %w", err)
}
return apiclient.CreateOrUpdateValidatingWebhookConfiguration(client, vwc)
}