From f6882e846574998f9dffaa6902d55be060471619 Mon Sep 17 00:00:00 2001 From: deads2k Date: Mon, 19 Sep 2016 14:52:41 -0400 Subject: [PATCH] remove storage related fields from genericapiserver --- cmd/kube-apiserver/app/server.go | 6 ++- examples/apiserver/apiserver.go | 3 +- .../cmd/federation-apiserver/app/core.go | 10 ++--- .../federation-apiserver/app/extensions.go | 7 ++-- .../federation-apiserver/app/federation.go | 5 +-- .../cmd/federation-apiserver/app/server.go | 34 +++++++++++----- pkg/genericapiserver/config.go | 12 ------ pkg/genericapiserver/genericapiserver.go | 11 ----- pkg/master/master.go | 40 +++++++++++++++---- test/integration/framework/master_utils.go | 6 +-- 10 files changed, 76 insertions(+), 58 deletions(-) diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 665b7c5ec2da..fa759d2fdb5c 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -295,7 +295,6 @@ func Run(s *options.APIServer) error { genericConfig := genericapiserver.NewConfig(s.ServerRunOptions) // TODO: Move the following to generic api server as well. - genericConfig.StorageFactory = storageFactory genericConfig.Authenticator = apiAuthenticator genericConfig.SupportsBasicAuth = len(s.BasicAuthFile) > 0 genericConfig.Authorizer = apiAuthorizer @@ -311,7 +310,10 @@ func Run(s *options.APIServer) error { genericConfig.EnableOpenAPISupport = true config := &master.Config{ - Config: genericConfig, + Config: genericConfig, + + StorageFactory: storageFactory, + EnableWatchCache: s.EnableWatchCache, EnableCoreControllers: true, DeleteCollectionWorkers: s.DeleteCollectionWorkers, EventTTL: s.EventTTL, diff --git a/examples/apiserver/apiserver.go b/examples/apiserver/apiserver.go index 04b894792ed1..0afa99f12a72 100644 --- a/examples/apiserver/apiserver.go +++ b/examples/apiserver/apiserver.go @@ -30,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/genericapiserver/authorizer" genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options" genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation" + "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/storage/storagebackend" // Install the testgroup API @@ -87,7 +88,7 @@ func Run(serverOptions *genericoptions.ServerRunOptions) error { } restStorageMap := map[string]rest.Storage{ - "testtypes": testgroupetcd.NewREST(storageConfig, s.StorageDecorator()), + "testtypes": testgroupetcd.NewREST(storageConfig, generic.UndecoratedStorage), } apiGroupInfo := genericapiserver.APIGroupInfo{ GroupMeta: *groupMeta, diff --git a/federation/cmd/federation-apiserver/app/core.go b/federation/cmd/federation-apiserver/app/core.go index d09b8da7428f..793359fc0ce9 100644 --- a/federation/cmd/federation-apiserver/app/core.go +++ b/federation/cmd/federation-apiserver/app/core.go @@ -40,11 +40,11 @@ import ( serviceetcd "k8s.io/kubernetes/pkg/registry/core/service/etcd" ) -func installCoreAPIs(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) { - serviceStore, serviceStatusStore := serviceetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("service"))) - namespaceStore, namespaceStatusStore, namespaceFinalizeStore := namespaceetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("namespaces"))) - secretStore := secretetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("secrets"))) - eventStore := eventetcd.NewREST(createRESTOptionsOrDie(s, g, f, api.Resource("events")), uint64(s.EventTTL.Seconds())) +func installCoreAPIs(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, restOptionsFactory restOptionsFactory) { + serviceStore, serviceStatusStore := serviceetcd.NewREST(restOptionsFactory.NewFor(api.Resource("service"))) + namespaceStore, namespaceStatusStore, namespaceFinalizeStore := namespaceetcd.NewREST(restOptionsFactory.NewFor(api.Resource("namespaces"))) + secretStore := secretetcd.NewREST(restOptionsFactory.NewFor(api.Resource("secrets"))) + eventStore := eventetcd.NewREST(restOptionsFactory.NewFor(api.Resource("events")), uint64(s.EventTTL.Seconds())) coreResources := map[string]rest.Storage{ "secrets": secretStore, "services": serviceStore, diff --git a/federation/cmd/federation-apiserver/app/extensions.go b/federation/cmd/federation-apiserver/app/extensions.go index dbbc0ebba7b5..bd2bcd04dd95 100644 --- a/federation/cmd/federation-apiserver/app/extensions.go +++ b/federation/cmd/federation-apiserver/app/extensions.go @@ -18,7 +18,6 @@ package app import ( "github.com/golang/glog" - "k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/apimachinery/registered" @@ -29,9 +28,9 @@ import ( replicasetetcd "k8s.io/kubernetes/pkg/registry/extensions/replicaset/etcd" ) -func installExtensionsAPIs(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) { - replicaSetStorage := replicasetetcd.NewStorage(createRESTOptionsOrDie(s, g, f, extensions.Resource("replicasets"))) - ingressStorage, ingressStatusStorage := ingressetcd.NewREST(createRESTOptionsOrDie(s, g, f, extensions.Resource("ingresses"))) +func installExtensionsAPIs(g *genericapiserver.GenericAPIServer, restOptionsFactory restOptionsFactory) { + replicaSetStorage := replicasetetcd.NewStorage(restOptionsFactory.NewFor(extensions.Resource("replicasets"))) + ingressStorage, ingressStatusStorage := ingressetcd.NewREST(restOptionsFactory.NewFor(extensions.Resource("ingresses"))) extensionsResources := map[string]rest.Storage{ "replicasets": replicaSetStorage.ReplicaSet, "replicasets/status": replicaSetStorage.Status, diff --git a/federation/cmd/federation-apiserver/app/federation.go b/federation/cmd/federation-apiserver/app/federation.go index 44079cc852a2..c113f60cbd2b 100644 --- a/federation/cmd/federation-apiserver/app/federation.go +++ b/federation/cmd/federation-apiserver/app/federation.go @@ -20,7 +20,6 @@ import ( "github.com/golang/glog" "k8s.io/kubernetes/federation/apis/federation" - "k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/apimachinery/registered" @@ -30,8 +29,8 @@ import ( clusteretcd "k8s.io/kubernetes/federation/registry/cluster/etcd" ) -func installFederationAPIs(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory) { - clusterStorage, clusterStatusStorage := clusteretcd.NewREST(createRESTOptionsOrDie(s, g, f, federation.Resource("clusters"))) +func installFederationAPIs(g *genericapiserver.GenericAPIServer, restOptionsFactory restOptionsFactory) { + clusterStorage, clusterStatusStorage := clusteretcd.NewREST(restOptionsFactory.NewFor(federation.Resource("clusters"))) federationResources := map[string]rest.Storage{ "clusters": clusterStorage, "clusters/status": clusterStatusStorage, diff --git a/federation/cmd/federation-apiserver/app/server.go b/federation/cmd/federation-apiserver/app/server.go index 9d7dc7e1e275..4b945a57dc7e 100644 --- a/federation/cmd/federation-apiserver/app/server.go +++ b/federation/cmd/federation-apiserver/app/server.go @@ -44,6 +44,7 @@ import ( genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation" "k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/generic" + "k8s.io/kubernetes/pkg/registry/generic/registry" "k8s.io/kubernetes/pkg/registry/rbac/clusterrole" clusterroleetcd "k8s.io/kubernetes/pkg/registry/rbac/clusterrole/etcd" "k8s.io/kubernetes/pkg/registry/rbac/clusterrolebinding" @@ -201,7 +202,6 @@ func Run(s *options.ServerRunOptions) error { } genericConfig := genericapiserver.NewConfig(s.ServerRunOptions) // TODO: Move the following to generic api server as well. - genericConfig.StorageFactory = storageFactory genericConfig.Authenticator = apiAuthenticator genericConfig.SupportsBasicAuth = len(s.BasicAuthFile) > 0 genericConfig.Authorizer = apiAuthorizer @@ -227,24 +227,40 @@ func Run(s *options.ServerRunOptions) error { routes.UIRedirect{}.Install(m.Mux, m.HandlerContainer) routes.Logs{}.Install(m.Mux, m.HandlerContainer) - installFederationAPIs(s, m, storageFactory) - installCoreAPIs(s, m, storageFactory) - installExtensionsAPIs(s, m, storageFactory) + restOptionsFactory := restOptionsFactory{ + storageFactory: storageFactory, + deleteCollectionWorkers: s.DeleteCollectionWorkers, + } + if s.EnableWatchCache { + restOptionsFactory.storageDecorator = registry.StorageWithCacher + } else { + restOptionsFactory.storageDecorator = generic.UndecoratedStorage + } + + installFederationAPIs(m, restOptionsFactory) + installCoreAPIs(s, m, restOptionsFactory) + installExtensionsAPIs(m, restOptionsFactory) sharedInformers.Start(wait.NeverStop) m.Run(s.ServerRunOptions) return nil } -func createRESTOptionsOrDie(s *options.ServerRunOptions, g *genericapiserver.GenericAPIServer, f genericapiserver.StorageFactory, resource unversioned.GroupResource) generic.RESTOptions { - config, err := f.NewConfig(resource) +type restOptionsFactory struct { + storageFactory genericapiserver.StorageFactory + storageDecorator generic.StorageDecorator + deleteCollectionWorkers int +} + +func (f restOptionsFactory) NewFor(resource unversioned.GroupResource) generic.RESTOptions { + config, err := f.storageFactory.NewConfig(resource) if err != nil { glog.Fatalf("Unable to find storage config for %v, due to %v", resource, err.Error()) } return generic.RESTOptions{ StorageConfig: config, - Decorator: g.StorageDecorator(), - DeleteCollectionWorkers: s.DeleteCollectionWorkers, - ResourcePrefix: f.ResourcePrefix(resource), + Decorator: f.storageDecorator, + DeleteCollectionWorkers: f.deleteCollectionWorkers, + ResourcePrefix: f.storageFactory.ResourcePrefix(resource), } } diff --git a/pkg/genericapiserver/config.go b/pkg/genericapiserver/config.go index 3cf2a4c523f8..31bff35c5142 100644 --- a/pkg/genericapiserver/config.go +++ b/pkg/genericapiserver/config.go @@ -46,8 +46,6 @@ import ( "k8s.io/kubernetes/pkg/genericapiserver/routes" genericvalidation "k8s.io/kubernetes/pkg/genericapiserver/validation" ipallocator "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" - "k8s.io/kubernetes/pkg/registry/generic" - "k8s.io/kubernetes/pkg/registry/generic/registry" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util" utilnet "k8s.io/kubernetes/pkg/util/net" @@ -55,8 +53,6 @@ import ( // Config is a structure used to configure a GenericAPIServer. type Config struct { - // The storage factory for other objects - StorageFactory StorageFactory AuditLogPath string AuditLogMaxAge int AuditLogMaxBackups int @@ -73,7 +69,6 @@ type Config struct { EnableIndex bool EnableProfiling bool EnableVersion bool - EnableWatchCache bool EnableGarbageCollection bool APIPrefix string APIGroupPrefix string @@ -179,7 +174,6 @@ func NewConfig(options *options.ServerRunOptions) *Config { EnableSwaggerSupport: true, EnableSwaggerUI: options.EnableSwaggerUI, EnableVersion: true, - EnableWatchCache: options.EnableWatchCache, ExternalHost: options.ExternalHost, KubernetesServiceNodePort: options.KubernetesServiceNodePort, MasterCount: options.MasterCount, @@ -315,12 +309,6 @@ func (c Config) New() (*GenericAPIServer, error) { openAPIDefinitions: c.OpenAPIDefinitions, } - if c.EnableWatchCache { - s.storageDecorator = registry.StorageWithCacher - } else { - s.storageDecorator = generic.UndecoratedStorage - } - if c.RestfulContainer != nil { s.HandlerContainer = c.RestfulContainer } else { diff --git a/pkg/genericapiserver/genericapiserver.go b/pkg/genericapiserver/genericapiserver.go index 5ec7a55ec219..d00bcf026e2a 100644 --- a/pkg/genericapiserver/genericapiserver.go +++ b/pkg/genericapiserver/genericapiserver.go @@ -45,7 +45,6 @@ import ( "k8s.io/kubernetes/pkg/apiserver" "k8s.io/kubernetes/pkg/genericapiserver/openapi" "k8s.io/kubernetes/pkg/genericapiserver/options" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" certutil "k8s.io/kubernetes/pkg/util/cert" utilnet "k8s.io/kubernetes/pkg/util/net" @@ -120,11 +119,6 @@ type GenericAPIServer struct { // requestContextMapper provides a way to get the context for a request. It may be nil. requestContextMapper api.RequestContextMapper - // storageDecorator provides a decoration function for storage. It will never be nil. - // TODO: this may be an abstraction at the wrong layer. It doesn't seem like a genericAPIServer - // should be determining the backing storage for the RESTStorage interfaces - storageDecorator generic.StorageDecorator - Mux *apiserver.PathRecorderMux HandlerContainer *restful.Container MasterCount int @@ -175,10 +169,6 @@ type GenericAPIServer struct { openAPIDefinitions *common.OpenAPIDefinitions } -func (s *GenericAPIServer) StorageDecorator() generic.StorageDecorator { - return s.storageDecorator -} - // RequestContextMapper is exposed so that third party resource storage can be build in a different location. // TODO refactor third party resource storage func (s *GenericAPIServer) RequestContextMapper() api.RequestContextMapper { @@ -551,7 +541,6 @@ func (s *GenericAPIServer) getSwaggerConfig() *swagger.Config { // register their own web services into the Kubernetes mux prior to initialization // of swagger, so that other resource types show up in the documentation. func (s *GenericAPIServer) InstallSwaggerAPI() { - // Enable swagger UI and discovery API swagger.RegisterSwaggerService(*s.getSwaggerConfig(), s.HandlerContainer) } diff --git a/pkg/master/master.go b/pkg/master/master.go index f6316ee68fcd..16676992bfa1 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -83,6 +83,7 @@ import ( "k8s.io/kubernetes/pkg/registry/extensions/thirdpartyresourcedata" thirdpartyresourcedataetcd "k8s.io/kubernetes/pkg/registry/extensions/thirdpartyresourcedata/etcd" "k8s.io/kubernetes/pkg/registry/generic" + "k8s.io/kubernetes/pkg/registry/generic/registry" rbacstorage "k8s.io/kubernetes/pkg/registry/rbac/storage" "k8s.io/kubernetes/pkg/routes" "k8s.io/kubernetes/pkg/runtime" @@ -103,6 +104,8 @@ const ( type Config struct { *genericapiserver.Config + StorageFactory genericapiserver.StorageFactory + EnableWatchCache bool EnableCoreControllers bool EndpointReconcilerConfig EndpointReconcilerConfig DeleteCollectionWorkers int @@ -155,6 +158,8 @@ type Master struct { // Used to start and monitor tunneling tunneler genericapiserver.Tunneler + + restOptionsFactory restOptionsFactory } // thirdPartyEntry combines objects storage and API group into one struct @@ -201,6 +206,18 @@ func New(c *Config) (*Master, error) { tunneler: c.Tunneler, disableThirdPartyControllerForTesting: c.disableThirdPartyControllerForTesting, + + restOptionsFactory: restOptionsFactory{ + deleteCollectionWorkers: c.DeleteCollectionWorkers, + enableGarbageCollection: c.EnableGarbageCollection, + storageFactory: c.StorageFactory, + }, + } + + if c.EnableWatchCache { + m.restOptionsFactory.storageDecorator = registry.StorageWithCacher + } else { + m.restOptionsFactory.storageDecorator = generic.UndecoratedStorage } // Add some hardcoded storage for now. Append to the map. @@ -287,7 +304,7 @@ func (m *Master) InstallAPIs(c *Config) { } restOptionsGetter := func(resource unversioned.GroupResource) generic.RESTOptions { - return m.GetRESTOptionsOrDie(c, resource) + return m.restOptionsFactory.NewFor(resource) } // stabilize order. @@ -338,7 +355,7 @@ func (m *Master) InstallAPIs(c *Config) { func (m *Master) initV1ResourcesStorage(c *Config) { restOptions := func(resource string) generic.RESTOptions { - return m.GetRESTOptionsOrDie(c, api.Resource(resource)) + return m.restOptionsFactory.NewFor(api.Resource(resource)) } podTemplateStorage := podtemplateetcd.NewREST(restOptions("podTemplates")) @@ -778,18 +795,25 @@ func (m *Master) thirdpartyapi(group, kind, version, pluralResource string) *api } } -func (m *Master) GetRESTOptionsOrDie(c *Config, resource unversioned.GroupResource) generic.RESTOptions { - storageConfig, err := c.StorageFactory.NewConfig(resource) +type restOptionsFactory struct { + deleteCollectionWorkers int + enableGarbageCollection bool + storageFactory genericapiserver.StorageFactory + storageDecorator generic.StorageDecorator +} + +func (f restOptionsFactory) NewFor(resource unversioned.GroupResource) generic.RESTOptions { + storageConfig, err := f.storageFactory.NewConfig(resource) if err != nil { glog.Fatalf("Unable to find storage destination for %v, due to %v", resource, err.Error()) } return generic.RESTOptions{ StorageConfig: storageConfig, - Decorator: m.StorageDecorator(), - DeleteCollectionWorkers: m.deleteCollectionWorkers, - EnableGarbageCollection: c.Config.EnableGarbageCollection, - ResourcePrefix: c.StorageFactory.ResourcePrefix(resource), + Decorator: f.storageDecorator, + DeleteCollectionWorkers: f.deleteCollectionWorkers, + EnableGarbageCollection: f.enableGarbageCollection, + ResourcePrefix: f.storageFactory.ResourcePrefix(resource), } } diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index c6f1e5285ebe..667f1c7eb201 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -224,14 +224,12 @@ func NewMasterConfig() *master.Config { return &master.Config{ Config: &genericapiserver.Config{ - StorageFactory: storageFactory, APIResourceConfigSource: master.DefaultAPIResourceConfigSource(), APIPrefix: "/api", APIGroupPrefix: "/apis", Authorizer: authorizer.NewAlwaysAllowAuthorizer(), AdmissionControl: admit.NewAlwaysAdmit(), Serializer: api.Codecs, - EnableWatchCache: true, // Set those values to avoid annoying warnings in logs. ServiceClusterIPRange: parseCIDROrDie("10.0.0.0/24"), ServiceNodePortRange: utilnet.PortRange{Base: 30000, Size: 2768}, @@ -239,7 +237,9 @@ func NewMasterConfig() *master.Config { OpenAPIDefinitions: openapi.OpenAPIDefinitions, EnableOpenAPISupport: true, }, - KubeletClient: kubeletclient.FakeKubeletClient{}, + StorageFactory: storageFactory, + EnableWatchCache: true, + KubeletClient: kubeletclient.FakeKubeletClient{}, } }