kuberbuilder webhook proposal

Handle external API types explicitly in create api
kubebuilder create webhook --group meta --version v1 --kind MetaWebHook --defaulting

$ kubebuilder create webhook \
    --group argoproj.io \
    --version v1alpha1 \
    --kind Workflow \
    --webhook-type external
        --external-import "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1"
        --defaulting 

main.go


    hookServer := mgr.GetWebhookServer()
    hookServer.Register("/mutate-v1alpha1-argoworkflow", &webhook.Admission{Handler: &webhookv1alpha1.ArgoWorkflowHandler{Client: mgr.GetClient()}})

api/v1alpha1

package v1alpha1

import (
    "context"
    "encoding/json"
    "net/http"

    workflowv1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1"
    "sigs.k8s.io/controller-runtime/pkg/client"
    "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
)

type ArgoWorkflowHandler struct {
    Client  client.Client
    decoder *admission.Decoder
}

//+kubebuilder:webhook:path=/mutate-v1alpha1-argoworkflow,mutating=true,failurePolicy=fail,sideEffects=None,groups=argoproj.io,resources=workflows,verbs=create;update,versions=v1alpha1,name=mworkflow.argoproj.io,admissionReviewVersions=v1

// +kubebuilder:rbac:groups=workflow.argoproj.io,resources=workflows,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=workflow.argoproj.io,resources=workflows/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=workflow.argoproj.io,resources=workflows/finalizers,verbs=update

// ArgoWorkflowHandler
// TODO(user): Modify the Handle function to
func (a *ArgoWorkflowHandler) Handle(ctx context.Context, req admission.Request) admission.Response {
    workflow := &workflowv1alpha1.Workflow{}

    err := a.decoder.Decode(req, workflow)
    if err != nil {
        return admission.Errored(http.StatusBadRequest, err)
    }

    // TODO(user): your logic here

    marshaledWorkflow, err := json.Marshal(workflow)
    if err != nil {
        return admission.Errored(http.StatusInternalServerError, err)
    }

    return admission.PatchResponseFromRaw(req.Object.Raw, marshaledWorkflow)
}

// ArgoWorkflowHandler InjectDecoder
func (a *ArgoWorkflowHandler) InjectDecoder(d *admission.Decoder) error {
    a.decoder = d
    return nil
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容