summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWillardHu <wei.hu@daocloud.io>2023-08-29 18:55:35 +0800
committerWillardHu <wei.hu@daocloud.io>2023-09-01 15:54:34 +0800
commite1fc1dee144f3060dcdc1b7cf9a9a1a0581d828c (patch)
tree6e33650fd8d2e090870293e30cf783910714ac2d
parentMerge pull request #4973 from fisherxu/automated-cherry-pick-of-#4960-upstrea... (diff)
downloadkubeedge-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.go4
-rw-r--r--cloud/pkg/admissioncontroller/common_test.go47
-rw-r--r--cloud/test/httpfake/http_fake.go28
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
+}