diff --git a/cmd/kube-apiserver/app/BUILD b/cmd/kube-apiserver/app/BUILD index 119d838482d..d8c7a47cf09 100644 --- a/cmd/kube-apiserver/app/BUILD +++ b/cmd/kube-apiserver/app/BUILD @@ -64,6 +64,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/admission", "//vendor:k8s.io/apiserver/pkg/server", "//vendor:k8s.io/apiserver/pkg/server/filters", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/cmd/kube-apiserver/app/options/BUILD b/cmd/kube-apiserver/app/options/BUILD index 24230507c5a..55681fb6c60 100644 --- a/cmd/kube-apiserver/app/options/BUILD +++ b/cmd/kube-apiserver/app/options/BUILD @@ -25,6 +25,7 @@ go_library( "//vendor:github.com/spf13/pflag", "//vendor:k8s.io/apimachinery/pkg/util/net", "//vendor:k8s.io/apiserver/pkg/server/options", + "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", ], ) diff --git a/cmd/kube-apiserver/app/options/options.go b/cmd/kube-apiserver/app/options/options.go index a6b90a3592d..464d8fccbcf 100644 --- a/cmd/kube-apiserver/app/options/options.go +++ b/cmd/kube-apiserver/app/options/options.go @@ -23,6 +23,7 @@ import ( utilnet "k8s.io/apimachinery/pkg/util/net" genericoptions "k8s.io/apiserver/pkg/server/options" + "k8s.io/apiserver/pkg/storage/storagebackend" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/validation" kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options" @@ -68,7 +69,7 @@ type ServerRunOptions struct { func NewServerRunOptions() *ServerRunOptions { s := ServerRunOptions{ GenericServerRunOptions: genericoptions.NewServerRunOptions(), - Etcd: genericoptions.NewEtcdOptions(kubeoptions.DefaultEtcdPathPrefix, api.Scheme, nil), + Etcd: genericoptions.NewEtcdOptions(storagebackend.NewDefaultConfig(kubeoptions.DefaultEtcdPathPrefix, api.Scheme, nil)), SecureServing: genericoptions.NewSecureServingOptions(), InsecureServing: genericoptions.NewInsecureServingOptions(), Audit: genericoptions.NewAuditLogOptions(), diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 6c0136ab8b3..6d74badd1c3 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -44,6 +44,7 @@ import ( "k8s.io/apiserver/pkg/admission" genericapiserver "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server/filters" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/cmd/kube-apiserver/app/options" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/batch" @@ -203,9 +204,9 @@ func Run(s *options.ServerRunOptions) error { if err != nil { return fmt.Errorf("error generating storage version map: %s", err) } - storageFactory, err := kubeapiserver.BuildDefaultStorageFactory( + storageFactory, err := kubeapiserver.NewStorageFactory( s.Etcd.StorageConfig, s.Etcd.DefaultStorageMediaType, api.Codecs, - genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion, + serverstorage.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion, // FIXME: this GroupVersionResource override should be configurable []schema.GroupVersionResource{batch.Resource("cronjobs").WithVersion("v2alpha1")}, master.DefaultAPIResourceConfigSource(), s.APIEnablement.RuntimeConfig) @@ -308,11 +309,9 @@ func Run(s *options.ServerRunOptions) error { sets.NewString("watch", "proxy"), sets.NewString("attach", "exec", "proxy", "log", "portforward"), ) - genericConfig.RESTOptionsGetter = &kubeapiserver.RESTOptionsFactory{ - StorageFactory: storageFactory, - EnableWatchCache: s.Etcd.EnableWatchCache, - EnableGarbageCollection: s.Etcd.EnableGarbageCollection, - DeleteCollectionWorkers: s.Etcd.DeleteCollectionWorkers, + + if err := s.Etcd.ApplyWithStorageFactoryTo(storageFactory, genericConfig); err != nil { + return err } config := &master.Config{ diff --git a/examples/apiserver/BUILD b/examples/apiserver/BUILD index cab1c03161e..dbd8880d3aa 100644 --- a/examples/apiserver/BUILD +++ b/examples/apiserver/BUILD @@ -25,6 +25,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", "//vendor:k8s.io/apiserver/pkg/server/options", + "//vendor:k8s.io/apiserver/pkg/server/storage", "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", ], ) diff --git a/examples/apiserver/apiserver.go b/examples/apiserver/apiserver.go index 28eb576ad57..8158594b147 100644 --- a/examples/apiserver/apiserver.go +++ b/examples/apiserver/apiserver.go @@ -19,6 +19,8 @@ package apiserver import ( "fmt" + "github.com/golang/glog" + "k8s.io/apimachinery/pkg/runtime/schema" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apiserver/pkg/authorization/authorizerfactory" @@ -26,6 +28,7 @@ import ( "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" genericoptions "k8s.io/apiserver/pkg/server/options" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/storagebackend" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup/v1" testgroupetcd "k8s.io/kubernetes/examples/apiserver/rest" @@ -34,8 +37,6 @@ import ( // Install the testgroup API _ "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup/install" - - "github.com/golang/glog" ) const ( @@ -45,17 +46,6 @@ const ( SecurePort = 6444 ) -func newStorageFactory() genericapiserver.StorageFactory { - config := storagebackend.Config{ - Prefix: kubeoptions.DefaultEtcdPathPrefix, - ServerList: []string{"http://127.0.0.1:2379"}, - Copier: api.Scheme, - } - storageFactory := genericapiserver.NewDefaultStorageFactory(config, "application/json", api.Codecs, genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), genericapiserver.NewResourceConfig()) - - return storageFactory -} - type ServerRunOptions struct { GenericServerRunOptions *genericoptions.ServerRunOptions Etcd *genericoptions.EtcdOptions @@ -68,7 +58,7 @@ type ServerRunOptions struct { func NewServerRunOptions() *ServerRunOptions { s := ServerRunOptions{ GenericServerRunOptions: genericoptions.NewServerRunOptions(), - Etcd: genericoptions.NewEtcdOptions(kubeoptions.DefaultEtcdPathPrefix, api.Scheme, nil), + Etcd: genericoptions.NewEtcdOptions(storagebackend.NewDefaultConfig(kubeoptions.DefaultEtcdPathPrefix, api.Scheme, nil)), SecureServing: genericoptions.NewSecureServingOptions(), InsecureServing: genericoptions.NewInsecureServingOptions(), Authentication: kubeoptions.NewBuiltInAuthenticationOptions().WithAll(), @@ -76,6 +66,7 @@ func NewServerRunOptions() *ServerRunOptions { } s.InsecureServing.BindPort = InsecurePort s.SecureServing.ServingOptions.BindPort = SecurePort + s.Etcd.StorageConfig.ServerList = []string{"http://127.0.0.1:2379"} return &s } @@ -122,22 +113,25 @@ func (serverOptions *ServerRunOptions) Run(stopCh <-chan struct{}) error { config.Authorizer = authorizerfactory.NewAlwaysAllowAuthorizer() config.SwaggerConfig = genericapiserver.DefaultSwaggerConfig() - s, err := config.Complete().New() - if err != nil { - return fmt.Errorf("Error in bringing up the server: %v", err) - } - groupVersion := v1.SchemeGroupVersion groupName := groupVersion.Group groupMeta, err := api.Registry.Group(groupName) if err != nil { return fmt.Errorf("%v", err) } - storageFactory := newStorageFactory() + storageFactory := serverstorage.NewDefaultStorageFactory(serverOptions.Etcd.StorageConfig, "application/json", api.Codecs, serverstorage.NewDefaultResourceEncodingConfig(api.Registry), serverstorage.NewResourceConfig()) storageConfig, err := storageFactory.NewConfig(schema.GroupResource{Group: groupName, Resource: "testtype"}) if err != nil { return fmt.Errorf("Unable to get storage config: %v", err) } + if err := serverOptions.Etcd.ApplyWithStorageFactoryTo(storageFactory, config); err != nil { + return fmt.Errorf("failed to configure authentication: %s", err) + } + + s, err := config.Complete().New() + if err != nil { + return fmt.Errorf("Error in bringing up the server: %v", err) + } testTypeOpts := generic.RESTOptions{ StorageConfig: storageConfig, diff --git a/federation/cmd/federation-apiserver/app/BUILD b/federation/cmd/federation-apiserver/app/BUILD index 976843ac18d..5f3170fe18b 100644 --- a/federation/cmd/federation-apiserver/app/BUILD +++ b/federation/cmd/federation-apiserver/app/BUILD @@ -73,6 +73,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", "//vendor:k8s.io/apiserver/pkg/server/filters", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/federation/cmd/federation-apiserver/app/options/BUILD b/federation/cmd/federation-apiserver/app/options/BUILD index 9a04bfec7c0..99f7000e568 100644 --- a/federation/cmd/federation-apiserver/app/options/BUILD +++ b/federation/cmd/federation-apiserver/app/options/BUILD @@ -20,6 +20,7 @@ go_library( "//pkg/kubeapiserver/options:go_default_library", "//vendor:github.com/spf13/pflag", "//vendor:k8s.io/apiserver/pkg/server/options", + "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", ], ) diff --git a/federation/cmd/federation-apiserver/app/options/options.go b/federation/cmd/federation-apiserver/app/options/options.go index e4d5e1db103..4762d26766b 100644 --- a/federation/cmd/federation-apiserver/app/options/options.go +++ b/federation/cmd/federation-apiserver/app/options/options.go @@ -21,6 +21,7 @@ import ( "time" genericoptions "k8s.io/apiserver/pkg/server/options" + "k8s.io/apiserver/pkg/storage/storagebackend" "k8s.io/kubernetes/pkg/api" kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options" @@ -51,7 +52,7 @@ type ServerRunOptions struct { func NewServerRunOptions() *ServerRunOptions { s := ServerRunOptions{ GenericServerRunOptions: genericoptions.NewServerRunOptions(), - Etcd: genericoptions.NewEtcdOptions(kubeoptions.DefaultEtcdPathPrefix, api.Scheme, nil), + Etcd: genericoptions.NewEtcdOptions(storagebackend.NewDefaultConfig(kubeoptions.DefaultEtcdPathPrefix, api.Scheme, nil)), SecureServing: genericoptions.NewSecureServingOptions(), InsecureServing: genericoptions.NewInsecureServingOptions(), Audit: genericoptions.NewAuditLogOptions(), diff --git a/federation/cmd/federation-apiserver/app/server.go b/federation/cmd/federation-apiserver/app/server.go index 7f3c21e7ab7..998542ac657 100644 --- a/federation/cmd/federation-apiserver/app/server.go +++ b/federation/cmd/federation-apiserver/app/server.go @@ -37,6 +37,7 @@ import ( "k8s.io/apiserver/pkg/admission" genericapiserver "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server/filters" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/federation/cmd/federation-apiserver/app/options" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" @@ -108,7 +109,7 @@ func Run(s *options.ServerRunOptions) error { } // TODO: register cluster federation resources here. - resourceConfig := genericapiserver.NewResourceConfig() + resourceConfig := serverstorage.NewResourceConfig() if s.Etcd.StorageConfig.DeserializationCacheSize == 0 { // When size of cache is not explicitly set, set it to 50000 @@ -118,9 +119,9 @@ func Run(s *options.ServerRunOptions) error { if err != nil { return fmt.Errorf("error generating storage version map: %s", err) } - storageFactory, err := kubeapiserver.BuildDefaultStorageFactory( + storageFactory, err := kubeapiserver.NewStorageFactory( s.Etcd.StorageConfig, s.Etcd.DefaultStorageMediaType, api.Codecs, - genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion, + serverstorage.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion, []schema.GroupVersionResource{}, resourceConfig, s.APIEnablement.RuntimeConfig) if err != nil { return fmt.Errorf("error in initializing storage factory: %s", err) @@ -145,6 +146,9 @@ func Run(s *options.ServerRunOptions) error { servers := strings.Split(tokens[1], ";") storageFactory.SetEtcdLocation(groupResource, servers) } + if err := s.Etcd.ApplyWithStorageFactoryTo(storageFactory, genericConfig); err != nil { + return err + } apiAuthenticator, securityDefinitions, err := s.Authentication.ToAuthenticationConfig().New() if err != nil { @@ -187,12 +191,6 @@ func Run(s *options.ServerRunOptions) error { sets.NewString("watch", "proxy"), sets.NewString("attach", "exec", "proxy", "log", "portforward"), ) - genericConfig.RESTOptionsGetter = &kubeapiserver.RESTOptionsFactory{ - StorageFactory: storageFactory, - EnableWatchCache: s.Etcd.EnableWatchCache, - EnableGarbageCollection: s.Etcd.EnableGarbageCollection, - DeleteCollectionWorkers: s.Etcd.DeleteCollectionWorkers, - } // TODO: Move this to generic api server (Need to move the command line flag). if s.Etcd.EnableWatchCache { diff --git a/pkg/kubeapiserver/BUILD b/pkg/kubeapiserver/BUILD index f47d431619e..064b1cc64be 100644 --- a/pkg/kubeapiserver/BUILD +++ b/pkg/kubeapiserver/BUILD @@ -13,16 +13,13 @@ go_library( srcs = [ "default_storage_factory_builder.go", "doc.go", - "rest.go", ], tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", "//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", - "//vendor:k8s.io/apiserver/pkg/registry/generic", - "//vendor:k8s.io/apiserver/pkg/registry/generic/registry", - "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", "//vendor:k8s.io/apiserver/pkg/util/flag", ], @@ -59,6 +56,6 @@ go_test( "//pkg/apis/extensions/install:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", - "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/kubeapiserver/default_storage_factory_builder.go b/pkg/kubeapiserver/default_storage_factory_builder.go index 64f9089d6dd..2a9fcf9ba79 100644 --- a/pkg/kubeapiserver/default_storage_factory_builder.go +++ b/pkg/kubeapiserver/default_storage_factory_builder.go @@ -23,18 +23,18 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/storagebackend" utilflag "k8s.io/apiserver/pkg/util/flag" "k8s.io/kubernetes/pkg/api" ) -// Builds the DefaultStorageFactory. +// NewStorageFactory builds the DefaultStorageFactory. // Merges defaultResourceConfig with the user specified overrides and merges // defaultAPIResourceConfig with the corresponding user specified overrides as well. -func BuildDefaultStorageFactory(storageConfig storagebackend.Config, defaultMediaType string, serializer runtime.StorageSerializer, - defaultResourceEncoding *genericapiserver.DefaultResourceEncodingConfig, storageEncodingOverrides map[string]schema.GroupVersion, resourceEncodingOverrides []schema.GroupVersionResource, - defaultAPIResourceConfig *genericapiserver.ResourceConfig, resourceConfigOverrides utilflag.ConfigurationMap) (*genericapiserver.DefaultStorageFactory, error) { +func NewStorageFactory(storageConfig storagebackend.Config, defaultMediaType string, serializer runtime.StorageSerializer, + defaultResourceEncoding *serverstorage.DefaultResourceEncodingConfig, storageEncodingOverrides map[string]schema.GroupVersion, resourceEncodingOverrides []schema.GroupVersionResource, + defaultAPIResourceConfig *serverstorage.ResourceConfig, resourceConfigOverrides utilflag.ConfigurationMap) (*serverstorage.DefaultStorageFactory, error) { resourceEncodingConfig := mergeGroupEncodingConfigs(defaultResourceEncoding, storageEncodingOverrides) resourceEncodingConfig = mergeResourceEncodingConfigs(resourceEncodingConfig, resourceEncodingOverrides) @@ -42,11 +42,11 @@ func BuildDefaultStorageFactory(storageConfig storagebackend.Config, defaultMedi if err != nil { return nil, err } - return genericapiserver.NewDefaultStorageFactory(storageConfig, defaultMediaType, serializer, resourceEncodingConfig, apiResourceConfig), nil + return serverstorage.NewDefaultStorageFactory(storageConfig, defaultMediaType, serializer, resourceEncodingConfig, apiResourceConfig), nil } // Merges the given defaultResourceConfig with specifc GroupvVersionResource overrides. -func mergeResourceEncodingConfigs(defaultResourceEncoding *genericapiserver.DefaultResourceEncodingConfig, resourceEncodingOverrides []schema.GroupVersionResource) *genericapiserver.DefaultResourceEncodingConfig { +func mergeResourceEncodingConfigs(defaultResourceEncoding *serverstorage.DefaultResourceEncodingConfig, resourceEncodingOverrides []schema.GroupVersionResource) *serverstorage.DefaultResourceEncodingConfig { resourceEncodingConfig := defaultResourceEncoding for _, gvr := range resourceEncodingOverrides { resourceEncodingConfig.SetResourceEncoding(gvr.GroupResource(), gvr.GroupVersion(), @@ -56,7 +56,7 @@ func mergeResourceEncodingConfigs(defaultResourceEncoding *genericapiserver.Defa } // Merges the given defaultResourceConfig with specifc GroupVersion overrides. -func mergeGroupEncodingConfigs(defaultResourceEncoding *genericapiserver.DefaultResourceEncodingConfig, storageEncodingOverrides map[string]schema.GroupVersion) *genericapiserver.DefaultResourceEncodingConfig { +func mergeGroupEncodingConfigs(defaultResourceEncoding *serverstorage.DefaultResourceEncodingConfig, storageEncodingOverrides map[string]schema.GroupVersion) *serverstorage.DefaultResourceEncodingConfig { resourceEncodingConfig := defaultResourceEncoding for group, storageEncodingVersion := range storageEncodingOverrides { resourceEncodingConfig.SetVersionEncoding(group, storageEncodingVersion, schema.GroupVersion{Group: group, Version: runtime.APIVersionInternal}) @@ -65,7 +65,7 @@ func mergeGroupEncodingConfigs(defaultResourceEncoding *genericapiserver.Default } // Merges the given defaultAPIResourceConfig with the given resourceConfigOverrides. -func mergeAPIResourceConfigs(defaultAPIResourceConfig *genericapiserver.ResourceConfig, resourceConfigOverrides utilflag.ConfigurationMap) (*genericapiserver.ResourceConfig, error) { +func mergeAPIResourceConfigs(defaultAPIResourceConfig *serverstorage.ResourceConfig, resourceConfigOverrides utilflag.ConfigurationMap) (*serverstorage.ResourceConfig, error) { resourceConfig := defaultAPIResourceConfig overrides := resourceConfigOverrides diff --git a/pkg/kubeapiserver/default_storage_factory_builder_test.go b/pkg/kubeapiserver/default_storage_factory_builder_test.go index 3a058f61db2..87ef852de26 100644 --- a/pkg/kubeapiserver/default_storage_factory_builder_test.go +++ b/pkg/kubeapiserver/default_storage_factory_builder_test.go @@ -21,7 +21,7 @@ import ( "testing" "k8s.io/apimachinery/pkg/runtime/schema" - genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" _ "k8s.io/kubernetes/pkg/api/install" apiv1 "k8s.io/kubernetes/pkg/api/v1" @@ -34,31 +34,31 @@ func TestParseRuntimeConfig(t *testing.T) { apiv1GroupVersion := apiv1.SchemeGroupVersion testCases := []struct { runtimeConfig map[string]string - defaultResourceConfig func() *genericapiserver.ResourceConfig - expectedAPIConfig func() *genericapiserver.ResourceConfig + defaultResourceConfig func() *serverstorage.ResourceConfig + expectedAPIConfig func() *serverstorage.ResourceConfig err bool }{ { // everything default value. runtimeConfig: map[string]string{}, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, err: false, }, { // no runtimeConfig override. runtimeConfig: map[string]string{}, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.DisableVersions(extensionsapiv1beta1.SchemeGroupVersion) return config }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.DisableVersions(extensionsapiv1beta1.SchemeGroupVersion) return config }, @@ -69,13 +69,13 @@ func TestParseRuntimeConfig(t *testing.T) { runtimeConfig: map[string]string{ "extensions/v1beta1": "", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.DisableVersions(extensionsapiv1beta1.SchemeGroupVersion) return config }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.EnableVersions(extensionsapiv1beta1.SchemeGroupVersion) return config }, @@ -86,13 +86,13 @@ func TestParseRuntimeConfig(t *testing.T) { runtimeConfig: map[string]string{ "api/v1/pods": "false", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.EnableVersions(apiv1GroupVersion) return config }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.EnableVersions(apiv1GroupVersion) config.DisableResources(apiv1GroupVersion.WithResource("pods")) return config @@ -104,11 +104,11 @@ func TestParseRuntimeConfig(t *testing.T) { runtimeConfig: map[string]string{ "api/v1": "false", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.DisableVersions(apiv1GroupVersion) return config }, @@ -120,14 +120,14 @@ func TestParseRuntimeConfig(t *testing.T) { "extensions/v1beta1/anything": "true", "extensions/v1beta1/daemonsets": "false", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.EnableVersions(extensionsGroupVersion) return config }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.EnableVersions(extensionsGroupVersion) config.DisableResources(extensionsGroupVersion.WithResource("daemonsets")) config.EnableResources(extensionsGroupVersion.WithResource("anything")) @@ -140,11 +140,11 @@ func TestParseRuntimeConfig(t *testing.T) { runtimeConfig: map[string]string{ "invalidgroup/version": "false", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, err: true, }, @@ -153,11 +153,11 @@ func TestParseRuntimeConfig(t *testing.T) { runtimeConfig: map[string]string{ "api/v1/pods": "false", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.DisableResources(schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}) return config }, @@ -168,11 +168,11 @@ func TestParseRuntimeConfig(t *testing.T) { runtimeConfig: map[string]string{ "api/all": "true", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.EnableVersions(api.Registry.RegisteredGroupVersions()...) return config }, @@ -183,11 +183,11 @@ func TestParseRuntimeConfig(t *testing.T) { runtimeConfig: map[string]string{ "api/all": "false", }, - defaultResourceConfig: func() *genericapiserver.ResourceConfig { - return genericapiserver.NewResourceConfig() + defaultResourceConfig: func() *serverstorage.ResourceConfig { + return serverstorage.NewResourceConfig() }, - expectedAPIConfig: func() *genericapiserver.ResourceConfig { - config := genericapiserver.NewResourceConfig() + expectedAPIConfig: func() *serverstorage.ResourceConfig { + config := serverstorage.NewResourceConfig() config.DisableVersions(api.Registry.RegisteredGroupVersions()...) return config }, diff --git a/pkg/kubeapiserver/rest.go b/pkg/kubeapiserver/rest.go deleted file mode 100644 index c4292390107..00000000000 --- a/pkg/kubeapiserver/rest.go +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package kubeapiserver - -import ( - "fmt" - - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apiserver/pkg/registry/generic" - genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" - genericapiserver "k8s.io/apiserver/pkg/server" -) - -// RESTOptionsFactory is a RESTOptionsGetter for kube apiservers since they do complicated stuff -type RESTOptionsFactory struct { - DeleteCollectionWorkers int - EnableGarbageCollection bool - EnableWatchCache bool - StorageFactory genericapiserver.StorageFactory -} - -func (f *RESTOptionsFactory) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { - storageConfig, err := f.StorageFactory.NewConfig(resource) - if err != nil { - return generic.RESTOptions{}, fmt.Errorf("Unable to find storage destination for %v, due to %v", resource, err.Error()) - } - - ret := generic.RESTOptions{ - StorageConfig: storageConfig, - Decorator: generic.UndecoratedStorage, - DeleteCollectionWorkers: f.DeleteCollectionWorkers, - EnableGarbageCollection: f.EnableGarbageCollection, - ResourcePrefix: f.StorageFactory.ResourcePrefix(resource), - } - if f.EnableWatchCache { - ret.Decorator = genericregistry.StorageWithCacher - } - - return ret, nil -} diff --git a/pkg/master/BUILD b/pkg/master/BUILD index 5f542f0fc6d..ecc134ffca1 100644 --- a/pkg/master/BUILD +++ b/pkg/master/BUILD @@ -83,6 +83,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/server", "//vendor:k8s.io/apiserver/pkg/server/healthz", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) @@ -114,7 +115,6 @@ go_test( "//pkg/client/clientset_generated/clientset/fake:go_default_library", "//pkg/client/clientset_generated/internalclientset/fake:go_default_library", "//pkg/generated/openapi:go_default_library", - "//pkg/kubeapiserver:go_default_library", "//pkg/kubelet/client:go_default_library", "//pkg/version:go_default_library", "//vendor:github.com/go-openapi/loads", @@ -131,6 +131,8 @@ go_test( "//vendor:k8s.io/apimachinery/pkg/version", "//vendor:k8s.io/apiserver/pkg/endpoints/request", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/options", + "//vendor:k8s.io/apiserver/pkg/server/storage", "//vendor:k8s.io/apiserver/pkg/storage/etcd/testing", "//vendor:k8s.io/client-go/rest", "//vendor:k8s.io/client-go/testing", diff --git a/pkg/master/master.go b/pkg/master/master.go index 813e330a0ea..d7a82eb10e2 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -29,6 +29,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" genericapiserver "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server/healthz" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/cmd/kube-apiserver/app/options" "k8s.io/kubernetes/pkg/api" apiv1 "k8s.io/kubernetes/pkg/api/v1" @@ -79,8 +80,8 @@ const ( type Config struct { GenericConfig *genericapiserver.Config - APIResourceConfigSource genericapiserver.APIResourceConfigSource - StorageFactory genericapiserver.StorageFactory + APIResourceConfigSource serverstorage.APIResourceConfigSource + StorageFactory serverstorage.StorageFactory EnableCoreControllers bool EndpointReconcilerConfig EndpointReconcilerConfig EventTTL time.Duration @@ -284,11 +285,11 @@ func (m *Master) installTunneler(nodeTunneler tunneler.Tunneler, nodeClient core // RESTStorageProvider is a factory type for REST storage. type RESTStorageProvider interface { GroupName() string - NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) + NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) } // InstallAPIs will install the APIs for the restStorageProviders if they are enabled. -func (m *Master) InstallAPIs(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter, restStorageProviders ...RESTStorageProvider) { +func (m *Master) InstallAPIs(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter, restStorageProviders ...RESTStorageProvider) { apiGroupsInfo := []genericapiserver.APIGroupInfo{} for _, restStorageBuilder := range restStorageProviders { @@ -349,8 +350,8 @@ func (n nodeAddressProvider) externalAddresses() ([]string, error) { return addrs, nil } -func DefaultAPIResourceConfigSource() *genericapiserver.ResourceConfig { - ret := genericapiserver.NewResourceConfig() +func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig { + ret := serverstorage.NewResourceConfig() ret.EnableVersions( apiv1.SchemeGroupVersion, extensionsapiv1beta1.SchemeGroupVersion, diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 5f290ff499c..3f640e0df40 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -34,6 +34,8 @@ import ( "k8s.io/apimachinery/pkg/version" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" genericapiserver "k8s.io/apiserver/pkg/server" + "k8s.io/apiserver/pkg/server/options" + serverstorage "k8s.io/apiserver/pkg/server/storage" etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api" @@ -51,7 +53,6 @@ import ( extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" - "k8s.io/kubernetes/pkg/kubeapiserver" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" kubeversion "k8s.io/kubernetes/pkg/version" @@ -69,7 +70,7 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. MasterCount: 1, } - resourceEncoding := genericapiserver.NewDefaultResourceEncodingConfig(api.Registry) + resourceEncoding := serverstorage.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}) @@ -77,7 +78,12 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. resourceEncoding.SetVersionEncoding(extensions.GroupName, *testapi.Extensions.GroupVersion(), schema.GroupVersion{Group: extensions.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(rbac.GroupName, *testapi.Rbac.GroupVersion(), schema.GroupVersion{Group: rbac.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(certificates.GroupName, *testapi.Certificates.GroupVersion(), schema.GroupVersion{Group: certificates.GroupName, Version: runtime.APIVersionInternal}) - storageFactory := genericapiserver.NewDefaultStorageFactory(*storageConfig, testapi.StorageMediaType(), api.Codecs, resourceEncoding, DefaultAPIResourceConfigSource()) + storageFactory := serverstorage.NewDefaultStorageFactory(*storageConfig, testapi.StorageMediaType(), api.Codecs, resourceEncoding, DefaultAPIResourceConfigSource()) + + err := options.NewEtcdOptions(storageConfig).ApplyWithStorageFactoryTo(storageFactory, config.GenericConfig) + if err != nil { + t.Fatal(err) + } kubeVersion := kubeversion.Get() config.GenericConfig.Version = &kubeVersion @@ -88,12 +94,6 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. config.GenericConfig.RequestContextMapper = genericapirequest.NewRequestContextMapper() config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.EnableMetrics = true - config.GenericConfig.RESTOptionsGetter = &kubeapiserver.RESTOptionsFactory{ - StorageFactory: storageFactory, - EnableWatchCache: true, - EnableGarbageCollection: true, - DeleteCollectionWorkers: 1, - } config.EnableCoreControllers = false config.KubeletClientConfig = kubeletclient.KubeletClientConfig{Port: 10250} config.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{ @@ -121,8 +121,8 @@ func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *ass } // limitedAPIResourceConfigSource only enables the core group, the extensions group, the batch group, and the autoscaling group. -func limitedAPIResourceConfigSource() *genericapiserver.ResourceConfig { - ret := genericapiserver.NewResourceConfig() +func limitedAPIResourceConfigSource() *serverstorage.ResourceConfig { + ret := serverstorage.NewResourceConfig() ret.EnableVersions( apiv1.SchemeGroupVersion, extensionsapiv1beta1.SchemeGroupVersion, diff --git a/pkg/master/thirdparty/BUILD b/pkg/master/thirdparty/BUILD index aa6e84604be..fbcc4ce05d2 100644 --- a/pkg/master/thirdparty/BUILD +++ b/pkg/master/thirdparty/BUILD @@ -28,6 +28,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", ], ) diff --git a/pkg/master/thirdparty/thirdparty.go b/pkg/master/thirdparty/thirdparty.go index 9b116b0ef74..d9a4f19c6c6 100644 --- a/pkg/master/thirdparty/thirdparty.go +++ b/pkg/master/thirdparty/thirdparty.go @@ -33,6 +33,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorgage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/storagebackend" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" @@ -70,7 +71,7 @@ type ThirdPartyResourceServer struct { disableThirdPartyControllerForTesting bool } -func NewThirdPartyResourceServer(genericAPIServer *genericapiserver.GenericAPIServer, storageFactory genericapiserver.StorageFactory) *ThirdPartyResourceServer { +func NewThirdPartyResourceServer(genericAPIServer *genericapiserver.GenericAPIServer, storageFactory serverstorgage.StorageFactory) *ThirdPartyResourceServer { ret := &ThirdPartyResourceServer{ genericAPIServer: genericAPIServer, thirdPartyResources: map[string]*thirdPartyEntry{}, diff --git a/pkg/registry/apps/rest/BUILD b/pkg/registry/apps/rest/BUILD index 60e855bbf04..0a9762690e2 100644 --- a/pkg/registry/apps/rest/BUILD +++ b/pkg/registry/apps/rest/BUILD @@ -19,6 +19,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/apps/rest/storage_apps.go b/pkg/registry/apps/rest/storage_apps.go index 45931c5f2c8..66dffbd94e0 100644 --- a/pkg/registry/apps/rest/storage_apps.go +++ b/pkg/registry/apps/rest/storage_apps.go @@ -20,6 +20,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" appsapiv1beta1 "k8s.io/kubernetes/pkg/apis/apps/v1beta1" @@ -28,7 +29,7 @@ import ( type RESTStorageProvider struct{} -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apps.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(appsapiv1beta1.SchemeGroupVersion) { @@ -39,7 +40,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := appsapiv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/pkg/registry/authentication/rest/BUILD b/pkg/registry/authentication/rest/BUILD index d2e866d14c1..ef6536be66f 100644 --- a/pkg/registry/authentication/rest/BUILD +++ b/pkg/registry/authentication/rest/BUILD @@ -21,6 +21,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/authentication/rest/storage_authentication.go b/pkg/registry/authentication/rest/storage_authentication.go index e2c323db023..4f8d1ce698b 100644 --- a/pkg/registry/authentication/rest/storage_authentication.go +++ b/pkg/registry/authentication/rest/storage_authentication.go @@ -21,6 +21,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/authentication" authenticationv1 "k8s.io/kubernetes/pkg/apis/authentication/v1" @@ -32,7 +33,7 @@ type RESTStorageProvider struct { Authenticator authenticator.Request } -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { // TODO figure out how to make the swagger generation stable, while allowing this endpoint to be disabled. // if p.Authenticator == nil { // return genericapiserver.APIGroupInfo{}, false @@ -52,7 +53,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := authenticationv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} @@ -66,7 +67,7 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapise return storage } -func (p RESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := authenticationv1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/pkg/registry/authorization/rest/BUILD b/pkg/registry/authorization/rest/BUILD index 17c94a3eb87..89ad641309b 100644 --- a/pkg/registry/authorization/rest/BUILD +++ b/pkg/registry/authorization/rest/BUILD @@ -23,6 +23,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/authorization/rest/storage_authorization.go b/pkg/registry/authorization/rest/storage_authorization.go index 0b694d5947a..f875e5c5573 100644 --- a/pkg/registry/authorization/rest/storage_authorization.go +++ b/pkg/registry/authorization/rest/storage_authorization.go @@ -21,6 +21,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/authorization" authorizationv1 "k8s.io/kubernetes/pkg/apis/authorization/v1" @@ -34,7 +35,7 @@ type RESTStorageProvider struct { Authorizer authorizer.Authorizer } -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { if p.Authorizer == nil { return genericapiserver.APIGroupInfo{}, false } @@ -54,7 +55,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := authorizationv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} @@ -71,7 +72,7 @@ func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapise return storage } -func (p RESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := authorizationv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/pkg/registry/autoscaling/rest/BUILD b/pkg/registry/autoscaling/rest/BUILD index 6e3bc586b5f..6e189aeaa78 100644 --- a/pkg/registry/autoscaling/rest/BUILD +++ b/pkg/registry/autoscaling/rest/BUILD @@ -20,6 +20,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/autoscaling/rest/storage_autoscaling.go b/pkg/registry/autoscaling/rest/storage_autoscaling.go index 74e5e778b94..ce52e558429 100644 --- a/pkg/registry/autoscaling/rest/storage_autoscaling.go +++ b/pkg/registry/autoscaling/rest/storage_autoscaling.go @@ -20,6 +20,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/autoscaling" autoscalingapiv1 "k8s.io/kubernetes/pkg/apis/autoscaling/v1" @@ -29,7 +30,7 @@ import ( type RESTStorageProvider struct{} -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(autoscaling.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(autoscalingapiv1.SchemeGroupVersion) { @@ -44,7 +45,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := autoscalingapiv1.SchemeGroupVersion storage := map[string]rest.Storage{} @@ -56,7 +57,7 @@ func (p RESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver. return storage } -func (p RESTStorageProvider) v2alpha1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v2alpha1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := autoscalingapiv2alpha1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/pkg/registry/batch/rest/BUILD b/pkg/registry/batch/rest/BUILD index 5c361e528e6..3cb35928e5e 100644 --- a/pkg/registry/batch/rest/BUILD +++ b/pkg/registry/batch/rest/BUILD @@ -22,6 +22,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/batch/rest/storage_batch.go b/pkg/registry/batch/rest/storage_batch.go index 97abbb8c6eb..c4d359284d4 100644 --- a/pkg/registry/batch/rest/storage_batch.go +++ b/pkg/registry/batch/rest/storage_batch.go @@ -21,6 +21,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/batch" batchapiv1 "k8s.io/kubernetes/pkg/apis/batch/v1" @@ -31,7 +32,7 @@ import ( type RESTStorageProvider struct{} -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(batch.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(batchapiv2alpha1.SchemeGroupVersion) { @@ -50,7 +51,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := batchapiv1.SchemeGroupVersion storage := map[string]rest.Storage{} @@ -62,7 +63,7 @@ func (p RESTStorageProvider) v1Storage(apiResourceConfigSource genericapiserver. return storage } -func (p RESTStorageProvider) v2alpha1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v2alpha1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := batchapiv2alpha1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/pkg/registry/certificates/rest/BUILD b/pkg/registry/certificates/rest/BUILD index 2b8817e2ead..27239281017 100644 --- a/pkg/registry/certificates/rest/BUILD +++ b/pkg/registry/certificates/rest/BUILD @@ -19,6 +19,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/certificates/rest/storage_certificates.go b/pkg/registry/certificates/rest/storage_certificates.go index 84b04e448b9..7a6a6437326 100644 --- a/pkg/registry/certificates/rest/storage_certificates.go +++ b/pkg/registry/certificates/rest/storage_certificates.go @@ -20,6 +20,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/certificates" certificatesapiv1beta1 "k8s.io/kubernetes/pkg/apis/certificates/v1beta1" @@ -28,7 +29,7 @@ import ( type RESTStorageProvider struct{} -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(certificates.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(certificatesapiv1beta1.SchemeGroupVersion) { @@ -39,7 +40,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := certificatesapiv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/pkg/registry/core/rest/BUILD b/pkg/registry/core/rest/BUILD index 86ef57ac91b..6ef295553e4 100644 --- a/pkg/registry/core/rest/BUILD +++ b/pkg/registry/core/rest/BUILD @@ -57,6 +57,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", "//vendor:k8s.io/apiserver/pkg/storage/etcd/util", "//vendor:k8s.io/client-go/rest", ], diff --git a/pkg/registry/core/rest/storage_core.go b/pkg/registry/core/rest/storage_core.go index 7a2f5d559b6..757b64e7c56 100644 --- a/pkg/registry/core/rest/storage_core.go +++ b/pkg/registry/core/rest/storage_core.go @@ -32,6 +32,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" etcdutil "k8s.io/apiserver/pkg/storage/etcd/util" restclient "k8s.io/client-go/rest" "k8s.io/kubernetes/pkg/api" @@ -66,7 +67,7 @@ import ( // LegacyRESTStorageProvider provides information needed to build RESTStorage for core, but // does NOT implement the "normal" RESTStorageProvider (yet!) type LegacyRESTStorageProvider struct { - StorageFactory genericapiserver.StorageFactory + StorageFactory serverstorage.StorageFactory // Used for custom proxy dialing, and proxy TLS options ProxyTransport http.RoundTripper KubeletClientConfig kubeletclient.KubeletClientConfig @@ -238,7 +239,7 @@ func (p LegacyRESTStorageProvider) GroupName() string { } type componentStatusStorage struct { - storageFactory genericapiserver.StorageFactory + storageFactory serverstorage.StorageFactory } func (s componentStatusStorage) serversToValidate() map[string]componentstatus.Server { diff --git a/pkg/registry/extensions/rest/BUILD b/pkg/registry/extensions/rest/BUILD index 7741b04f430..479e572e803 100644 --- a/pkg/registry/extensions/rest/BUILD +++ b/pkg/registry/extensions/rest/BUILD @@ -51,6 +51,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/extensions/rest/storage_extensions.go b/pkg/registry/extensions/rest/storage_extensions.go index e9f17469ff1..d1ff1b01dac 100644 --- a/pkg/registry/extensions/rest/storage_extensions.go +++ b/pkg/registry/extensions/rest/storage_extensions.go @@ -27,6 +27,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" @@ -45,7 +46,7 @@ type RESTStorageProvider struct { ResourceInterface ResourceInterface } -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(extensions.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(extensionsapiv1beta1.SchemeGroupVersion) { @@ -56,7 +57,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := extensionsapiv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/pkg/registry/policy/rest/BUILD b/pkg/registry/policy/rest/BUILD index 1d9b7939c0d..3d3128d5b36 100644 --- a/pkg/registry/policy/rest/BUILD +++ b/pkg/registry/policy/rest/BUILD @@ -19,6 +19,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/policy/rest/storage_policy.go b/pkg/registry/policy/rest/storage_policy.go index aa35b84d6e2..c1067d5b0f9 100644 --- a/pkg/registry/policy/rest/storage_policy.go +++ b/pkg/registry/policy/rest/storage_policy.go @@ -20,6 +20,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/policy" policyapiv1beta1 "k8s.io/kubernetes/pkg/apis/policy/v1beta1" @@ -28,7 +29,7 @@ import ( type RESTStorageProvider struct{} -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(policy.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(policyapiv1beta1.SchemeGroupVersion) { @@ -38,7 +39,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := policyapiv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} if apiResourceConfigSource.ResourceEnabled(version.WithResource("poddisruptionbudgets")) { diff --git a/pkg/registry/rbac/rest/BUILD b/pkg/registry/rbac/rest/BUILD index 0a79675bb4c..198b8910317 100644 --- a/pkg/registry/rbac/rest/BUILD +++ b/pkg/registry/rbac/rest/BUILD @@ -41,6 +41,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/rbac/rest/storage_rbac.go b/pkg/registry/rbac/rest/storage_rbac.go index e1fc4420187..530ef4a1578 100644 --- a/pkg/registry/rbac/rest/storage_rbac.go +++ b/pkg/registry/rbac/rest/storage_rbac.go @@ -30,6 +30,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" rbacapiv1alpha1 "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" @@ -59,7 +60,7 @@ type RESTStorageProvider struct { var _ genericapiserver.PostStartHookProvider = RESTStorageProvider{} -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(rbac.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(rbacapiv1alpha1.SchemeGroupVersion) { @@ -74,7 +75,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) storage(version schema.GroupVersion, apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) storage(version schema.GroupVersion, apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { once := new(sync.Once) var ( authorizationRuleResolver rbacregistryvalidation.AuthorizationRuleResolver diff --git a/pkg/registry/storage/rest/BUILD b/pkg/registry/storage/rest/BUILD index 3ee0ba966f1..d5fc84b07f6 100644 --- a/pkg/registry/storage/rest/BUILD +++ b/pkg/registry/storage/rest/BUILD @@ -19,6 +19,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", ], ) diff --git a/pkg/registry/storage/rest/storage_storage.go b/pkg/registry/storage/rest/storage_storage.go index 33ab82f026a..31239b00213 100644 --- a/pkg/registry/storage/rest/storage_storage.go +++ b/pkg/registry/storage/rest/storage_storage.go @@ -20,6 +20,7 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/registry/rest" genericapiserver "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/kubernetes/pkg/api" storageapi "k8s.io/kubernetes/pkg/apis/storage" storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" @@ -29,7 +30,7 @@ import ( type RESTStorageProvider struct { } -func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { +func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) (genericapiserver.APIGroupInfo, bool) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(storageapi.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) if apiResourceConfigSource.AnyResourcesForVersionEnabled(storageapiv1beta1.SchemeGroupVersion) { @@ -40,7 +41,7 @@ func (p RESTStorageProvider) NewRESTStorage(apiResourceConfigSource genericapise return apiGroupInfo, true } -func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { +func (p RESTStorageProvider) v1beta1Storage(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter) map[string]rest.Storage { version := storageapiv1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} diff --git a/staging/src/k8s.io/apiserver/pkg/server/config.go b/staging/src/k8s.io/apiserver/pkg/server/config.go index 130b6fd7821..9f110556776 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config.go @@ -131,7 +131,8 @@ type Config struct { OpenAPIConfig *openapicommon.Config // SwaggerConfig will be used in generating Swagger spec. This is nil by default. Use DefaultSwaggerConfig for "working" defaults. SwaggerConfig *swagger.Config - // RESTOptionsGetter is used to construct "normal" RESTStorage types + + // RESTOptionsGetter is used to construct RESTStorage types via the generic registry. RESTOptionsGetter genericregistry.RESTOptionsGetter // If specified, requests will be allocated a random timeout between this value, and twice this value. diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/etcd.go b/staging/src/k8s.io/apiserver/pkg/server/options/etcd.go index 4a8ad9edc78..f0c83c0b4c0 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/etcd.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/etcd.go @@ -21,11 +21,11 @@ import ( "github.com/spf13/pflag" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/registry/generic" - "k8s.io/apiserver/pkg/registry/generic/registry" + genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/server" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/storagebackend" ) @@ -42,16 +42,9 @@ type EtcdOptions struct { EnableWatchCache bool } -func NewEtcdOptions(prefix string, copier runtime.ObjectCopier, codec runtime.Codec) *EtcdOptions { +func NewEtcdOptions(backendConfig *storagebackend.Config) *EtcdOptions { return &EtcdOptions{ - StorageConfig: storagebackend.Config{ - Prefix: prefix, - // Default cache size to 0 - if unset, its size will be set based on target - // memory usage. - DeserializationCacheSize: 0, - Copier: copier, - Codec: codec, - }, + StorageConfig: *backendConfig, DefaultStorageMediaType: "application/json", DeleteCollectionWorkers: 1, EnableGarbageCollection: true, @@ -114,28 +107,53 @@ func (s *EtcdOptions) AddFlags(fs *pflag.FlagSet) { } func (s *EtcdOptions) ApplyTo(c *server.Config) error { - c.RESTOptionsGetter = &restOptionsFactory{options: s} - + c.RESTOptionsGetter = &simpleRestOptionsFactory{Options: *s} return nil } -// restOptionsFactory is a default implementation of a RESTOptionsGetter -// This will work well for most aggregated API servers. The legacy kube server needs more customization -type restOptionsFactory struct { - options *EtcdOptions +func (s *EtcdOptions) ApplyWithStorageFactoryTo(factory serverstorage.StorageFactory, c *server.Config) error { + c.RESTOptionsGetter = &storageFactoryRestOptionsFactory{Options: *s, StorageFactory: factory} + return nil } -func (f *restOptionsFactory) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { +type simpleRestOptionsFactory struct { + Options EtcdOptions +} + +func (f *simpleRestOptionsFactory) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { ret := generic.RESTOptions{ - StorageConfig: &f.options.StorageConfig, - Decorator: registry.StorageWithCacher, - DeleteCollectionWorkers: f.options.DeleteCollectionWorkers, - EnableGarbageCollection: f.options.EnableGarbageCollection, - ResourcePrefix: f.options.StorageConfig.Prefix + "/" + resource.Group + "/" + resource.Resource, + StorageConfig: &f.Options.StorageConfig, + Decorator: generic.UndecoratedStorage, + EnableGarbageCollection: f.Options.EnableGarbageCollection, + DeleteCollectionWorkers: f.Options.DeleteCollectionWorkers, + ResourcePrefix: f.Options.StorageConfig.Prefix + "/" + resource.Group + "/" + resource.Resource, + } + if f.Options.EnableWatchCache { + ret.Decorator = genericregistry.StorageWithCacher + } + return ret, nil +} + +type storageFactoryRestOptionsFactory struct { + Options EtcdOptions + StorageFactory serverstorage.StorageFactory +} + +func (f *storageFactoryRestOptionsFactory) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { + storageConfig, err := f.StorageFactory.NewConfig(resource) + if err != nil { + return generic.RESTOptions{}, fmt.Errorf("unable to find storage destination for %v, due to %v", resource, err.Error()) } - if !f.options.EnableWatchCache { - ret.Decorator = generic.UndecoratedStorage + ret := generic.RESTOptions{ + StorageConfig: storageConfig, + Decorator: generic.UndecoratedStorage, + DeleteCollectionWorkers: f.Options.DeleteCollectionWorkers, + EnableGarbageCollection: f.Options.EnableGarbageCollection, + ResourcePrefix: f.StorageFactory.ResourcePrefix(resource), + } + if f.Options.EnableWatchCache { + ret.Decorator = genericregistry.StorageWithCacher } return ret, nil diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go index bc75edf8454..cf0ba4016e6 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go @@ -21,6 +21,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/server" + "k8s.io/apiserver/pkg/storage/storagebackend" ) // RecommendedOptions contains the recommended options for running an API server @@ -36,7 +37,7 @@ type RecommendedOptions struct { func NewRecommendedOptions(prefix string, copier runtime.ObjectCopier, codec runtime.Codec) *RecommendedOptions { return &RecommendedOptions{ - Etcd: NewEtcdOptions(prefix, copier, codec), + Etcd: NewEtcdOptions(storagebackend.NewDefaultConfig(prefix, copier, codec)), SecureServing: NewSecureServingOptions(), Authentication: NewDelegatingAuthenticationOptions(), Authorization: NewDelegatingAuthorizationOptions(), diff --git a/staging/src/k8s.io/apiserver/pkg/server/storage/doc.go b/staging/src/k8s.io/apiserver/pkg/server/storage/doc.go new file mode 100644 index 00000000000..71d4e2be7d4 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2015 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package storage contains the plumbing to setup the etcd storage of the apiserver. +package storage diff --git a/staging/src/k8s.io/apiserver/pkg/server/resource_config.go b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_config.go similarity index 99% rename from staging/src/k8s.io/apiserver/pkg/server/resource_config.go rename to staging/src/k8s.io/apiserver/pkg/server/storage/resource_config.go index 06be1a55fe9..da232569a91 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/resource_config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_config.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package server +package storage import ( "k8s.io/apimachinery/pkg/runtime/schema" diff --git a/staging/src/k8s.io/apiserver/pkg/server/resource_config_test.go b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_config_test.go similarity index 99% rename from staging/src/k8s.io/apiserver/pkg/server/resource_config_test.go rename to staging/src/k8s.io/apiserver/pkg/server/storage/resource_config_test.go index 576b24a89c5..4eb9b544c56 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/resource_config_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_config_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package server +package storage import ( "testing" diff --git a/staging/src/k8s.io/apiserver/pkg/server/resource_encoding_config.go b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go similarity index 99% rename from staging/src/k8s.io/apiserver/pkg/server/resource_encoding_config.go rename to staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go index f00ca91e52f..78cb865b744 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/resource_encoding_config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package server +package storage import ( "k8s.io/apimachinery/pkg/apimachinery/registered" diff --git a/staging/src/k8s.io/apiserver/pkg/server/storage/storage_codec.go b/staging/src/k8s.io/apiserver/pkg/server/storage/storage_codec.go new file mode 100644 index 00000000000..c815851d343 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/storage_codec.go @@ -0,0 +1,94 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package storage + +import ( + "fmt" + "mime" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer/recognizer" + "k8s.io/apiserver/pkg/storage/storagebackend" + + "github.com/golang/glog" +) + +// StorageCodecConfig are the arguments passed to newStorageCodecFn +type StorageCodecConfig struct { + StorageMediaType string + StorageSerializer runtime.StorageSerializer + StorageVersion schema.GroupVersion + MemoryVersion schema.GroupVersion + Config storagebackend.Config + + EncoderDecoratorFn func(runtime.Encoder) runtime.Encoder + DecoderDecoratorFn func([]runtime.Decoder) []runtime.Decoder +} + +// NewStorageCodec assembles a storage codec for the provided storage media type, the provided serializer, and the requested +// storage and memory versions. +func NewStorageCodec(opts StorageCodecConfig) (runtime.Codec, error) { + mediaType, _, err := mime.ParseMediaType(opts.StorageMediaType) + if err != nil { + return nil, fmt.Errorf("%q is not a valid mime-type", opts.StorageMediaType) + } + serializer, ok := runtime.SerializerInfoForMediaType(opts.StorageSerializer.SupportedMediaTypes(), mediaType) + if !ok { + return nil, fmt.Errorf("unable to find serializer for %q", opts.StorageMediaType) + } + + s := serializer.Serializer + + // etcd2 only supports string data - we must wrap any result before returning + // TODO: storagebackend should return a boolean indicating whether it supports binary data + if !serializer.EncodesAsText && (opts.Config.Type == storagebackend.StorageTypeUnset || opts.Config.Type == storagebackend.StorageTypeETCD2) { + glog.V(4).Infof("Wrapping the underlying binary storage serializer with a base64 encoding for etcd2") + s = runtime.NewBase64Serializer(s) + } + + // Give callers the opportunity to wrap encoders and decoders. For decoders, each returned decoder will + // be passed to the recognizer so that multiple decoders are available. + var encoder runtime.Encoder = s + if opts.EncoderDecoratorFn != nil { + encoder = opts.EncoderDecoratorFn(encoder) + } + decoders := []runtime.Decoder{s, opts.StorageSerializer.UniversalDeserializer()} + if opts.DecoderDecoratorFn != nil { + decoders = opts.DecoderDecoratorFn(decoders) + } + + // Ensure the storage receives the correct version. + encoder = opts.StorageSerializer.EncoderForVersion( + encoder, + runtime.NewMultiGroupVersioner( + opts.StorageVersion, + schema.GroupKind{Group: opts.StorageVersion.Group}, + schema.GroupKind{Group: opts.MemoryVersion.Group}, + ), + ) + decoder := opts.StorageSerializer.DecoderToVersion( + recognizer.NewDecoder(decoders...), + runtime.NewMultiGroupVersioner( + opts.MemoryVersion, + schema.GroupKind{Group: opts.MemoryVersion.Group}, + schema.GroupKind{Group: opts.StorageVersion.Group}, + ), + ) + + return runtime.NewCodec(encoder, decoder), nil +} diff --git a/staging/src/k8s.io/apiserver/pkg/server/storage_factory.go b/staging/src/k8s.io/apiserver/pkg/server/storage/storage_factory.go similarity index 81% rename from staging/src/k8s.io/apiserver/pkg/server/storage_factory.go rename to staging/src/k8s.io/apiserver/pkg/server/storage/storage_factory.go index b40306bf740..98761f1827d 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/storage_factory.go +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/storage_factory.go @@ -14,20 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -package server +package storage import ( - "fmt" - "mime" "strings" + "github.com/golang/glog" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/runtime/serializer/recognizer" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/storage/storagebackend" - - "github.com/golang/glog" ) // StorageFactory is the interface to locate the storage for a given GroupResource @@ -77,18 +74,6 @@ type DefaultStorageFactory struct { newStorageCodecFn func(opts StorageCodecConfig) (codec runtime.Codec, err error) } -// StorageCodecConfig are the arguments passed to newStorageCodecFn -type StorageCodecConfig struct { - StorageMediaType string - StorageSerializer runtime.StorageSerializer - StorageVersion schema.GroupVersion - MemoryVersion schema.GroupVersion - Config storagebackend.Config - - EncoderDecoratorFn func(runtime.Encoder) runtime.Encoder - DecoderDecoratorFn func([]runtime.Decoder) []runtime.Decoder -} - type groupResourceOverrides struct { // etcdLocation contains the list of "special" locations that are used for particular GroupResources // These are merged on top of the StorageConfig when requesting the storage.Interface for a given GroupResource @@ -278,59 +263,6 @@ func (s *DefaultStorageFactory) Backends() []string { return backends.List() } -// NewStorageCodec assembles a storage codec for the provided storage media type, the provided serializer, and the requested -// storage and memory versions. -func NewStorageCodec(opts StorageCodecConfig) (runtime.Codec, error) { - mediaType, _, err := mime.ParseMediaType(opts.StorageMediaType) - if err != nil { - return nil, fmt.Errorf("%q is not a valid mime-type", opts.StorageMediaType) - } - serializer, ok := runtime.SerializerInfoForMediaType(opts.StorageSerializer.SupportedMediaTypes(), mediaType) - if !ok { - return nil, fmt.Errorf("unable to find serializer for %q", opts.StorageMediaType) - } - - s := serializer.Serializer - - // etcd2 only supports string data - we must wrap any result before returning - // TODO: storagebackend should return a boolean indicating whether it supports binary data - if !serializer.EncodesAsText && (opts.Config.Type == storagebackend.StorageTypeUnset || opts.Config.Type == storagebackend.StorageTypeETCD2) { - glog.V(4).Infof("Wrapping the underlying binary storage serializer with a base64 encoding for etcd2") - s = runtime.NewBase64Serializer(s) - } - - // Give callers the opportunity to wrap encoders and decoders. For decoders, each returned decoder will - // be passed to the recognizer so that multiple decoders are available. - var encoder runtime.Encoder = s - if opts.EncoderDecoratorFn != nil { - encoder = opts.EncoderDecoratorFn(encoder) - } - decoders := []runtime.Decoder{s, opts.StorageSerializer.UniversalDeserializer()} - if opts.DecoderDecoratorFn != nil { - decoders = opts.DecoderDecoratorFn(decoders) - } - - // Ensure the storage receives the correct version. - encoder = opts.StorageSerializer.EncoderForVersion( - encoder, - runtime.NewMultiGroupVersioner( - opts.StorageVersion, - schema.GroupKind{Group: opts.StorageVersion.Group}, - schema.GroupKind{Group: opts.MemoryVersion.Group}, - ), - ) - decoder := opts.StorageSerializer.DecoderToVersion( - recognizer.NewDecoder(decoders...), - runtime.NewMultiGroupVersioner( - opts.MemoryVersion, - schema.GroupKind{Group: opts.MemoryVersion.Group}, - schema.GroupKind{Group: opts.StorageVersion.Group}, - ), - ) - - return runtime.NewCodec(encoder, decoder), nil -} - func (s *DefaultStorageFactory) ResourcePrefix(groupResource schema.GroupResource) string { chosenStorageResource := s.getStorageGroupResource(groupResource) groupOverride := s.Overrides[getAllResourcesAlias(chosenStorageResource)] diff --git a/staging/src/k8s.io/apiserver/pkg/server/storage_factory_test.go b/staging/src/k8s.io/apiserver/pkg/server/storage/storage_factory_test.go similarity index 89% rename from staging/src/k8s.io/apiserver/pkg/server/storage_factory_test.go rename to staging/src/k8s.io/apiserver/pkg/server/storage/storage_factory_test.go index b644a23a6dd..3839c842d8e 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/storage_factory_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/storage/storage_factory_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package server +package storage import ( "os" @@ -23,20 +23,36 @@ import ( "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/storage/storagebackend" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apiserver/pkg/apis/example" + examplev1 "k8s.io/apiserver/pkg/apis/example/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime" ) var ( + v1GroupVersion = schema.GroupVersion{Group: "", Version: "v1"} + registry = registered.NewOrDie(os.Getenv("KUBE_API_VERSIONS")) announce = make(announced.APIGroupFactoryRegistry) + scheme = runtime.NewScheme() + codecs = serializer.NewCodecFactory(scheme) + parameterCodec = runtime.NewParameterCodec(scheme) ) func init() { + metav1.AddToGroupVersion(scheme, metav1.SchemeGroupVersion) + scheme.AddUnversionedTypes(v1GroupVersion, + &metav1.Status{}, + &metav1.APIVersions{}, + &metav1.APIGroupList{}, + &metav1.APIGroup{}, + &metav1.APIResourceList{}, + ) + exampleinstall.Install(announce, registry, scheme) } @@ -76,7 +92,7 @@ func (n *fakeNegotiater) DecoderToVersion(serializer runtime.Decoder, gv runtime return n.serializer } -func TestDefaultStorageFactory(t *testing.T) { +func TestConfigurableStorageFactory(t *testing.T) { ns := &fakeNegotiater{types: []string{"test/test"}} f := NewDefaultStorageFactory(storagebackend.Config{}, "test/test", ns, NewDefaultResourceEncodingConfig(registry), NewResourceConfig()) f.AddCohabitatingResources(example.Resource("test"), schema.GroupResource{Resource: "test2", Group: "2"}) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/config.go b/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/config.go index e1cdd8244f8..dc55bc42870 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/config.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/storagebackend/config.go @@ -43,6 +43,17 @@ type Config struct { // We will drop the cache once using protobuf. DeserializationCacheSize int - Codec runtime.Codec + Codec runtime.Codec Copier runtime.ObjectCopier } + +func NewDefaultConfig(prefix string, copier runtime.ObjectCopier, codec runtime.Codec) *Config { + return &Config{ + Prefix: prefix, + // Default cache size to 0 - if unset, its size will be set based on target + // memory usage. + DeserializationCacheSize: 0, + Copier: copier, + Codec: codec, + } +} diff --git a/test/integration/framework/BUILD b/test/integration/framework/BUILD index ca7de5fa8c0..0b29120df9d 100644 --- a/test/integration/framework/BUILD +++ b/test/integration/framework/BUILD @@ -34,7 +34,6 @@ go_library( "//pkg/controller:go_default_library", "//pkg/controller/replication:go_default_library", "//pkg/generated/openapi:go_default_library", - "//pkg/kubeapiserver:go_default_library", "//pkg/kubectl:go_default_library", "//pkg/kubelet/client:go_default_library", "//pkg/master:go_default_library", @@ -61,6 +60,8 @@ go_library( "//vendor:k8s.io/apiserver/pkg/authorization/authorizerfactory", "//vendor:k8s.io/apiserver/pkg/authorization/union", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/options", + "//vendor:k8s.io/apiserver/pkg/server/storage", "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", "//vendor:k8s.io/client-go/rest", "//vendor:k8s.io/client-go/tools/record", diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index 250a92e597c..6d3ba756176 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -26,6 +26,9 @@ import ( "testing" "time" + "github.com/go-openapi/spec" + "github.com/pborman/uuid" + "github.com/golang/glog" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -40,6 +43,8 @@ import ( "k8s.io/apiserver/pkg/authorization/authorizerfactory" authorizerunion "k8s.io/apiserver/pkg/authorization/union" genericapiserver "k8s.io/apiserver/pkg/server" + "k8s.io/apiserver/pkg/server/options" + serverstorage "k8s.io/apiserver/pkg/server/storage" "k8s.io/apiserver/pkg/storage/storagebackend" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/record" @@ -61,16 +66,12 @@ import ( "k8s.io/kubernetes/pkg/controller" replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" "k8s.io/kubernetes/pkg/generated/openapi" - "k8s.io/kubernetes/pkg/kubeapiserver" "k8s.io/kubernetes/pkg/kubectl" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/util/env" "k8s.io/kubernetes/pkg/version" "k8s.io/kubernetes/plugin/pkg/admission/admit" - - "github.com/go-openapi/spec" - "github.com/pborman/uuid" ) const ( @@ -309,53 +310,50 @@ func GetEtcdURLFromEnv() string { // Returns a basic master config. func NewMasterConfig() *master.Config { - config := storagebackend.Config{ - ServerList: []string{GetEtcdURLFromEnv()}, - // This causes the integration tests to exercise the etcd - // prefix code, so please don't change without ensuring - // sufficient coverage in other ways. - Prefix: uuid.New(), - Copier: api.Scheme, - } + // This causes the integration tests to exercise the etcd + // prefix code, so please don't change without ensuring + // sufficient coverage in other ways. + etcdOptions := options.NewEtcdOptions(storagebackend.NewDefaultConfig(uuid.New(), api.Scheme, nil)) + etcdOptions.StorageConfig.ServerList = []string{GetEtcdURLFromEnv()} info, _ := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), runtime.ContentTypeJSON) ns := NewSingleContentTypeSerializer(api.Scheme, info) - storageFactory := genericapiserver.NewDefaultStorageFactory(config, runtime.ContentTypeJSON, ns, genericapiserver.NewDefaultResourceEncodingConfig(api.Registry), master.DefaultAPIResourceConfigSource()) + storageFactory := serverstorage.NewDefaultStorageFactory(etcdOptions.StorageConfig, runtime.ContentTypeJSON, ns, serverstorage.NewDefaultResourceEncodingConfig(api.Registry), master.DefaultAPIResourceConfigSource()) storageFactory.SetSerializer( - schema.GroupResource{Group: v1.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: v1.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: autoscaling.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: autoscaling.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: batch.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: batch.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: apps.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: apps.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: extensions.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: extensions.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: policy.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: policy.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: rbac.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: rbac.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: certificates.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: certificates.GroupName, Resource: serverstorage.AllResources}, "", ns) storageFactory.SetSerializer( - schema.GroupResource{Group: storage.GroupName, Resource: genericapiserver.AllResources}, + schema.GroupResource{Group: storage.GroupName, Resource: serverstorage.AllResources}, "", ns) @@ -365,11 +363,10 @@ func NewMasterConfig() *master.Config { genericConfig.Authorizer = authorizerfactory.NewAlwaysAllowAuthorizer() genericConfig.AdmissionControl = admit.NewAlwaysAdmit() genericConfig.EnableMetrics = true - genericConfig.RESTOptionsGetter = &kubeapiserver.RESTOptionsFactory{ - StorageFactory: storageFactory, - EnableWatchCache: true, - EnableGarbageCollection: true, - DeleteCollectionWorkers: 1, + + err := etcdOptions.ApplyWithStorageFactoryTo(storageFactory, genericConfig) + if err != nil { + panic(err) } return &master.Config{ diff --git a/vendor/BUILD b/vendor/BUILD index 87a3b14870a..14fd079407d 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -9061,10 +9061,7 @@ go_library( "k8s.io/apiserver/pkg/server/genericapiserver.go", "k8s.io/apiserver/pkg/server/healthz.go", "k8s.io/apiserver/pkg/server/hooks.go", - "k8s.io/apiserver/pkg/server/resource_config.go", - "k8s.io/apiserver/pkg/server/resource_encoding_config.go", "k8s.io/apiserver/pkg/server/serve.go", - "k8s.io/apiserver/pkg/server/storage_factory.go", ], tags = ["automanaged"], deps = [ @@ -9082,7 +9079,6 @@ go_library( "//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", "//vendor:k8s.io/apimachinery/pkg/runtime/serializer", - "//vendor:k8s.io/apimachinery/pkg/runtime/serializer/recognizer", "//vendor:k8s.io/apimachinery/pkg/util/net", "//vendor:k8s.io/apimachinery/pkg/util/runtime", "//vendor:k8s.io/apimachinery/pkg/util/sets", @@ -9107,7 +9103,6 @@ go_library( "//vendor:k8s.io/apiserver/pkg/server/healthz", "//vendor:k8s.io/apiserver/pkg/server/mux", "//vendor:k8s.io/apiserver/pkg/server/routes", - "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", "//vendor:k8s.io/client-go/rest", "//vendor:k8s.io/client-go/util/cert", ], @@ -14145,6 +14140,7 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry", "//vendor:k8s.io/apiserver/pkg/server", + "//vendor:k8s.io/apiserver/pkg/server/storage", "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", "//vendor:k8s.io/apiserver/pkg/util/feature", "//vendor:k8s.io/apiserver/pkg/util/flag", @@ -14808,11 +14804,7 @@ go_library( go_test( name = "k8s.io/apiserver/pkg/server_test", - srcs = [ - "k8s.io/apiserver/pkg/server/genericapiserver_test.go", - "k8s.io/apiserver/pkg/server/resource_config_test.go", - "k8s.io/apiserver/pkg/server/storage_factory_test.go", - ], + srcs = ["k8s.io/apiserver/pkg/server/genericapiserver_test.go"], library = ":k8s.io/apiserver/pkg/server", tags = ["automanaged"], deps = [ @@ -14821,8 +14813,6 @@ go_test( "//vendor:github.com/stretchr/testify/assert", "//vendor:k8s.io/apimachinery/pkg/api/meta", "//vendor:k8s.io/apimachinery/pkg/apimachinery", - "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", - "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", @@ -14831,14 +14821,12 @@ go_test( "//vendor:k8s.io/apimachinery/pkg/util/sets", "//vendor:k8s.io/apimachinery/pkg/version", "//vendor:k8s.io/apiserver/pkg/apis/example", - "//vendor:k8s.io/apiserver/pkg/apis/example/install", "//vendor:k8s.io/apiserver/pkg/apis/example/v1", "//vendor:k8s.io/apiserver/pkg/authentication/user", "//vendor:k8s.io/apiserver/pkg/authorization/authorizer", "//vendor:k8s.io/apiserver/pkg/endpoints/request", "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/storage/etcd/testing", - "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", "//vendor:k8s.io/client-go/pkg/api", "//vendor:k8s.io/client-go/rest", ], @@ -16847,3 +16835,46 @@ go_library( "//vendor:k8s.io/kube-aggregator/pkg/registry/apiservice", ], ) + +go_test( + name = "k8s.io/apiserver/pkg/server/storage_test", + srcs = [ + "k8s.io/apiserver/pkg/server/storage/resource_config_test.go", + "k8s.io/apiserver/pkg/server/storage/storage_factory_test.go", + ], + library = ":k8s.io/apiserver/pkg/server/storage", + tags = ["automanaged"], + deps = [ + "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", + "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", + "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", + "//vendor:k8s.io/apimachinery/pkg/runtime", + "//vendor:k8s.io/apimachinery/pkg/runtime/schema", + "//vendor:k8s.io/apimachinery/pkg/runtime/serializer", + "//vendor:k8s.io/apiserver/pkg/apis/example", + "//vendor:k8s.io/apiserver/pkg/apis/example/install", + "//vendor:k8s.io/apiserver/pkg/apis/example/v1", + "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", + ], +) + +go_library( + name = "k8s.io/apiserver/pkg/server/storage", + srcs = [ + "k8s.io/apiserver/pkg/server/storage/doc.go", + "k8s.io/apiserver/pkg/server/storage/resource_config.go", + "k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go", + "k8s.io/apiserver/pkg/server/storage/storage_codec.go", + "k8s.io/apiserver/pkg/server/storage/storage_factory.go", + ], + tags = ["automanaged"], + deps = [ + "//vendor:github.com/golang/glog", + "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", + "//vendor:k8s.io/apimachinery/pkg/runtime", + "//vendor:k8s.io/apimachinery/pkg/runtime/schema", + "//vendor:k8s.io/apimachinery/pkg/runtime/serializer/recognizer", + "//vendor:k8s.io/apimachinery/pkg/util/sets", + "//vendor:k8s.io/apiserver/pkg/storage/storagebackend", + ], +)