pkg/genericapiserver/endpoints: cutting off pkg/api deps

pull/6/head
Dr. Stefan Schimanski 2017-01-24 12:11:11 +01:00
parent b51252ab5b
commit a5d5527e96
3 changed files with 124 additions and 110 deletions

View File

@ -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
}

View File

@ -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)
}

View File

@ -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),