mirror of https://github.com/k3s-io/k3s
pkg/genericapiserver/endpoints: cutting off pkg/api deps
parent
b51252ab5b
commit
a5d5527e96
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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),
|
Loading…
Reference in New Issue