mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 02:08:13 +00:00 
			
		
		
		
	pkg/genericapiserver/endpoints: cutting off pkg/api deps
This commit is contained in:
		| @@ -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), | ||||
		Reference in New Issue
	
	Block a user
	 Dr. Stefan Schimanski
					Dr. Stefan Schimanski