From 7e102d70e0146669de97cfe04023bfd30f7c53d9 Mon Sep 17 00:00:00 2001 From: Somefive Date: Thu, 27 Jan 2022 16:09:23 +0800 Subject: [PATCH] Fix: error msg in webhook too complicated to read (#3169) Signed-off-by: Somefive --- .../application/validating_handler.go | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go b/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go index 22c30248d..3e250db72 100644 --- a/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go +++ b/pkg/webhook/core.oam.dev/v1alpha2/application/validating_handler.go @@ -18,9 +18,11 @@ package application import ( "context" + "fmt" "net/http" admissionv1 "k8s.io/api/admission/v1" + "k8s.io/apimachinery/pkg/util/validation/field" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/runtime/inject" @@ -67,6 +69,23 @@ func (h *ValidatingHandler) InjectDecoder(d *admission.Decoder) error { return nil } +func simplifyError(err error) error { + switch e := err.(type) { // nolint + case *field.Error: + return fmt.Errorf("field \"%s\": %s error encountered, %s. ", e.Field, e.Type, e.Detail) + default: + return err + } +} + +func mergeErrors(errs field.ErrorList) error { + s := "" + for _, err := range errs { + s += fmt.Sprintf("field \"%s\": %s error encountered, %s. ", err.Field, err.Type, err.Detail) + } + return fmt.Errorf(s) +} + // Handle validate Application Spec here func (h *ValidatingHandler) Handle(ctx context.Context, req admission.Request) admission.Response { app := &v1beta1.Application{} @@ -77,16 +96,16 @@ func (h *ValidatingHandler) Handle(ctx context.Context, req admission.Request) a switch req.Operation { case admissionv1.Create: if allErrs := h.ValidateCreate(ctx, app); len(allErrs) > 0 { - return admission.Errored(http.StatusUnprocessableEntity, allErrs.ToAggregate()) + return admission.Errored(http.StatusUnprocessableEntity, mergeErrors(allErrs)) } case admissionv1.Update: oldApp := &v1beta1.Application{} if err := h.Decoder.DecodeRaw(req.AdmissionRequest.OldObject, oldApp); err != nil { - return admission.Errored(http.StatusBadRequest, err) + return admission.Errored(http.StatusBadRequest, simplifyError(err)) } if app.ObjectMeta.DeletionTimestamp.IsZero() { if allErrs := h.ValidateUpdate(ctx, app, oldApp); len(allErrs) > 0 { - return admission.Errored(http.StatusUnprocessableEntity, allErrs.ToAggregate()) + return admission.Errored(http.StatusUnprocessableEntity, mergeErrors(allErrs)) } } default: