Skip to content

Commit

Permalink
Merge pull request #113286 from sxllwx/automated-cherry-pick-of-#1131…
Browse files Browse the repository at this point in the history
…33-upstream-release-1.25

Automated cherry pick of #113133: Fix DeleteCollection API decode DeleteOptions fail
  • Loading branch information
k8s-ci-robot committed Oct 31, 2022
2 parents cc056d0 + ba6cd5c commit 42df020
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
Expand Up @@ -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
Expand Down
72 changes: 72 additions & 0 deletions staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete_test.go
Expand Up @@ -19,6 +19,8 @@ package handlers
import (
"context"
"io"
"net/http"
"strings"
"testing"

metainternalversionscheme "k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme"
Expand All @@ -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"
)

Expand Down Expand Up @@ -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())
}
}
})
}
}

0 comments on commit 42df020

Please sign in to comment.