in pkg/authority/webhook/server.go [93:159]
func (wh *Webhook) Mutate(w http.ResponseWriter, r *http.Request) {
var body []byte
if r.Body != nil {
if data, err := io.ReadAll(r.Body); err == nil {
body = data
}
}
logger.Sugar().Infof("[Webhook] Mutation request: " + string(body))
// verify the content type is accurate
contentType := r.Header.Get("Content-Type")
if contentType != "application/json" {
outputLog := fmt.Sprintf("[Webhook] contentType=%s, expect application/json", contentType)
logger.Sugar().Errorf(outputLog)
w.WriteHeader(http.StatusUnsupportedMediaType)
return
}
var reviewResponse *admissionV1.AdmissionResponse
ar := admissionV1.AdmissionReview{}
if err := json.Unmarshal(body, &ar); err != nil {
outputLog := fmt.Sprintf("[Webhook] json unmarshal err=%s", err)
logger.Sugar().Errorf(outputLog)
reviewResponse = &admissionV1.AdmissionResponse{
Allowed: wh.AllowOnErr,
Result: &metav1.Status{
Status: "Failure",
Message: err.Error(),
Reason: metav1.StatusReason(err.Error()),
},
}
} else {
reviewResponse, err = wh.Admit(ar)
if err != nil {
logger.Sugar().Errorf(err.Error())
reviewResponse = &admissionV1.AdmissionResponse{
Allowed: wh.AllowOnErr,
Result: &metav1.Status{
Status: "Failure",
Message: err.Error(),
Reason: metav1.StatusReason(err.Error()),
},
}
}
}
response := admissionV1.AdmissionReview{}
response.TypeMeta.Kind = "AdmissionReview"
response.TypeMeta.APIVersion = "admission.k8s.io/v1"
response.Response = reviewResponse
logger.Sugar().Infof("[Webhook] AdmissionReview response: %v", response)
resp, err := json.Marshal(response)
if err != nil {
outputLog := fmt.Sprintf("[Webhook] response json unmarshal err=%s", err)
logger.Sugar().Errorf(outputLog)
}
if _, err := w.Write(resp); err != nil {
outputLog := fmt.Sprintf("[Webhook] write resp err=%s", err)
logger.Sugar().Errorf(outputLog)
}
}