From bfe0d50ce82959fcc7a8a043104619a80a5e1268 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Thu, 2 Feb 2017 08:30:11 +0100 Subject: [PATCH] pkg/genericapiserver/server: cut off from pkg/api --- .../pkg/apiserver/apiserver.go | 3 +- cmd/kube-aggregator/pkg/cmd/server/start.go | 3 +- cmd/kube-apiserver/app/server.go | 5 ++- examples/apiserver/apiserver.go | 3 +- .../cmd/federation-apiserver/app/server.go | 11 ++--- pkg/genericapiserver/server/config.go | 12 ++++-- .../server/genericapiserver.go | 15 ++++--- .../server/genericapiserver_test.go | 14 +++--- .../server/resource_encoding_config.go | 33 +++++++------- .../server/storage_factory_test.go | 43 +++++++++++++------ pkg/master/master_openapi_test.go | 3 +- pkg/master/master_test.go | 4 +- pkg/registry/apps/rest/storage_apps.go | 3 +- .../rest/storage_authentication.go | 3 +- .../rest/storage_authorization.go | 3 +- .../autoscaling/rest/storage_autoscaling.go | 3 +- pkg/registry/batch/rest/storage_batch.go | 3 +- .../certificates/rest/storage_certificates.go | 3 +- .../extensions/rest/storage_extensions.go | 3 +- pkg/registry/policy/rest/storage_policy.go | 3 +- pkg/registry/rbac/rest/storage_rbac.go | 3 +- pkg/registry/storage/rest/storage_storage.go | 3 +- test/integration/framework/master_utils.go | 6 +-- 23 files changed, 114 insertions(+), 71 deletions(-) diff --git a/cmd/kube-aggregator/pkg/apiserver/apiserver.go b/cmd/kube-aggregator/pkg/apiserver/apiserver.go index c0da8ae52e..342340a691 100644 --- a/cmd/kube-aggregator/pkg/apiserver/apiserver.go +++ b/cmd/kube-aggregator/pkg/apiserver/apiserver.go @@ -24,6 +24,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" genericfilters "k8s.io/apiserver/pkg/server/filters" + "k8s.io/kubernetes/pkg/api" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" kubeinformers "k8s.io/kubernetes/pkg/client/informers/informers_generated" v1listers "k8s.io/kubernetes/pkg/client/listers/core/v1" @@ -140,7 +141,7 @@ func (c completedConfig) New() (*APIDiscoveryServer, error) { proxyMux: proxyMux, } - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) apiGroupInfo.GroupMeta.GroupVersion = v1alpha1.SchemeGroupVersion v1alpha1storage := map[string]rest.Storage{} v1alpha1storage["apiservices"] = apiservicestorage.NewREST(c.RESTOptionsGetter) diff --git a/cmd/kube-aggregator/pkg/cmd/server/start.go b/cmd/kube-aggregator/pkg/cmd/server/start.go index 3a8cc74462..a08db29a1e 100644 --- a/cmd/kube-aggregator/pkg/cmd/server/start.go +++ b/cmd/kube-aggregator/pkg/cmd/server/start.go @@ -116,7 +116,8 @@ func (o DiscoveryServerOptions) RunDiscoveryServer() error { return fmt.Errorf("error creating self-signed certificates: %v", err) } - genericAPIServerConfig := genericapiserver.NewConfig() + genericAPIServerConfig := genericapiserver.NewConfig(). + WithSerializer(api.Codecs) if _, err := genericAPIServerConfig.ApplySecureServingOptions(o.SecureServing); err != nil { return err } diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index ddcbbe825d..53bd6a62c7 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -108,6 +108,7 @@ func Run(s *options.ServerRunOptions) error { // create config from options genericConfig := genericapiserver.NewConfig(). + WithSerializer(api.Codecs). ApplyOptions(s.GenericServerRunOptions). ApplyInsecureServingOptions(s.InsecureServing) @@ -197,7 +198,7 @@ func Run(s *options.ServerRunOptions) error { } storageFactory, err := kubeapiserver.BuildDefaultStorageFactory( s.Etcd.StorageConfig, s.GenericServerRunOptions.DefaultStorageMediaType, api.Codecs, - genericapiserver.NewDefaultResourceEncodingConfig(), storageGroupsToEncodingVersion, + genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion, // FIXME: this GroupVersionResource override should be configurable []schema.GroupVersionResource{batch.Resource("cronjobs").WithVersion("v2alpha1")}, master.DefaultAPIResourceConfigSource(), s.GenericServerRunOptions.RuntimeConfig) @@ -297,7 +298,7 @@ func Run(s *options.ServerRunOptions) error { genericConfig.Authenticator = apiAuthenticator genericConfig.Authorizer = apiAuthorizer genericConfig.AdmissionControl = admissionController - genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions) + genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(generatedopenapi.GetOpenAPIDefinitions, api.Scheme) genericConfig.OpenAPIConfig.PostProcessSpec = postProcessOpenAPISpecForBackwardCompatibility genericConfig.OpenAPIConfig.SecurityDefinitions = securityDefinitions genericConfig.OpenAPIConfig.Info.Title = "Kubernetes" diff --git a/examples/apiserver/apiserver.go b/examples/apiserver/apiserver.go index 012898afca..05acb76c24 100644 --- a/examples/apiserver/apiserver.go +++ b/examples/apiserver/apiserver.go @@ -51,7 +51,7 @@ func newStorageFactory() genericapiserver.StorageFactory { ServerList: []string{"http://127.0.0.1:2379"}, Copier: api.Scheme, } - storageFactory := genericapiserver.NewDefaultStorageFactory(config, "application/json", api.Codecs, genericapiserver.NewDefaultResourceEncodingConfig(), genericapiserver.NewResourceConfig()) + storageFactory := genericapiserver.NewDefaultStorageFactory(config, "application/json", api.Codecs, genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), genericapiserver.NewResourceConfig()) return storageFactory } @@ -104,6 +104,7 @@ func (serverOptions *ServerRunOptions) Run(stopCh <-chan struct{}) error { // create config from options config := genericapiserver.NewConfig(). + WithSerializer(api.Codecs). ApplyOptions(serverOptions.GenericServerRunOptions). ApplyInsecureServingOptions(serverOptions.InsecureServing) diff --git a/federation/cmd/federation-apiserver/app/server.go b/federation/cmd/federation-apiserver/app/server.go index 65d01d99dc..5836283da8 100644 --- a/federation/cmd/federation-apiserver/app/server.go +++ b/federation/cmd/federation-apiserver/app/server.go @@ -88,9 +88,10 @@ func Run(s *options.ServerRunOptions) error { return utilerrors.NewAggregate(errs) } - genericConfig := genericapiserver.NewConfig(). // create the new config - ApplyOptions(s.GenericServerRunOptions). // apply the options selected - ApplyInsecureServingOptions(s.InsecureServing) + genericConfig := genericapiserver.NewConfig(). + WithSerializer(api.Codecs). + ApplyOptions(s.GenericServerRunOptions). + ApplyInsecureServingOptions(s.InsecureServing) if _, err := genericConfig.ApplySecureServingOptions(s.SecureServing); err != nil { return fmt.Errorf("failed to configure https: %s", err) @@ -112,7 +113,7 @@ func Run(s *options.ServerRunOptions) error { } storageFactory, err := kubeapiserver.BuildDefaultStorageFactory( s.Etcd.StorageConfig, s.GenericServerRunOptions.DefaultStorageMediaType, api.Codecs, - genericapiserver.NewDefaultResourceEncodingConfig(), storageGroupsToEncodingVersion, + genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion, []schema.GroupVersionResource{}, resourceConfig, s.GenericServerRunOptions.RuntimeConfig) if err != nil { return fmt.Errorf("error in initializing storage factory: %s", err) @@ -177,7 +178,7 @@ func Run(s *options.ServerRunOptions) error { genericConfig.Authenticator = apiAuthenticator genericConfig.Authorizer = apiAuthorizer genericConfig.AdmissionControl = admissionController - genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapi.GetOpenAPIDefinitions) + genericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapi.GetOpenAPIDefinitions, api.Scheme) genericConfig.OpenAPIConfig.PostProcessSpec = postProcessOpenAPISpecForBackwardCompatibility genericConfig.OpenAPIConfig.SecurityDefinitions = securityDefinitions genericConfig.SwaggerConfig = genericapiserver.DefaultSwaggerConfig() diff --git a/pkg/genericapiserver/server/config.go b/pkg/genericapiserver/server/config.go index ad1289e744..741288507d 100644 --- a/pkg/genericapiserver/server/config.go +++ b/pkg/genericapiserver/server/config.go @@ -39,6 +39,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" openapicommon "k8s.io/apimachinery/pkg/openapi" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/version" "k8s.io/apiserver/pkg/admission" @@ -55,7 +56,6 @@ import ( "k8s.io/apiserver/pkg/server/options" restclient "k8s.io/client-go/rest" certutil "k8s.io/client-go/util/cert" - "k8s.io/kubernetes/pkg/api" genericapifilters "k8s.io/kubernetes/pkg/genericapiserver/endpoints/filters" apiopenapi "k8s.io/kubernetes/pkg/genericapiserver/endpoints/openapi" "k8s.io/kubernetes/pkg/genericapiserver/server/mux" @@ -192,7 +192,6 @@ type SecureServingInfo struct { // NewConfig returns a Config struct with the default values func NewConfig() *Config { config := &Config{ - Serializer: api.Codecs, ReadWritePort: 6443, RequestContextMapper: apirequest.NewRequestContextMapper(), BuildHandlerChainsFunc: DefaultBuildHandlerChain, @@ -213,8 +212,13 @@ func NewConfig() *Config { return config.ApplyOptions(defaultOptions) } -func DefaultOpenAPIConfig(getDefinitions openapicommon.GetOpenAPIDefinitions) *openapicommon.Config { - defNamer := apiopenapi.NewDefinitionNamer(api.Scheme) +func (c *Config) WithSerializer(codecs serializer.CodecFactory) *Config { + c.Serializer = codecs + return c +} + +func DefaultOpenAPIConfig(getDefinitions openapicommon.GetOpenAPIDefinitions, scheme *runtime.Scheme) *openapicommon.Config { + defNamer := apiopenapi.NewDefinitionNamer(scheme) return &openapicommon.Config{ ProtocolList: []string{"https"}, IgnorePrefixes: []string{"/swaggerapi"}, diff --git a/pkg/genericapiserver/server/genericapiserver.go b/pkg/genericapiserver/server/genericapiserver.go index a2edf94d9d..b2458e2d95 100644 --- a/pkg/genericapiserver/server/genericapiserver.go +++ b/pkg/genericapiserver/server/genericapiserver.go @@ -31,17 +31,18 @@ import ( "github.com/golang/glog" "k8s.io/apimachinery/pkg/apimachinery" + "k8s.io/apimachinery/pkg/apimachinery/registered" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" openapicommon "k8s.io/apimachinery/pkg/openapi" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/admission" apirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/server/healthz" restclient "k8s.io/client-go/rest" - "k8s.io/kubernetes/pkg/api" genericapi "k8s.io/kubernetes/pkg/genericapiserver/endpoints" "k8s.io/kubernetes/pkg/genericapiserver/registry/rest" genericmux "k8s.io/kubernetes/pkg/genericapiserver/server/mux" @@ -376,15 +377,15 @@ func (s *GenericAPIServer) DynamicApisDiscovery() *restful.WebService { // NewDefaultAPIGroupInfo returns an APIGroupInfo stubbed with "normal" values // exposed for easier composition from other packages -func NewDefaultAPIGroupInfo(group string) APIGroupInfo { - groupMeta := api.Registry.GroupOrDie(group) +func NewDefaultAPIGroupInfo(group string, registry *registered.APIRegistrationManager, scheme *runtime.Scheme, parameterCodec runtime.ParameterCodec, codecs serializer.CodecFactory) APIGroupInfo { + groupMeta := registry.GroupOrDie(group) return APIGroupInfo{ GroupMeta: *groupMeta, VersionedResourcesStorageMap: map[string]map[string]rest.Storage{}, - OptionsExternalVersion: &api.Registry.GroupOrDie(api.GroupName).GroupVersion, - Scheme: api.Scheme, - ParameterCodec: api.ParameterCodec, - NegotiatedSerializer: api.Codecs, + OptionsExternalVersion: ®istry.GroupOrDie("").GroupVersion, + Scheme: scheme, + ParameterCodec: parameterCodec, + NegotiatedSerializer: codecs, } } diff --git a/pkg/genericapiserver/server/genericapiserver_test.go b/pkg/genericapiserver/server/genericapiserver_test.go index d3a1d34302..7a311b49eb 100644 --- a/pkg/genericapiserver/server/genericapiserver_test.go +++ b/pkg/genericapiserver/server/genericapiserver_test.go @@ -41,10 +41,12 @@ import ( utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/version" + "k8s.io/apiserver/pkg/apis/example" + examplev1 "k8s.io/apiserver/pkg/apis/example/v1" "k8s.io/apiserver/pkg/authentication/user" "k8s.io/apiserver/pkg/authorization/authorizer" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" - "k8s.io/kubernetes/pkg/api/testapi" + "k8s.io/client-go/pkg/api" openapigen "k8s.io/kubernetes/pkg/generated/openapi" "k8s.io/kubernetes/pkg/genericapiserver/registry/rest" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" @@ -71,18 +73,20 @@ func init() { &metav1.APIGroup{}, &metav1.APIResourceList{}, ) + example.AddToScheme(scheme) + examplev1.AddToScheme(scheme) } // setUp is a convience function for setting up for (most) tests. func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertions) { etcdServer, _ := etcdtesting.NewUnsecuredEtcd3TestClientServer(t, scheme) - config := NewConfig() + config := NewConfig().WithSerializer(codecs) config.PublicAddress = net.ParseIP("192.168.10.4") config.RequestContextMapper = genericapirequest.NewRequestContextMapper() config.LegacyAPIGroupPrefixes = sets.NewString("/api") - config.OpenAPIConfig = DefaultOpenAPIConfig(openapigen.GetOpenAPIDefinitions) + config.OpenAPIConfig = DefaultOpenAPIConfig(openapigen.GetOpenAPIDefinitions, api.Scheme) config.OpenAPIConfig.Info = &spec.Info{ InfoProps: spec.InfoProps{ Title: "Kubernetes", @@ -483,8 +487,8 @@ func TestDiscoveryAtAPIS(t *testing.T) { // Add a Group. extensionsVersions := []metav1.GroupVersionForDiscovery{ { - GroupVersion: testapi.Extensions.GroupVersion().String(), - Version: testapi.Extensions.GroupVersion().Version, + GroupVersion: examplev1.SchemeGroupVersion.String(), + Version: examplev1.SchemeGroupVersion.Version, }, } extensionsPreferredVersion := metav1.GroupVersionForDiscovery{ diff --git a/pkg/genericapiserver/server/resource_encoding_config.go b/pkg/genericapiserver/server/resource_encoding_config.go index 9fd1889512..f00ca91e52 100644 --- a/pkg/genericapiserver/server/resource_encoding_config.go +++ b/pkg/genericapiserver/server/resource_encoding_config.go @@ -17,9 +17,9 @@ limitations under the License. package server import ( + "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/kubernetes/pkg/api" ) type ResourceEncodingConfig interface { @@ -33,7 +33,8 @@ type ResourceEncodingConfig interface { } type DefaultResourceEncodingConfig struct { - Groups map[string]*GroupResourceEncodingConfig + groups map[string]*GroupResourceEncodingConfig + registry *registered.APIRegistrationManager } type GroupResourceEncodingConfig struct { @@ -46,8 +47,8 @@ type GroupResourceEncodingConfig struct { var _ ResourceEncodingConfig = &DefaultResourceEncodingConfig{} -func NewDefaultResourceEncodingConfig() *DefaultResourceEncodingConfig { - return &DefaultResourceEncodingConfig{Groups: map[string]*GroupResourceEncodingConfig{}} +func NewDefaultResourceEncodingConfig(registry *registered.APIRegistrationManager) *DefaultResourceEncodingConfig { + return &DefaultResourceEncodingConfig{groups: map[string]*GroupResourceEncodingConfig{}, registry: registry} } func newGroupResourceEncodingConfig(defaultEncoding, defaultInternalVersion schema.GroupVersion) *GroupResourceEncodingConfig { @@ -58,33 +59,33 @@ func newGroupResourceEncodingConfig(defaultEncoding, defaultInternalVersion sche } func (o *DefaultResourceEncodingConfig) SetVersionEncoding(group string, externalEncodingVersion, internalVersion schema.GroupVersion) { - _, groupExists := o.Groups[group] + _, groupExists := o.groups[group] if !groupExists { - o.Groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion) + o.groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion) } - o.Groups[group].DefaultExternalEncoding = externalEncodingVersion - o.Groups[group].DefaultInternalEncoding = internalVersion + o.groups[group].DefaultExternalEncoding = externalEncodingVersion + o.groups[group].DefaultInternalEncoding = internalVersion } func (o *DefaultResourceEncodingConfig) SetResourceEncoding(resourceBeingStored schema.GroupResource, externalEncodingVersion, internalVersion schema.GroupVersion) { group := resourceBeingStored.Group - _, groupExists := o.Groups[group] + _, groupExists := o.groups[group] if !groupExists { - o.Groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion) + o.groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion) } - o.Groups[group].ExternalResourceEncodings[resourceBeingStored.Resource] = externalEncodingVersion - o.Groups[group].InternalResourceEncodings[resourceBeingStored.Resource] = internalVersion + o.groups[group].ExternalResourceEncodings[resourceBeingStored.Resource] = externalEncodingVersion + o.groups[group].InternalResourceEncodings[resourceBeingStored.Resource] = internalVersion } func (o *DefaultResourceEncodingConfig) StorageEncodingFor(resource schema.GroupResource) (schema.GroupVersion, error) { - groupMeta, err := api.Registry.Group(resource.Group) + groupMeta, err := o.registry.Group(resource.Group) if err != nil { return schema.GroupVersion{}, err } - groupEncoding, groupExists := o.Groups[resource.Group] + groupEncoding, groupExists := o.groups[resource.Group] if !groupExists { // return the most preferred external version for the group @@ -100,11 +101,11 @@ func (o *DefaultResourceEncodingConfig) StorageEncodingFor(resource schema.Group } func (o *DefaultResourceEncodingConfig) InMemoryEncodingFor(resource schema.GroupResource) (schema.GroupVersion, error) { - if _, err := api.Registry.Group(resource.Group); err != nil { + if _, err := o.registry.Group(resource.Group); err != nil { return schema.GroupVersion{}, err } - groupEncoding, groupExists := o.Groups[resource.Group] + groupEncoding, groupExists := o.groups[resource.Group] if !groupExists { return schema.GroupVersion{Group: resource.Group, Version: runtime.APIVersionInternal}, nil } diff --git a/pkg/genericapiserver/server/storage_factory_test.go b/pkg/genericapiserver/server/storage_factory_test.go index d4fa24e322..c7dd0159e4 100644 --- a/pkg/genericapiserver/server/storage_factory_test.go +++ b/pkg/genericapiserver/server/storage_factory_test.go @@ -17,17 +17,30 @@ limitations under the License. package server import ( + "os" "reflect" "testing" + "k8s.io/apimachinery/pkg/apimachinery/announced" + "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/apis/example" + exampleinstall "k8s.io/apiserver/pkg/apis/example/install" + examplev1 "k8s.io/apiserver/pkg/apis/example/v1" "k8s.io/apiserver/pkg/server/options" "k8s.io/apiserver/pkg/storage/storagebackend" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/apis/extensions" ) +var ( + registry = registered.NewOrDie(os.Getenv("KUBE_API_VERSIONS")) + announce = make(announced.APIGroupFactoryRegistry) +) + +func init() { + exampleinstall.Install(announce, registry, scheme) +} + type fakeNegotiater struct { serializer, streamSerializer runtime.Serializer framer runtime.Framer @@ -66,18 +79,18 @@ func (n *fakeNegotiater) DecoderToVersion(serializer runtime.Decoder, gv runtime func TestDefaultStorageFactory(t *testing.T) { ns := &fakeNegotiater{types: []string{"test/test"}} - f := NewDefaultStorageFactory(storagebackend.Config{}, "test/test", ns, NewDefaultResourceEncodingConfig(), NewResourceConfig()) - f.AddCohabitatingResources(schema.GroupResource{Resource: "test"}, schema.GroupResource{Resource: "test2", Group: "2"}) + f := NewDefaultStorageFactory(storagebackend.Config{}, "test/test", ns, NewDefaultResourceEncodingConfig(registry), NewResourceConfig()) + f.AddCohabitatingResources(example.Resource("test"), schema.GroupResource{Resource: "test2", Group: "2"}) called := false testEncoderChain := func(e runtime.Encoder) runtime.Encoder { called = true return e } - f.AddSerializationChains(testEncoderChain, nil, schema.GroupResource{Resource: "test"}) - f.SetEtcdLocation(schema.GroupResource{Resource: "*"}, []string{"/server2"}) - f.SetEtcdPrefix(schema.GroupResource{Resource: "test"}, "/prefix_for_test") + f.AddSerializationChains(testEncoderChain, nil, example.Resource("test")) + f.SetEtcdLocation(example.Resource("*"), []string{"/server2"}) + f.SetEtcdPrefix(example.Resource("test"), "/prefix_for_test") - config, err := f.NewConfig(schema.GroupResource{Resource: "test"}) + config, err := f.NewConfig(example.Resource("test")) if err != nil { t.Fatal(err) } @@ -90,20 +103,24 @@ func TestDefaultStorageFactory(t *testing.T) { } func TestUpdateEtcdOverrides(t *testing.T) { + registry := registered.NewOrDie(os.Getenv("KUBE_API_VERSIONS")) + announced := make(announced.APIGroupFactoryRegistry) + exampleinstall.Install(announced, registry, scheme) + testCases := []struct { resource schema.GroupResource servers []string }{ { - resource: schema.GroupResource{Group: api.GroupName, Resource: "resource"}, + resource: schema.GroupResource{Group: example.GroupName, Resource: "resource"}, servers: []string{"http://127.0.0.1:10000"}, }, { - resource: schema.GroupResource{Group: api.GroupName, Resource: "resource"}, + resource: schema.GroupResource{Group: example.GroupName, Resource: "resource"}, servers: []string{"http://127.0.0.1:10000", "http://127.0.0.1:20000"}, }, { - resource: schema.GroupResource{Group: extensions.GroupName, Resource: "resource"}, + resource: schema.GroupResource{Group: example.GroupName, Resource: "resource"}, servers: []string{"http://127.0.0.1:10000"}, }, } @@ -115,7 +132,7 @@ func TestUpdateEtcdOverrides(t *testing.T) { ServerList: defaultEtcdLocation, Copier: scheme, } - storageFactory := NewDefaultStorageFactory(defaultConfig, "", api.Codecs, NewDefaultResourceEncodingConfig(), NewResourceConfig()) + storageFactory := NewDefaultStorageFactory(defaultConfig, "", codecs, NewDefaultResourceEncodingConfig(registry), NewResourceConfig()) storageFactory.SetEtcdLocation(test.resource, test.servers) var err error @@ -129,7 +146,7 @@ func TestUpdateEtcdOverrides(t *testing.T) { continue } - config, err = storageFactory.NewConfig(schema.GroupResource{Group: api.GroupName, Resource: "unlikely"}) + config, err = storageFactory.NewConfig(schema.GroupResource{Group: examplev1.GroupName, Resource: "unlikely"}) if err != nil { t.Errorf("%d: unexpected error %v", i, err) continue diff --git a/pkg/master/master_openapi_test.go b/pkg/master/master_openapi_test.go index 921099e37c..416573d60d 100644 --- a/pkg/master/master_openapi_test.go +++ b/pkg/master/master_openapi_test.go @@ -27,6 +27,7 @@ import ( "net/http/httptest" "testing" + "k8s.io/kubernetes/pkg/api" openapigen "k8s.io/kubernetes/pkg/generated/openapi" genericapiserver "k8s.io/kubernetes/pkg/genericapiserver/server" @@ -43,7 +44,7 @@ func TestValidOpenAPISpec(t *testing.T) { defer etcdserver.Terminate(t) config.GenericConfig.EnableIndex = true - config.GenericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapigen.GetOpenAPIDefinitions) + config.GenericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapigen.GetOpenAPIDefinitions, api.Scheme) config.GenericConfig.OpenAPIConfig.Info = &spec.Info{ InfoProps: spec.InfoProps{ Title: "Kubernetes", diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index af04f2ac13..f4289c6997 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -62,13 +62,13 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. server, storageConfig := etcdtesting.NewUnsecuredEtcd3TestClientServer(t, api.Scheme) config := &Config{ - GenericConfig: genericapiserver.NewConfig(), + GenericConfig: genericapiserver.NewConfig().WithSerializer(api.Codecs), APIResourceConfigSource: DefaultAPIResourceConfigSource(), APIServerServicePort: 443, MasterCount: 1, } - resourceEncoding := genericapiserver.NewDefaultResourceEncodingConfig() + resourceEncoding := genericapiserver.NewDefaultResourceEncodingConfig(api.Registry) resourceEncoding.SetVersionEncoding(api.GroupName, api.Registry.GroupOrDie(api.GroupName).GroupVersion, schema.GroupVersion{Group: api.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(autoscaling.GroupName, *testapi.Autoscaling.GroupVersion(), schema.GroupVersion{Group: autoscaling.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(batch.GroupName, *testapi.Batch.GroupVersion(), schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal}) diff --git a/pkg/registry/apps/rest/storage_apps.go b/pkg/registry/apps/rest/storage_apps.go index 7ff6a0ac50..aef03c7698 100644 --- a/pkg/registry/apps/rest/storage_apps.go +++ b/pkg/registry/apps/rest/storage_apps.go @@ -17,6 +17,7 @@ limitations under the License. package rest import ( + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" appsapiv1beta1 "k8s.io/kubernetes/pkg/apis/apps/v1beta1" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -28,7 +29,7 @@ import ( type RESTStorageProvider struct{} func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apps.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apps.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(appsapiv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[appsapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/authentication/rest/storage_authentication.go b/pkg/registry/authentication/rest/storage_authentication.go index 4f910622c8..6ebbd4caad 100644 --- a/pkg/registry/authentication/rest/storage_authentication.go +++ b/pkg/registry/authentication/rest/storage_authentication.go @@ -18,6 +18,7 @@ package rest import ( "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/authentication" authenticationv1beta1 "k8s.io/kubernetes/pkg/apis/authentication/v1beta1" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -36,7 +37,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise // return genericapiserver.APIGroupInfo{}, false // } - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(authentication.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(authentication.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(authenticationv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[authenticationv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/authorization/rest/storage_authorization.go b/pkg/registry/authorization/rest/storage_authorization.go index 9310d69d81..6a51ee3d98 100644 --- a/pkg/registry/authorization/rest/storage_authorization.go +++ b/pkg/registry/authorization/rest/storage_authorization.go @@ -18,6 +18,7 @@ package rest import ( "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/authorization" authorizationv1beta1 "k8s.io/kubernetes/pkg/apis/authorization/v1beta1" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -37,7 +38,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return genericapiserver.APIGroupInfo{}, false } - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(authorization.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(authorization.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(authorizationv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[authorizationv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/autoscaling/rest/storage_autoscaling.go b/pkg/registry/autoscaling/rest/storage_autoscaling.go index 58d9b414a5..081d4c33d0 100644 --- a/pkg/registry/autoscaling/rest/storage_autoscaling.go +++ b/pkg/registry/autoscaling/rest/storage_autoscaling.go @@ -17,6 +17,7 @@ limitations under the License. package rest import ( + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/autoscaling" autoscalingapiv1 "k8s.io/kubernetes/pkg/apis/autoscaling/v1" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -28,7 +29,7 @@ import ( type RESTStorageProvider struct{} func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(autoscaling.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(autoscaling.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(autoscalingapiv1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[autoscalingapiv1.SchemeGroupVersion.Version] = p.v1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/batch/rest/storage_batch.go b/pkg/registry/batch/rest/storage_batch.go index 4760af9b79..aeb7c66129 100644 --- a/pkg/registry/batch/rest/storage_batch.go +++ b/pkg/registry/batch/rest/storage_batch.go @@ -18,6 +18,7 @@ package rest import ( "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/batch" batchapiv1 "k8s.io/kubernetes/pkg/apis/batch/v1" batchapiv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1" @@ -31,7 +32,7 @@ import ( type RESTStorageProvider struct{} func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(batch.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(batch.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv2alpha1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[batchapiv2alpha1.SchemeGroupVersion.Version] = p.v2alpha1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/certificates/rest/storage_certificates.go b/pkg/registry/certificates/rest/storage_certificates.go index 8666f194ed..465c49a775 100644 --- a/pkg/registry/certificates/rest/storage_certificates.go +++ b/pkg/registry/certificates/rest/storage_certificates.go @@ -17,6 +17,7 @@ limitations under the License. package rest import ( + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/certificates" certificatesapiv1beta1 "k8s.io/kubernetes/pkg/apis/certificates/v1beta1" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -28,7 +29,7 @@ import ( type RESTStorageProvider struct{} func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(certificates.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(certificates.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(certificatesapiv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[certificatesapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/extensions/rest/storage_extensions.go b/pkg/registry/extensions/rest/storage_extensions.go index 21c92517f6..731638d0c0 100644 --- a/pkg/registry/extensions/rest/storage_extensions.go +++ b/pkg/registry/extensions/rest/storage_extensions.go @@ -24,6 +24,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion" @@ -46,7 +47,7 @@ type RESTStorageProvider struct { } func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(extensions.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(extensions.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(extensionsapiv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[extensionsapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/policy/rest/storage_policy.go b/pkg/registry/policy/rest/storage_policy.go index 2a43406548..d100fa1ead 100644 --- a/pkg/registry/policy/rest/storage_policy.go +++ b/pkg/registry/policy/rest/storage_policy.go @@ -17,6 +17,7 @@ limitations under the License. package rest import ( + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/policy" policyapiv1beta1 "k8s.io/kubernetes/pkg/apis/policy/v1beta1" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -28,7 +29,7 @@ import ( type RESTStorageProvider struct{} func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(policy.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(policy.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(policyapiv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[policyapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/rbac/rest/storage_rbac.go b/pkg/registry/rbac/rest/storage_rbac.go index d3df157193..9a41d3effb 100644 --- a/pkg/registry/rbac/rest/storage_rbac.go +++ b/pkg/registry/rbac/rest/storage_rbac.go @@ -28,6 +28,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" rbacapiv1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" rbacapiv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1" @@ -58,7 +59,7 @@ type RESTStorageProvider struct { var _ genericapiserver.PostStartHookProvider = RESTStorageProvider{} func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(rbac.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(rbac.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(rbacapiv1alpha1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[rbacapiv1alpha1.SchemeGroupVersion.Version] = p.storage(rbacapiv1alpha1.SchemeGroupVersion, apiResourceConfigSource, restOptionsGetter) diff --git a/pkg/registry/storage/rest/storage_storage.go b/pkg/registry/storage/rest/storage_storage.go index 1dbd12e3df..311701bed9 100644 --- a/pkg/registry/storage/rest/storage_storage.go +++ b/pkg/registry/storage/rest/storage_storage.go @@ -17,6 +17,7 @@ limitations under the License. package rest import ( + "k8s.io/kubernetes/pkg/api" storageapi "k8s.io/kubernetes/pkg/apis/storage" storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -29,7 +30,7 @@ type RESTStorageProvider struct { } func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(storageapi.GroupName) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(storageapi.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(storageapiv1beta1.SchemeGroupVersion) { apiGroupInfo.VersionedResourcesStorageMap[storageapiv1beta1.SchemeGroupVersion.Version] = p.v1beta1Storage(apiResourceConfigSource, restOptionsGetter) diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index efbb91f994..e14e1af7e5 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -183,7 +183,7 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv masterConfig = NewMasterConfig() masterConfig.GenericConfig.EnableProfiling = true masterConfig.GenericConfig.EnableMetrics = true - masterConfig.GenericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapi.GetOpenAPIDefinitions) + masterConfig.GenericConfig.OpenAPIConfig = genericapiserver.DefaultOpenAPIConfig(openapi.GetOpenAPIDefinitions, api.Scheme) masterConfig.GenericConfig.OpenAPIConfig.Info = &spec.Info{ InfoProps: spec.InfoProps{ Title: "Kubernetes", @@ -317,7 +317,7 @@ func NewMasterConfig() *master.Config { info, _ := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), runtime.ContentTypeJSON) ns := NewSingleContentTypeSerializer(api.Scheme, info) - storageFactory := genericapiserver.NewDefaultStorageFactory(config, runtime.ContentTypeJSON, ns, genericapiserver.NewDefaultResourceEncodingConfig(), master.DefaultAPIResourceConfigSource()) + storageFactory := genericapiserver.NewDefaultStorageFactory(config, runtime.ContentTypeJSON, ns, genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), master.DefaultAPIResourceConfigSource()) storageFactory.SetSerializer( schema.GroupResource{Group: v1.GroupName, Resource: genericapiserver.AllResources}, "", @@ -355,7 +355,7 @@ func NewMasterConfig() *master.Config { "", ns) - genericConfig := genericapiserver.NewConfig() + genericConfig := genericapiserver.NewConfig().WithSerializer(api.Codecs) kubeVersion := version.Get() genericConfig.Version = &kubeVersion genericConfig.Authorizer = authorizerfactory.NewAlwaysAllowAuthorizer()