From ba6cd5c78aa334da1400c4274cb0494115c61655 Mon Sep 17 00:00:00 2001 From: scott Date: Mon, 24 Oct 2022 10:42:56 +0800 Subject: [PATCH] Merge pull request #113133 from sxllwx:automated-cherry-pick-of-#113133-upstream-release-1.25 Automated cherry pick of #113133: Fix DeleteCollection API decode DeleteOptions fail --- .../pkg/endpoints/handlers/delete.go | 2 +- .../pkg/endpoints/handlers/delete_test.go | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go index a7712f115fa6..542400a00cb9 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go @@ -231,7 +231,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope *RequestSc return } if len(body) > 0 { - s, err := negotiation.NegotiateInputSerializer(req, false, scope.Serializer) + s, err := negotiation.NegotiateInputSerializer(req, false, metainternalversionscheme.Codecs) if err != nil { scope.err(err, w, req) return diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete_test.go index edf764a1a04e..ad0dc567a7d6 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete_test.go @@ -19,6 +19,8 @@ package handlers import ( "context" "io" + "net/http" + "strings" "testing" metainternalversionscheme "k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme" @@ -28,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/serializer" auditapis "k8s.io/apiserver/pkg/apis/audit" "k8s.io/apiserver/pkg/audit" + "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" "k8s.io/utils/pointer" ) @@ -132,3 +135,72 @@ func TestDeleteResourceAuditLogRequestObject(t *testing.T) { }) } } + +func TestDeleteCollection(t *testing.T) { + req := &http.Request{ + Header: http.Header{}, + } + req.Header.Set("Content-Type", "application/json") + + fakeCorev1GroupVersion := schema.GroupVersion{ + Group: "", + Version: "v1", + } + fakeCorev1Scheme := runtime.NewScheme() + fakeCorev1Scheme.AddKnownTypes(fakeCorev1GroupVersion, &metav1.DeleteOptions{}) + fakeCorev1Codec := serializer.NewCodecFactory(fakeCorev1Scheme) + + tests := []struct { + name string + codecFactory serializer.CodecFactory + data []byte + expectErr string + }{ + // for issue: https://github.com/kubernetes/kubernetes/issues/111985 + { + name: "decode '{}' to metav1.DeleteOptions with fakeCorev1Codecs", + codecFactory: fakeCorev1Codec, + data: []byte("{}"), + expectErr: "no kind \"DeleteOptions\" is registered", + }, + { + name: "decode '{}' to metav1.DeleteOptions with metainternalversionscheme.Codecs", + codecFactory: metainternalversionscheme.Codecs, + data: []byte("{}"), + expectErr: "", + }, + { + name: "decode versioned (corev1) DeleteOptions with metainternalversionscheme.Codecs", + codecFactory: metainternalversionscheme.Codecs, + data: []byte(`{"apiVersion":"v1","kind":"DeleteOptions","gracePeriodSeconds":123}`), + expectErr: "", + }, + { + name: "decode versioned (foo) DeleteOptions with metainternalversionscheme.Codecs", + codecFactory: metainternalversionscheme.Codecs, + data: []byte(`{"apiVersion":"foo/v1","kind":"DeleteOptions","gracePeriodSeconds":123}`), + expectErr: "", + }, + } + + defaultGVK := metav1.SchemeGroupVersion.WithKind("DeleteOptions") + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + s, err := negotiation.NegotiateInputSerializer(req, false, test.codecFactory) + if err != nil { + t.Fatal(err) + } + + options := &metav1.DeleteOptions{} + _, _, err = metainternalversionscheme.Codecs.DecoderToVersion(s.Serializer, defaultGVK.GroupVersion()).Decode(test.data, &defaultGVK, options) + if test.expectErr != "" { + if err == nil { + t.Fatalf("expect %s but got nil", test.expectErr) + } + if !strings.Contains(err.Error(), test.expectErr) { + t.Fatalf("expect %s but got %s", test.expectErr, err.Error()) + } + } + }) + } +}