pkg/webhook/core/mutating_handler.go (73 lines of code) (raw):
package core
import (
"context"
"encoding/json"
"github.com/aws/aws-application-networking-k8s/pkg/utils/gwlog"
admissionv1 "k8s.io/api/admission/v1"
"net/http"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
)
type mutatingHandler struct {
log gwlog.Logger
mutator Mutator
decoder admission.Decoder
}
func (h *mutatingHandler) SetDecoder(d admission.Decoder) {
h.decoder = d
}
// Handle handles admission requests.
func (h *mutatingHandler) Handle(ctx context.Context, req admission.Request) admission.Response {
h.log.Debugw(ctx, "mutating webhook request", "operation", req.Operation, "name", req.Name, "namespace", req.Namespace)
var resp admission.Response
switch req.Operation {
case admissionv1.Create:
resp = h.handleCreate(ctx, req)
case admissionv1.Update:
resp = h.handleUpdate(ctx, req)
default:
resp = admission.Allowed("")
}
h.log.Debugw(ctx, "mutating webhook response", "patches", resp.Patches)
return resp
}
func (h *mutatingHandler) handleCreate(ctx context.Context, req admission.Request) admission.Response {
prototype, err := h.mutator.Prototype(req)
if err != nil {
return admission.Errored(http.StatusBadRequest, err)
}
obj := prototype.DeepCopyObject()
if err := h.decoder.DecodeRaw(req.Object, obj); err != nil {
return admission.Errored(http.StatusBadRequest, err)
}
mutatedObj, err := h.mutator.MutateCreate(ContextWithAdmissionRequest(ctx, req), obj)
if err != nil {
return admission.Denied(err.Error())
}
mutatedObjPayload, err := json.Marshal(mutatedObj)
if err != nil {
return admission.Errored(http.StatusInternalServerError, err)
}
return admission.PatchResponseFromRaw(req.Object.Raw, mutatedObjPayload)
}
func (h *mutatingHandler) handleUpdate(ctx context.Context, req admission.Request) admission.Response {
prototype, err := h.mutator.Prototype(req)
if err != nil {
return admission.Errored(http.StatusBadRequest, err)
}
obj := prototype.DeepCopyObject()
oldObj := prototype.DeepCopyObject()
if err := h.decoder.DecodeRaw(req.Object, obj); err != nil {
return admission.Errored(http.StatusBadRequest, err)
}
if err := h.decoder.DecodeRaw(req.OldObject, oldObj); err != nil {
return admission.Errored(http.StatusBadRequest, err)
}
mutatedObj, err := h.mutator.MutateUpdate(ContextWithAdmissionRequest(ctx, req), obj, oldObj)
if err != nil {
return admission.Denied(err.Error())
}
mutatedObjPayload, err := json.Marshal(mutatedObj)
if err != nil {
return admission.Errored(http.StatusInternalServerError, err)
}
return admission.PatchResponseFromRaw(req.Object.Raw, mutatedObjPayload)
}