Skip to content

Commit d987505

Browse files
sxllwxk8s-publishing-bot
authored andcommitted
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 Kubernetes-commit: ba6cd5c78aa334da1400c4274cb0494115c61655
1 parent b34b489 commit d987505

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

pkg/endpoints/handlers/delete.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope *RequestSc
231231
return
232232
}
233233
if len(body) > 0 {
234-
s, err := negotiation.NegotiateInputSerializer(req, false, scope.Serializer)
234+
s, err := negotiation.NegotiateInputSerializer(req, false, metainternalversionscheme.Codecs)
235235
if err != nil {
236236
scope.err(err, w, req)
237237
return

pkg/endpoints/handlers/delete_test.go

+72
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ package handlers
1919
import (
2020
"context"
2121
"io"
22+
"net/http"
23+
"strings"
2224
"testing"
2325

2426
metainternalversionscheme "k8s.io/apimachinery/pkg/apis/meta/internalversion/scheme"
@@ -28,6 +30,7 @@ import (
2830
"k8s.io/apimachinery/pkg/runtime/serializer"
2931
auditapis "k8s.io/apiserver/pkg/apis/audit"
3032
"k8s.io/apiserver/pkg/audit"
33+
"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
3134
"k8s.io/utils/pointer"
3235
)
3336

@@ -132,3 +135,72 @@ func TestDeleteResourceAuditLogRequestObject(t *testing.T) {
132135
})
133136
}
134137
}
138+
139+
func TestDeleteCollection(t *testing.T) {
140+
req := &http.Request{
141+
Header: http.Header{},
142+
}
143+
req.Header.Set("Content-Type", "application/json")
144+
145+
fakeCorev1GroupVersion := schema.GroupVersion{
146+
Group: "",
147+
Version: "v1",
148+
}
149+
fakeCorev1Scheme := runtime.NewScheme()
150+
fakeCorev1Scheme.AddKnownTypes(fakeCorev1GroupVersion, &metav1.DeleteOptions{})
151+
fakeCorev1Codec := serializer.NewCodecFactory(fakeCorev1Scheme)
152+
153+
tests := []struct {
154+
name string
155+
codecFactory serializer.CodecFactory
156+
data []byte
157+
expectErr string
158+
}{
159+
// for issue: https://github.com/kubernetes/kubernetes/issues/111985
160+
{
161+
name: "decode '{}' to metav1.DeleteOptions with fakeCorev1Codecs",
162+
codecFactory: fakeCorev1Codec,
163+
data: []byte("{}"),
164+
expectErr: "no kind \"DeleteOptions\" is registered",
165+
},
166+
{
167+
name: "decode '{}' to metav1.DeleteOptions with metainternalversionscheme.Codecs",
168+
codecFactory: metainternalversionscheme.Codecs,
169+
data: []byte("{}"),
170+
expectErr: "",
171+
},
172+
{
173+
name: "decode versioned (corev1) DeleteOptions with metainternalversionscheme.Codecs",
174+
codecFactory: metainternalversionscheme.Codecs,
175+
data: []byte(`{"apiVersion":"v1","kind":"DeleteOptions","gracePeriodSeconds":123}`),
176+
expectErr: "",
177+
},
178+
{
179+
name: "decode versioned (foo) DeleteOptions with metainternalversionscheme.Codecs",
180+
codecFactory: metainternalversionscheme.Codecs,
181+
data: []byte(`{"apiVersion":"foo/v1","kind":"DeleteOptions","gracePeriodSeconds":123}`),
182+
expectErr: "",
183+
},
184+
}
185+
186+
defaultGVK := metav1.SchemeGroupVersion.WithKind("DeleteOptions")
187+
for _, test := range tests {
188+
t.Run(test.name, func(t *testing.T) {
189+
s, err := negotiation.NegotiateInputSerializer(req, false, test.codecFactory)
190+
if err != nil {
191+
t.Fatal(err)
192+
}
193+
194+
options := &metav1.DeleteOptions{}
195+
_, _, err = metainternalversionscheme.Codecs.DecoderToVersion(s.Serializer, defaultGVK.GroupVersion()).Decode(test.data, &defaultGVK, options)
196+
if test.expectErr != "" {
197+
if err == nil {
198+
t.Fatalf("expect %s but got nil", test.expectErr)
199+
}
200+
if !strings.Contains(err.Error(), test.expectErr) {
201+
t.Fatalf("expect %s but got %s", test.expectErr, err.Error())
202+
}
203+
}
204+
})
205+
}
206+
}

0 commit comments

Comments
 (0)