...
1
16
17 package apiserver
18
19 import (
20 "fmt"
21 "strings"
22 "testing"
23
24 v1 "k8s.io/api/core/v1"
25 apierrors "k8s.io/apimachinery/pkg/api/errors"
26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27 "k8s.io/apimachinery/pkg/types"
28 "k8s.io/kubernetes/cmd/kube-apiserver/app/options"
29 "k8s.io/kubernetes/test/integration/framework"
30 "k8s.io/kubernetes/test/utils/ktesting"
31 )
32
33
34 func TestMaxJSONPatchOperations(t *testing.T) {
35 tCtx := ktesting.Init(t)
36
37 clientSet, _, tearDownFn := framework.StartTestServer(tCtx, t, framework.TestServerSetup{
38 ModifyServerRunOptions: func(opts *options.ServerRunOptions) {
39 opts.GenericServerRunOptions.MaxRequestBodyBytes = 1024 * 1024
40 },
41 })
42 defer tearDownFn()
43
44 p := `{"op":"add","path":"/x","value":"y"}`
45
46 hugePatch := []byte("[" + strings.Repeat(p+",", 10000) + p + "]")
47
48 c := clientSet.CoreV1().RESTClient()
49
50 secret := &v1.Secret{
51 ObjectMeta: metav1.ObjectMeta{
52 Name: "test",
53 },
54 }
55 _, err := clientSet.CoreV1().Secrets("default").Create(tCtx, secret, metav1.CreateOptions{})
56 if err != nil {
57 t.Fatal(err)
58 }
59
60 err = c.Patch(types.JSONPatchType).AbsPath(fmt.Sprintf("/api/v1/namespaces/default/secrets/test")).
61 Body(hugePatch).Do(tCtx).Error()
62 if err == nil {
63 t.Fatalf("unexpected no error")
64 }
65 if !apierrors.IsRequestEntityTooLargeError(err) {
66 t.Errorf("expected requested entity too large err, got %v", err)
67 }
68 if !strings.Contains(err.Error(), "The allowed maximum operations in a JSON patch is") {
69 t.Errorf("expected the error message to be about maximum operations, got %v", err)
70 }
71 }
72
View as plain text