mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Merge pull request #41313 from sttts/sttts-apiserver-server-storage
Automatic merge from submit-queue (batch tested with PRs 41134, 41410, 40177, 41049, 41313) apiserver: further cleanup of apiserver storage plumbing - move kubeapiserver`s `RESTOptionsFactory` back to EtcdOptions by adding a `AddWithStorageFactoryTo` - factor out storage backend `Config` construction from EtcdOptions - move all `StorageFactory` related code into server/storage subpackage. In short: remove my stomach ache about `kubeapiserver.RESTOptionsFactory`. approved based on #40363
This commit is contained in:
		@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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(),
 | 
			
		||||
 
 | 
			
		||||
@@ -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{
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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(),
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
			},
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								pkg/master/thirdparty/BUILD
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								pkg/master/thirdparty/BUILD
									
									
									
									
										vendored
									
									
								
							@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								pkg/master/thirdparty/thirdparty.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								pkg/master/thirdparty/thirdparty.go
									
									
									
									
										vendored
									
									
								
							@@ -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{},
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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")) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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{}
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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(),
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								staging/src/k8s.io/apiserver/pkg/server/storage/doc.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								staging/src/k8s.io/apiserver/pkg/server/storage/doc.go
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package server
 | 
			
		||||
package storage
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
@@ -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)]
 | 
			
		||||
@@ -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"})
 | 
			
		||||
@@ -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,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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",
 | 
			
		||||
 
 | 
			
		||||
@@ -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{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										59
									
								
								vendor/BUILD
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										59
									
								
								vendor/BUILD
									
									
									
									
										vendored
									
									
								
							@@ -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",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user