Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove storage related fields from genericapiserver #33038

Merged
merged 1 commit into from Sep 23, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 4 additions & 2 deletions cmd/kube-apiserver/app/server.go
Expand Up @@ -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
Expand All @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion examples/apiserver/apiserver.go
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
10 changes: 5 additions & 5 deletions federation/cmd/federation-apiserver/app/core.go
Expand Up @@ -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,
Expand Down
7 changes: 3 additions & 4 deletions federation/cmd/federation-apiserver/app/extensions.go
Expand Up @@ -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"
Expand All @@ -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,
Expand Down
5 changes: 2 additions & 3 deletions federation/cmd/federation-apiserver/app/federation.go
Expand Up @@ -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"
Expand All @@ -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,
Expand Down
34 changes: 25 additions & 9 deletions federation/cmd/federation-apiserver/app/server.go
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand All @@ -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
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is gone intentionally?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is gone intentionally?

Yeah, it's always zero.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's always zero.

Hmmm... might be mistaken about that. I can wire that bit back up.


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),
}
}
12 changes: 0 additions & 12 deletions pkg/genericapiserver/config.go
Expand Up @@ -46,17 +46,13 @@ 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"
)

// 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
Expand All @@ -73,7 +69,6 @@ type Config struct {
EnableIndex bool
EnableProfiling bool
EnableVersion bool
EnableWatchCache bool
EnableGarbageCollection bool
APIPrefix string
APIGroupPrefix string
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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 {
Expand Down
11 changes: 0 additions & 11 deletions pkg/genericapiserver/genericapiserver.go
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
}
Expand Down
40 changes: 32 additions & 8 deletions pkg/master/master.go
Expand Up @@ -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"
Expand All @@ -103,6 +104,8 @@ const (
type Config struct {
*genericapiserver.Config

StorageFactory genericapiserver.StorageFactory
EnableWatchCache bool
EnableCoreControllers bool
EndpointReconcilerConfig EndpointReconcilerConfig
DeleteCollectionWorkers int
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything else looks generic. Is it this line which breaks the generality?

} else {
m.restOptionsFactory.storageDecorator = generic.UndecoratedStorage
}

// Add some hardcoded storage for now. Append to the map.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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"))
Expand Down Expand Up @@ -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),
}
}

Expand Down
6 changes: 3 additions & 3 deletions test/integration/framework/master_utils.go
Expand Up @@ -224,22 +224,22 @@ 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},
EnableVersion: true,
OpenAPIDefinitions: openapi.OpenAPIDefinitions,
EnableOpenAPISupport: true,
},
KubeletClient: kubeletclient.FakeKubeletClient{},
StorageFactory: storageFactory,
EnableWatchCache: true,
KubeletClient: kubeletclient.FakeKubeletClient{},
}
}

Expand Down