func()

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)
	}
}