From 486f42d2a4be30de6f035663e81f3784e16f6b23 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Thu, 14 Jun 2018 17:00:33 -0400 Subject: [PATCH] decode crd objectmeta properly --- .../pkg/apiserver/customresource_handler.go | 4 ++- .../apiserver/customresource_handler_test.go | 33 +++++++++++++++++-- .../test/integration/objectmeta_test.go | 4 +-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index 25c8f04d939..7be3711dc17 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -17,7 +17,6 @@ limitations under the License. package apiserver import ( - encodingjson "encoding/json" "fmt" "net/http" "path" @@ -821,6 +820,8 @@ func (v *unstructuredSchemaCoercer) apply(u *unstructured.Unstructured) error { return nil } +var encodingjson = json.CaseSensitiveJsonIterator() + func getObjectMeta(u *unstructured.Unstructured, dropMalformedFields bool) (*metav1.ObjectMeta, bool, error) { metadata, found := u.UnstructuredContent()["metadata"] if !found { @@ -862,6 +863,7 @@ func getObjectMeta(u *unstructured.Unstructured, dropMalformedFields bool) (*met } } } + return accumulatedObjectMeta, true, nil } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go index 3f0635797f4..a6d6e23a123 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go @@ -17,7 +17,6 @@ limitations under the License. package apiserver import ( - encodingjson "encoding/json" "math/rand" "reflect" "testing" @@ -136,7 +135,7 @@ func TestRoundtripObjectMeta(t *testing.T) { } // TestMalformedObjectMetaFields sets a number of different random values and types for all -// metadata fields. If encoding/json.Unmarshal accepts them, compare that getObjectMeta +// metadata fields. If json.Unmarshal accepts them, compare that getObjectMeta // gives the same result. Otherwise, drop malformed fields. func TestMalformedObjectMetaFields(t *testing.T) { fuzzer := fuzzer.FuzzerFor(metafuzzer.Funcs, rand.NewSource(rand.Int63()), serializer.NewCodecFactory(runtime.NewScheme())) @@ -277,3 +276,33 @@ func TestGetObjectMetaNils(t *testing.T) { t.Errorf("expected labels to be %v, got %v", expected, got) } } + +func TestGetObjectMeta(t *testing.T) { + for i := 0; i < 100; i++ { + u := &unstructured.Unstructured{Object: map[string]interface{}{ + "metadata": map[string]interface{}{ + "name": "good", + "Name": "bad1", + "nAme": "bad2", + "naMe": "bad3", + "namE": "bad4", + + "namespace": "good", + "Namespace": "bad1", + "nAmespace": "bad2", + "naMespace": "bad3", + "namEspace": "bad4", + + "creationTimestamp": "a", + }, + }} + + meta, _, err := getObjectMeta(u, true) + if err != nil { + t.Fatal(err) + } + if meta.Name != "good" || meta.Namespace != "good" { + t.Fatalf("got %#v", meta) + } + } +} diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go index d066556080b..50f656bf120 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go @@ -62,8 +62,8 @@ func TestPostInvalidObjectMeta(t *testing.T) { t.Fatalf("expected APIStatus error, but got: %#v", err) } else if !errors.IsBadRequest(err) { t.Fatalf("expected BadRequst error, but got: %v", errors.ReasonForError(err)) - } else if !strings.Contains(status.Status().Message, "json: cannot unmarshal") { - t.Fatalf("expected 'json: cannot unmarshal' error message, got: %v", status.Status().Message) + } else if !strings.Contains(status.Status().Message, "cannot be handled") { + t.Fatalf("expected 'cannot be handled' error message, got: %v", status.Status().Message) } unstructured.SetNestedField(obj.UnstructuredContent(), map[string]interface{}{"bar": "abc"}, "metadata", "labels")