diff options
| author | WillardHu <wei.hu@daocloud.io> | 2023-08-29 18:55:35 +0800 |
|---|---|---|
| committer | WillardHu <wei.hu@daocloud.io> | 2023-09-01 15:54:34 +0800 |
| commit | e1fc1dee144f3060dcdc1b7cf9a9a1a0581d828c (patch) | |
| tree | 6e33650fd8d2e090870293e30cf783910714ac2d | |
| parent | Merge pull request #4973 from fisherxu/automated-cherry-pick-of-#4960-upstrea... (diff) | |
| download | kubeedge-e1fc1dee144f3060dcdc1b7cf9a9a1a0581d828c.tar.gz | |
Fix throws nil runtime error when decode AdmissionReview failed
Signed-off-by: WillardHu <wei.hu@daocloud.io>
| -rw-r--r-- | cloud/pkg/admissioncontroller/common.go | 4 | ||||
| -rw-r--r-- | cloud/pkg/admissioncontroller/common_test.go | 47 | ||||
| -rw-r--r-- | cloud/test/httpfake/http_fake.go | 28 |
3 files changed, 77 insertions, 2 deletions
diff --git a/cloud/pkg/admissioncontroller/common.go b/cloud/pkg/admissioncontroller/common.go index b7882ad45..f44205821 100644 --- a/cloud/pkg/admissioncontroller/common.go +++ b/cloud/pkg/admissioncontroller/common.go @@ -94,10 +94,10 @@ func serve(w http.ResponseWriter, r *http.Request, hook hookFunc) { responseAdmissionReview.Response = toAdmissionResponse(err) } else { responseAdmissionReview.Response = hook(requestedAdmissionReview) + // Return the same UID + responseAdmissionReview.Response.UID = requestedAdmissionReview.Request.UID } - // Return the same UID - responseAdmissionReview.Response.UID = requestedAdmissionReview.Request.UID klog.V(4).Infof("sending response: %+v", responseAdmissionReview.Response) respBytes, err := json.Marshal(responseAdmissionReview) diff --git a/cloud/pkg/admissioncontroller/common_test.go b/cloud/pkg/admissioncontroller/common_test.go new file mode 100644 index 000000000..888bbdeac --- /dev/null +++ b/cloud/pkg/admissioncontroller/common_test.go @@ -0,0 +1,47 @@ +package admissioncontroller + +import ( + "bytes" + "io" + "net/http" + "testing" + + admissionv1 "k8s.io/api/admission/v1" + + "github.com/kubeedge/kubeedge/cloud/test/httpfake" +) + +func TestServe(t *testing.T) { + w := httpfake.NewResponseWriter() + hookfn := func(admissionv1.AdmissionReview) *admissionv1.AdmissionResponse { + return &admissionv1.AdmissionResponse{Allowed: true} + } + + t.Run("not json content-type", func(_ *testing.T) { + serve(w, &http.Request{ + Header: map[string][]string{ + "Content-Type": {"application/xml"}, + }, + }, hookfn) + }) + + t.Run("decode body failed", func(_ *testing.T) { + raw := "{" + serve(w, &http.Request{ + Header: map[string][]string{ + "Content-Type": {"application/json"}, + }, + Body: io.NopCloser(bytes.NewReader([]byte(raw))), + }, hookfn) + }) + + t.Run("handle hook func", func(_ *testing.T) { + raw := "{\"request\": {\"uid\": \"1\"}}" + serve(w, &http.Request{ + Header: map[string][]string{ + "Content-Type": {"application/json"}, + }, + Body: io.NopCloser(bytes.NewReader([]byte(raw))), + }, hookfn) + }) +} diff --git a/cloud/test/httpfake/http_fake.go b/cloud/test/httpfake/http_fake.go new file mode 100644 index 000000000..9a74d21e7 --- /dev/null +++ b/cloud/test/httpfake/http_fake.go @@ -0,0 +1,28 @@ +package httpfake + +import "net/http" + +type ResponseWriter struct { + HTTPHeader http.Header + Status int + Body []byte +} + +func NewResponseWriter() *ResponseWriter { + return &ResponseWriter{ + HTTPHeader: make(http.Header), + } +} + +func (f *ResponseWriter) Header() http.Header { + return f.HTTPHeader +} + +func (f *ResponseWriter) Write(b []byte) (int, error) { + f.Body = b + return len(b), nil +} + +func (f *ResponseWriter) WriteHeader(statusCode int) { + f.Status = statusCode +} |
