diff --git a/pkg/genericapiserver/endpoints/apiserver_test.go b/pkg/genericapiserver/endpoints/apiserver_test.go index 165791f5ea..1eefa294f8 100644 --- a/pkg/genericapiserver/endpoints/apiserver_test.go +++ b/pkg/genericapiserver/endpoints/apiserver_test.go @@ -46,14 +46,15 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/apis/example" + examplefuzzer "k8s.io/apiserver/pkg/apis/example/fuzzer" + examplev1 "k8s.io/apiserver/pkg/apis/example/v1" "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/kubernetes/pkg/api" - kapitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/api/v1" genericapifilters "k8s.io/kubernetes/pkg/genericapiserver/endpoints/filters" "k8s.io/kubernetes/pkg/genericapiserver/endpoints/handlers/responsewriters" genericapitesting "k8s.io/kubernetes/pkg/genericapiserver/endpoints/testing" @@ -78,9 +79,13 @@ var grouplessPrefix = "api" var groupVersions = []schema.GroupVersion{grouplessGroupVersion, testGroupVersion, newGroupVersion} -var codec = api.Codecs.LegacyCodec(groupVersions...) -var testCodec = api.Codecs.LegacyCodec(testGroupVersion) -var newCodec = api.Codecs.LegacyCodec(newGroupVersion) +var scheme = runtime.NewScheme() +var codecs = serializer.NewCodecFactory(scheme) + +var codec = codecs.LegacyCodec(groupVersions...) +var testCodec = codecs.LegacyCodec(testGroupVersion) +var newCodec = codecs.LegacyCodec(newGroupVersion) +var parameterCodec = runtime.NewParameterCodec(scheme) var accessor = meta.NewAccessor() var selfLinker runtime.SelfLinker = accessor @@ -88,26 +93,37 @@ var mapper, namespaceMapper meta.RESTMapper // The mappers with namespace and wi var admissionControl admission.Interface var requestContextMapper request.RequestContextMapper +func init() { + metav1.AddToGroupVersion(scheme, metav1.SchemeGroupVersion) + + // unnamed core group + scheme.AddUnversionedTypes(grouplessGroupVersion, &metav1.Status{}) + metav1.AddToGroupVersion(scheme, grouplessGroupVersion) + + example.AddToScheme(scheme) + examplev1.AddToScheme(scheme) +} + func interfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) { switch version { case testGroupVersion: return &meta.VersionInterfaces{ - ObjectConvertor: api.Scheme, + ObjectConvertor: scheme, MetadataAccessor: accessor, }, nil case newGroupVersion: return &meta.VersionInterfaces{ - ObjectConvertor: api.Scheme, + ObjectConvertor: scheme, MetadataAccessor: accessor, }, nil case grouplessGroupVersion: return &meta.VersionInterfaces{ - ObjectConvertor: api.Scheme, + ObjectConvertor: scheme, MetadataAccessor: accessor, }, nil case testGroup2Version: return &meta.VersionInterfaces{ - ObjectConvertor: api.Scheme, + ObjectConvertor: scheme, MetadataAccessor: accessor, }, nil default: @@ -120,10 +136,10 @@ func newMapper() *meta.DefaultRESTMapper { } func addGrouplessTypes() { - api.Scheme.AddKnownTypes(grouplessGroupVersion, + scheme.AddKnownTypes(grouplessGroupVersion, &genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ListOptions{}, &metav1.ExportOptions{}, &metav1.DeleteOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{}) - api.Scheme.AddKnownTypes(grouplessInternalGroupVersion, + scheme.AddKnownTypes(grouplessInternalGroupVersion, &genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{}) } @@ -138,31 +154,31 @@ func addTestTypes() { ResourceVersion string `json:"resourceVersion,omitempty"` TimeoutSeconds *int64 `json:"timeoutSeconds,omitempty"` } - api.Scheme.AddKnownTypes(testGroupVersion, + scheme.AddKnownTypes(testGroupVersion, &genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{}, &metav1.DeleteOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{}, &SimpleXGSubresource{}) - api.Scheme.AddKnownTypes(testGroupVersion, &v1.Pod{}) - api.Scheme.AddKnownTypes(testInternalGroupVersion, + scheme.AddKnownTypes(testGroupVersion, &examplev1.Pod{}) + scheme.AddKnownTypes(testInternalGroupVersion, &genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{}, &SimpleXGSubresource{}) - api.Scheme.AddKnownTypes(testInternalGroupVersion, &api.Pod{}) + scheme.AddKnownTypes(testInternalGroupVersion, &example.Pod{}) // Register SimpleXGSubresource in both testGroupVersion and testGroup2Version, and also their // their corresponding internal versions, to verify that the desired group version object is // served in the tests. - api.Scheme.AddKnownTypes(testGroup2Version, &SimpleXGSubresource{}, &metav1.ExportOptions{}) - api.Scheme.AddKnownTypes(testInternalGroup2Version, &SimpleXGSubresource{}, &metav1.ExportOptions{}) - metav1.AddToGroupVersion(api.Scheme, testGroupVersion) + scheme.AddKnownTypes(testGroup2Version, &SimpleXGSubresource{}, &metav1.ExportOptions{}) + scheme.AddKnownTypes(testInternalGroup2Version, &SimpleXGSubresource{}, &metav1.ExportOptions{}) + metav1.AddToGroupVersion(scheme, testGroupVersion) } func addNewTestTypes() { - api.Scheme.AddKnownTypes(newGroupVersion, + scheme.AddKnownTypes(newGroupVersion, &genericapitesting.Simple{}, &genericapitesting.SimpleList{}, &metav1.ExportOptions{}, &metav1.DeleteOptions{}, &genericapitesting.SimpleGetOptions{}, &genericapitesting.SimpleRoot{}, - &v1.Pod{}, + &examplev1.Pod{}, ) - metav1.AddToGroupVersion(api.Scheme, newGroupVersion) + metav1.AddToGroupVersion(scheme, newGroupVersion) } func init() { @@ -178,7 +194,7 @@ func init() { // enumerate all supported versions, get the kinds, and register with // the mapper how to address our resources for _, gv := range groupVersions { - for kind := range api.Scheme.KnownTypes(gv) { + for kind := range scheme.KnownTypes(gv) { gvk := gv.WithKind(kind) root := bool(kind == "SimpleRoot") if root { @@ -194,17 +210,17 @@ func init() { admissionControl = admit.NewAlwaysAdmit() requestContextMapper = request.NewRequestContextMapper() - api.Scheme.AddFieldLabelConversionFunc(grouplessGroupVersion.String(), "Simple", + scheme.AddFieldLabelConversionFunc(grouplessGroupVersion.String(), "Simple", func(label, value string) (string, string, error) { return label, value, nil }, ) - api.Scheme.AddFieldLabelConversionFunc(testGroupVersion.String(), "Simple", + scheme.AddFieldLabelConversionFunc(testGroupVersion.String(), "Simple", func(label, value string) (string, string, error) { return label, value, nil }, ) - api.Scheme.AddFieldLabelConversionFunc(newGroupVersion.String(), "Simple", + scheme.AddFieldLabelConversionFunc(newGroupVersion.String(), "Simple", func(label, value string) (string, string, error) { return label, value, nil }, @@ -245,14 +261,14 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission. template := APIGroupVersion{ Storage: storage, - Creater: api.Scheme, - Convertor: api.Scheme, - Copier: api.Scheme, - Typer: api.Scheme, + Creater: scheme, + Convertor: scheme, + Copier: scheme, + Typer: scheme, Linker: selfLinker, Mapper: namespaceMapper, - ParameterCodec: api.ParameterCodec, + ParameterCodec: parameterCodec, Admit: admissionControl, Context: requestContextMapper, @@ -264,7 +280,7 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission. group.Root = "/" + grouplessPrefix group.GroupVersion = grouplessGroupVersion group.OptionsExternalVersion = &grouplessGroupVersion - group.Serializer = api.Codecs + group.Serializer = codecs if err := (&group).InstallREST(container); err != nil { panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) } @@ -276,7 +292,7 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission. group.Root = "/" + prefix group.GroupVersion = testGroupVersion group.OptionsExternalVersion = &testGroupVersion - group.Serializer = api.Codecs + group.Serializer = codecs if err := (&group).InstallREST(container); err != nil { panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) } @@ -288,7 +304,7 @@ func handleInternal(storage map[string]rest.Storage, admissionControl admission. group.Root = "/" + prefix group.GroupVersion = newGroupVersion group.OptionsExternalVersion = &newGroupVersion - group.Serializer = api.Codecs + group.Serializer = codecs if err := (&group).InstallREST(container); err != nil { panic(fmt.Sprintf("unable to install container %s: %v", group.GroupVersion, err)) } @@ -430,7 +446,7 @@ func (storage *SimpleRESTStorage) Get(ctx request.Context, id string, options *m if id == "binary" { return storage.stream, storage.errors["get"] } - copied, err := api.Scheme.Copy(&storage.item) + copied, err := scheme.Copy(&storage.item) if err != nil { panic(err) } @@ -664,7 +680,7 @@ func (storage *SimpleTypedStorage) New() runtime.Object { func (storage *SimpleTypedStorage) Get(ctx request.Context, id string, options *metav1.GetOptions) (runtime.Object, error) { storage.checkContext(ctx) - copied, err := api.Scheme.Copy(storage.item) + copied, err := scheme.Copy(storage.item) if err != nil { panic(err) } @@ -1627,7 +1643,7 @@ func TestGetNamespaceSelfLink(t *testing.T) { func TestGetMissing(t *testing.T) { storage := map[string]rest.Storage{} simpleStorage := SimpleRESTStorage{ - errors: map[string]error{"get": apierrs.NewNotFound(api.Resource("simples"), "id")}, + errors: map[string]error{"get": apierrs.NewNotFound(schema.GroupResource{Resource: "simples"}, "id")}, } storage["simple"] = &simpleStorage handler := handle(storage) @@ -1647,7 +1663,7 @@ func TestGetMissing(t *testing.T) { func TestGetRetryAfter(t *testing.T) { storage := map[string]rest.Storage{} simpleStorage := SimpleRESTStorage{ - errors: map[string]error{"get": apierrs.NewServerTimeout(api.Resource("simples"), "id", 2)}, + errors: map[string]error{"get": apierrs.NewServerTimeout(schema.GroupResource{Resource: "simples"}, "id", 2)}, } storage["simple"] = &simpleStorage handler := handle(storage) @@ -1750,7 +1766,7 @@ func TestConnectResponderError(t *testing.T) { connectStorage := &ConnecterRESTStorage{} connectStorage.handlerFunc = func() http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - connectStorage.receivedResponder.Error(apierrs.NewForbidden(api.Resource("simples"), itemID, errors.New("you are terminated"))) + connectStorage.receivedResponder.Error(apierrs.NewForbidden(schema.GroupResource{Resource: "simples"}, itemID, errors.New("you are terminated"))) }) } storage := map[string]rest.Storage{ @@ -2135,7 +2151,7 @@ func TestDeleteMissing(t *testing.T) { storage := map[string]rest.Storage{} ID := "id" simpleStorage := SimpleRESTStorage{ - errors: map[string]error{"delete": apierrs.NewNotFound(api.Resource("simples"), ID)}, + errors: map[string]error{"delete": apierrs.NewNotFound(schema.GroupResource{Resource: "simples"}, ID)}, } storage["simple"] = &simpleStorage handler := handle(storage) @@ -2438,7 +2454,7 @@ func TestUpdateMissing(t *testing.T) { storage := map[string]rest.Storage{} ID := "id" simpleStorage := SimpleRESTStorage{ - errors: map[string]error{"update": apierrs.NewNotFound(api.Resource("simples"), ID)}, + errors: map[string]error{"update": apierrs.NewNotFound(schema.GroupResource{Resource: "simples"}, ID)}, } storage["simple"] = &simpleStorage handler := handle(storage) @@ -2473,7 +2489,7 @@ func TestCreateNotFound(t *testing.T) { "simple": &SimpleRESTStorage{ // storage.Create can fail with not found error in theory. // See http://pr.k8s.io/486#discussion_r15037092. - errors: map[string]error{"create": apierrs.NewNotFound(api.Resource("simples"), "id")}, + errors: map[string]error{"create": apierrs.NewNotFound(schema.GroupResource{Resource: "simples"}, "id")}, }, }) server := httptest.NewServer(handler) @@ -2506,7 +2522,7 @@ func TestCreateChecksDecode(t *testing.T) { defer server.Close() client := http.Client{} - simple := &api.Pod{} + simple := &example.Pod{} data, err := runtime.Encode(testCodec, simple) if err != nil { t.Errorf("unexpected error: %v", err) @@ -2537,10 +2553,10 @@ func TestUpdateREST(t *testing.T) { return &APIGroupVersion{ Storage: storage, Root: "/" + prefix, - Creater: api.Scheme, - Convertor: api.Scheme, - Copier: api.Scheme, - Typer: api.Scheme, + Creater: scheme, + Convertor: scheme, + Copier: scheme, + Typer: scheme, Linker: selfLinker, Admit: admissionControl, @@ -2550,8 +2566,8 @@ func TestUpdateREST(t *testing.T) { GroupVersion: newGroupVersion, OptionsExternalVersion: &newGroupVersion, - Serializer: api.Codecs, - ParameterCodec: api.ParameterCodec, + Serializer: codecs, + ParameterCodec: parameterCodec, } } @@ -2621,10 +2637,10 @@ func TestParentResourceIsRequired(t *testing.T) { "simple/sub": storage, }, Root: "/" + prefix, - Creater: api.Scheme, - Convertor: api.Scheme, - Copier: api.Scheme, - Typer: api.Scheme, + Creater: scheme, + Convertor: scheme, + Copier: scheme, + Typer: scheme, Linker: selfLinker, Admit: admissionControl, @@ -2634,8 +2650,8 @@ func TestParentResourceIsRequired(t *testing.T) { GroupVersion: newGroupVersion, OptionsExternalVersion: &newGroupVersion, - Serializer: api.Codecs, - ParameterCodec: api.ParameterCodec, + Serializer: codecs, + ParameterCodec: parameterCodec, } container := restful.NewContainer() if err := group.InstallREST(container); err == nil { @@ -2652,10 +2668,10 @@ func TestParentResourceIsRequired(t *testing.T) { "simple/sub": storage, }, Root: "/" + prefix, - Creater: api.Scheme, - Convertor: api.Scheme, - Copier: api.Scheme, - Typer: api.Scheme, + Creater: scheme, + Convertor: scheme, + Copier: scheme, + Typer: scheme, Linker: selfLinker, Admit: admissionControl, @@ -2665,8 +2681,8 @@ func TestParentResourceIsRequired(t *testing.T) { GroupVersion: newGroupVersion, OptionsExternalVersion: &newGroupVersion, - Serializer: api.Codecs, - ParameterCodec: api.ParameterCodec, + Serializer: codecs, + ParameterCodec: parameterCodec, } container = restful.NewContainer() if err := group.InstallREST(container); err != nil { @@ -2729,7 +2745,7 @@ func TestUpdateChecksDecode(t *testing.T) { defer server.Close() client := http.Client{} - simple := &api.Pod{} + simple := &example.Pod{} data, err := runtime.Encode(testCodec, simple) if err != nil { t.Errorf("unexpected error: %v", err) @@ -2855,12 +2871,12 @@ func TestCreateYAML(t *testing.T) { simple := &genericapitesting.Simple{ Other: "bar", } - info, ok := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), "application/yaml") + info, ok := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), "application/yaml") if !ok { t.Fatal("No yaml serializer") } - encoder := api.Codecs.EncoderForVersion(info.Serializer, testGroupVersion) - decoder := api.Codecs.DecoderToVersion(info.Serializer, testInternalGroupVersion) + encoder := codecs.EncoderForVersion(info.Serializer, testGroupVersion) + decoder := codecs.DecoderToVersion(info.Serializer, testInternalGroupVersion) data, err := runtime.Encode(encoder, simple) if err != nil { @@ -3034,7 +3050,7 @@ func expectApiStatus(t *testing.T, method, url string, data []byte, code int) *m func TestDelayReturnsError(t *testing.T) { storage := SimpleRESTStorage{ injectedFunction: func(obj runtime.Object) (runtime.Object, error) { - return nil, apierrs.NewAlreadyExists(api.Resource("foos"), "bar") + return nil, apierrs.NewAlreadyExists(schema.GroupResource{Resource: "foos"}, "bar") }, } handler := handle(map[string]rest.Storage{"foo": &storage}) @@ -3057,7 +3073,7 @@ func (obj *UnregisteredAPIObject) GetObjectKind() schema.ObjectKind { func TestWriteJSONDecodeError(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - responsewriters.WriteObjectNegotiated(api.Codecs, newGroupVersion, w, req, http.StatusOK, &UnregisteredAPIObject{"Undecodable"}) + responsewriters.WriteObjectNegotiated(codecs, newGroupVersion, w, req, http.StatusOK, &UnregisteredAPIObject{"Undecodable"}) })) defer server.Close() // We send a 200 status code before we encode the object, so we expect OK, but there will @@ -3239,7 +3255,7 @@ func (storage *SimpleXGSubresourceRESTStorage) New() runtime.Object { } func (storage *SimpleXGSubresourceRESTStorage) Get(ctx request.Context, id string, options *metav1.GetOptions) (runtime.Object, error) { - copied, err := api.Scheme.Copy(&storage.item) + copied, err := scheme.Copy(&storage.item) if err != nil { panic(err) } @@ -3265,14 +3281,14 @@ func TestXGSubresource(t *testing.T) { group := APIGroupVersion{ Storage: storage, - Creater: api.Scheme, - Convertor: api.Scheme, - Copier: api.Scheme, - Typer: api.Scheme, + Creater: scheme, + Convertor: scheme, + Copier: scheme, + Typer: scheme, Linker: selfLinker, Mapper: namespaceMapper, - ParameterCodec: api.ParameterCodec, + ParameterCodec: parameterCodec, Admit: admissionControl, Context: requestContextMapper, @@ -3280,7 +3296,7 @@ func TestXGSubresource(t *testing.T) { Root: "/" + prefix, GroupVersion: testGroupVersion, OptionsExternalVersion: &testGroupVersion, - Serializer: api.Codecs, + Serializer: codecs, SubresourceGroupVersionKind: map[string]schema.GroupVersionKind{ "simple/subsimple": testGroup2Version.WithKind("SimpleXGSubresource"), @@ -3352,8 +3368,8 @@ func BenchmarkUpdateProtobuf(b *testing.B) { dest.Path = "/" + prefix + "/" + newGroupVersion.Group + "/" + newGroupVersion.Version + "/namespaces/foo/simples/bar" dest.RawQuery = "" - info, _ := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), "application/vnd.kubernetes.protobuf") - e := api.Codecs.EncoderForVersion(info.Serializer, newGroupVersion) + info, _ := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), "application/vnd.kubernetes.protobuf") + e := codecs.EncoderForVersion(info.Serializer, newGroupVersion) data, err := runtime.Encode(e, &items[0]) if err != nil { b.Fatal(err) @@ -3396,12 +3412,11 @@ func newTestRequestInfoResolver() *request.RequestInfoFactory { const benchmarkSeed = 100 -func benchmarkItems(b *testing.B) []api.Pod { - apiObjectFuzzer := apitesting.FuzzerFor(kapitesting.FuzzerFuncs(b), rand.NewSource(benchmarkSeed)) - items := make([]api.Pod, 3) +func benchmarkItems(b *testing.B) []example.Pod { + clientapiObjectFuzzer := apitesting.FuzzerFor(examplefuzzer.Funcs(b, codecs), rand.NewSource(benchmarkSeed)) + items := make([]example.Pod, 3) for i := range items { - apiObjectFuzzer.Fuzz(&items[i]) - items[i].Spec.InitContainers, items[i].Status.InitContainerStatuses = nil, nil + clientapiObjectFuzzer.Fuzz(&items[i]) } return items } diff --git a/pkg/genericapiserver/endpoints/watch_test.go b/pkg/genericapiserver/endpoints/watch_test.go index 3da84d60f0..bc6053230b 100644 --- a/pkg/genericapiserver/endpoints/watch_test.go +++ b/pkg/genericapiserver/endpoints/watch_test.go @@ -30,6 +30,7 @@ import ( "time" "golang.org/x/net/websocket" + apiequality "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" @@ -38,7 +39,7 @@ import ( "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" - "k8s.io/kubernetes/pkg/api" + example "k8s.io/apiserver/pkg/apis/example" "k8s.io/kubernetes/pkg/genericapiserver/endpoints/handlers" apitesting "k8s.io/kubernetes/pkg/genericapiserver/endpoints/testing" "k8s.io/kubernetes/pkg/genericapiserver/registry/rest" @@ -72,13 +73,19 @@ var watchTestTable = []struct { {watch.Deleted, &apitesting.Simple{ObjectMeta: metav1.ObjectMeta{Name: "bar"}}}, } -var podWatchTestTable = []struct { +func podWatchTestTable() []struct { t watch.EventType obj runtime.Object -}{ - {watch.Added, roundTripOrDie(codec, &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}})}, - {watch.Modified, roundTripOrDie(codec, &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}})}, - {watch.Deleted, roundTripOrDie(codec, &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}})}, +} { + // creaze lazily here in a func because podWatchTestTable can only be used after all types are registered. + return []struct { + t watch.EventType + obj runtime.Object + }{ + {watch.Added, roundTripOrDie(codec, &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}})}, + {watch.Modified, roundTripOrDie(codec, &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}})}, + {watch.Deleted, roundTripOrDie(codec, &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}})}, + } } func TestWatchWebsocket(t *testing.T) { @@ -114,9 +121,6 @@ func TestWatchWebsocket(t *testing.T) { if err != nil { t.Fatalf("Decode error: %v\n%v", err, got) } - if _, err := api.GetReference(api.Scheme, gotObj); err != nil { - t.Errorf("Unable to construct reference: %v", err) - } if e, a := object, gotObj; !reflect.DeepEqual(e, a) { t.Errorf("Expected %#v, got %#v", e, a) } @@ -167,9 +171,6 @@ func TestWatchWebsocketClientClose(t *testing.T) { if err != nil { t.Fatalf("Decode error: %v\n%v", err, got) } - if _, err := api.GetReference(api.Scheme, gotObj); err != nil { - t.Errorf("Unable to construct reference: %v", err) - } if e, a := object, gotObj; !reflect.DeepEqual(e, a) { t.Errorf("Expected %#v, got %#v", e, a) } @@ -300,7 +301,7 @@ func TestWatchRead(t *testing.T) { for _, protocol := range protocols { for _, test := range testCases { func() { - info, ok := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), test.MediaType) + info, ok := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), test.MediaType) if !ok || info.StreamSerializer == nil { t.Fatal(info) } @@ -312,7 +313,7 @@ func TestWatchRead(t *testing.T) { if contentType != "__default__" && contentType != test.ExpectedContentType { t.Errorf("Unexpected content type: %#v", contentType) } - objectCodec := api.Codecs.DecoderToVersion(info.Serializer, testInternalGroupVersion) + objectCodec := codecs.DecoderToVersion(info.Serializer, testInternalGroupVersion) var fr io.ReadCloser = r if !protocol.selfFraming { @@ -326,7 +327,7 @@ func TestWatchRead(t *testing.T) { time.Sleep(time.Millisecond) } - for i, item := range podWatchTestTable { + for i, item := range podWatchTestTable() { action, object := item.t, item.obj name := fmt.Sprintf("%s-%s-%d", protocol.name, test.MediaType, i) @@ -346,10 +347,7 @@ func TestWatchRead(t *testing.T) { if err != nil { t.Fatalf("%s: Decode error: %v", name, err) } - if _, err := api.GetReference(api.Scheme, gotObj); err != nil { - t.Errorf("%s: Unable to construct reference: %v", name, err) - } - if e, a := object, gotObj; !api.Semantic.DeepEqual(e, a) { + if e, a := object, gotObj; !apiequality.Semantic.DeepEqual(e, a) { t.Errorf("%s: different: %s", name, diff.ObjectDiff(e, a)) } } @@ -569,7 +567,7 @@ func TestWatchHTTPTimeout(t *testing.T) { timeoutCh := make(chan time.Time) done := make(chan struct{}) - info, ok := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), runtime.ContentTypeJSON) + info, ok := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), runtime.ContentTypeJSON) if !ok || info.StreamSerializer == nil { t.Fatal(info) } diff --git a/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer.go b/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer/fuzzer.go similarity index 82% rename from staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer.go rename to staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer/fuzzer.go index 6ccaf72d39..1dac46fd26 100644 --- a/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer.go +++ b/staging/src/k8s.io/apiserver/pkg/apis/example/fuzzer/fuzzer.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package example +package fuzzer import ( "github.com/google/gofuzz" @@ -23,6 +23,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" examplev1 "k8s.io/apiserver/pkg/apis/example/v1" + "k8s.io/apiserver/pkg/apis/example" ) // overrideGenericFuncs override some generic fuzzer funcs from k8s.io/apiserver in order to have more realistic @@ -38,7 +39,7 @@ func overrideGenericFuncs(t apitesting.TestingCommon, codecs runtimeserializer.C ContentType: runtime.ContentTypeJSON, } } else { - types := []runtime.Object{&Pod{}} + types := []runtime.Object{&example.Pod{}} t := types[c.Rand.Intn(len(types))] c.Fuzz(t) *j = t @@ -46,7 +47,7 @@ func overrideGenericFuncs(t apitesting.TestingCommon, codecs runtimeserializer.C }, func(r *runtime.RawExtension, c fuzz.Continue) { // Pick an arbitrary type and fuzz it - types := []runtime.Object{&Pod{}} + types := []runtime.Object{&example.Pod{}} obj := types[c.Rand.Intn(len(types))] c.Fuzz(obj) @@ -65,7 +66,7 @@ func overrideGenericFuncs(t apitesting.TestingCommon, codecs runtimeserializer.C func exampleFuncs(t apitesting.TestingCommon) []interface{} { return []interface{}{ - func(s *PodSpec, c fuzz.Continue) { + func(s *example.PodSpec, c fuzz.Continue) { c.FuzzNoCustom(s) // has a default value ttl := int64(30) @@ -78,18 +79,18 @@ func exampleFuncs(t apitesting.TestingCommon) []interface{} { s.SchedulerName = "default-scheduler" } }, - func(j *PodPhase, c fuzz.Continue) { - statuses := []PodPhase{"Pending", "Running", "Succeeded", "Failed", "Unknown"} + func(j *example.PodPhase, c fuzz.Continue) { + statuses := []example.PodPhase{"Pending", "Running", "Succeeded", "Failed", "Unknown"} *j = statuses[c.Rand.Intn(len(statuses))] }, - func(rp *RestartPolicy, c fuzz.Continue) { - policies := []RestartPolicy{"Always", "Never", "OnFailure"} + func(rp *example.RestartPolicy, c fuzz.Continue) { + policies := []example.RestartPolicy{"Always", "Never", "OnFailure"} *rp = policies[c.Rand.Intn(len(policies))] }, } } -func FuzzerFuncs(t apitesting.TestingCommon, codecs runtimeserializer.CodecFactory) []interface{} { +func Funcs(t apitesting.TestingCommon, codecs runtimeserializer.CodecFactory) []interface{} { return apitesting.MergeFuzzerFuncs(t, apitesting.GenericFuzzerFuncs(t, codecs), overrideGenericFuncs(t, codecs),