From ca3f7453464f6866a3bf467c8b9d8e132484cfb4 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 6 Sep 2017 18:22:23 +0200 Subject: [PATCH] apiserver: stratify versioned informer construction --- cmd/kube-apiserver/app/aggregator.go | 5 ++- cmd/kube-apiserver/app/apiextensions.go | 8 +++-- cmd/kube-apiserver/app/server.go | 9 ++--- .../cmd/federation-apiserver/app/server.go | 11 ++++++- pkg/master/master.go | 5 +-- pkg/master/master_openapi_test.go | 4 +-- pkg/master/master_test.go | 14 ++++---- .../pkg/apiserver/apiserver.go | 2 +- .../pkg/cmd/server/start.go | 2 +- .../test/integration/testserver/start.go | 2 +- .../src/k8s.io/apiserver/pkg/server/config.go | 33 ++++++++++++++++--- .../apiserver/pkg/server/config_test.go | 8 ++--- .../pkg/server/genericapiserver_test.go | 12 +++---- .../apiserver/pkg/server/options/admission.go | 9 ++--- .../pkg/server/options/recommended.go | 26 +++++++++++---- .../apiserver/pkg/server/options/serving.go | 24 -------------- .../pkg/server/options/serving_test.go | 2 +- .../pkg/apiserver/apiserver.go | 2 +- .../kube-aggregator/pkg/cmd/server/start.go | 2 +- .../pkg/apiserver/apiserver.go | 3 +- .../sample-apiserver/pkg/cmd/server/start.go | 4 +-- .../etcd/etcd_storage_path_test.go | 4 +-- test/integration/examples/apiserver_test.go | 4 +-- test/integration/framework/master_utils.go | 4 +-- 24 files changed, 115 insertions(+), 84 deletions(-) diff --git a/cmd/kube-apiserver/app/aggregator.go b/cmd/kube-apiserver/app/aggregator.go index 1c31d537e9e..aab55da9c28 100644 --- a/cmd/kube-apiserver/app/aggregator.go +++ b/cmd/kube-apiserver/app/aggregator.go @@ -76,7 +76,10 @@ func createAggregatorConfig(kubeAPIServerConfig genericapiserver.Config, command } aggregatorConfig := &aggregatorapiserver.Config{ - GenericConfig: &genericConfig, + GenericConfig: &genericapiserver.RecommendedConfig{ + Config: genericConfig, + SharedInformerFactory: externalInformers, + }, ExtraConfig: aggregatorapiserver.ExtraConfig{ CoreKubeInformers: externalInformers, ProxyClientCert: certBytes, diff --git a/cmd/kube-apiserver/app/apiextensions.go b/cmd/kube-apiserver/app/apiextensions.go index 1d2697cab66..aa9c19fe3db 100644 --- a/cmd/kube-apiserver/app/apiextensions.go +++ b/cmd/kube-apiserver/app/apiextensions.go @@ -25,10 +25,11 @@ import ( apiextensionscmd "k8s.io/apiextensions-apiserver/pkg/cmd/server" genericapiserver "k8s.io/apiserver/pkg/server" genericoptions "k8s.io/apiserver/pkg/server/options" + kubeexternalinformers "k8s.io/client-go/informers" "k8s.io/kubernetes/cmd/kube-apiserver/app/options" ) -func createAPIExtensionsConfig(kubeAPIServerConfig genericapiserver.Config, commandOptions *options.ServerRunOptions) (*apiextensionsapiserver.Config, error) { +func createAPIExtensionsConfig(kubeAPIServerConfig genericapiserver.Config, externalInformers kubeexternalinformers.SharedInformerFactory, commandOptions *options.ServerRunOptions) (*apiextensionsapiserver.Config, error) { // make a shallow copy to let us twiddle a few things // most of the config actually remains the same. We only need to mess with a couple items related to the particulars of the apiextensions genericConfig := kubeAPIServerConfig @@ -40,7 +41,10 @@ func createAPIExtensionsConfig(kubeAPIServerConfig genericapiserver.Config, comm genericConfig.RESTOptionsGetter = &genericoptions.SimpleRestOptionsFactory{Options: etcdOptions} apiextensionsConfig := &apiextensionsapiserver.Config{ - GenericConfig: &genericConfig, + GenericConfig: &genericapiserver.RecommendedConfig{ + Config: genericConfig, + SharedInformerFactory: externalInformers, + }, ExtraConfig: apiextensionsapiserver.ExtraConfig{ CRDRESTOptionsGetter: apiextensionscmd.NewCRDRESTOptionsGetter(etcdOptions), }, diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 1923512000c..df6fd7cb5c2 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -133,7 +133,7 @@ func CreateServerChain(runOptions *options.ServerRunOptions, stopCh <-chan struc // TPRs are enabled and not yet beta, since this these are the successor, they fall under the same enablement rule // If additional API servers are added, they should be gated. - apiExtensionsConfig, err := createAPIExtensionsConfig(*kubeAPIServerConfig.GenericConfig, runOptions) + apiExtensionsConfig, err := createAPIExtensionsConfig(*kubeAPIServerConfig.GenericConfig, versionedInformers, runOptions) if err != nil { return nil, err } @@ -142,7 +142,7 @@ func CreateServerChain(runOptions *options.ServerRunOptions, stopCh <-chan struc return nil, err } - kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, apiExtensionsServer.GenericAPIServer, sharedInformers) + kubeAPIServer, err := CreateKubeAPIServer(kubeAPIServerConfig, apiExtensionsServer.GenericAPIServer, sharedInformers, versionedInformers) if err != nil { return nil, err } @@ -191,8 +191,8 @@ func CreateServerChain(runOptions *options.ServerRunOptions, stopCh <-chan struc } // CreateKubeAPIServer creates and wires a workable kube-apiserver -func CreateKubeAPIServer(kubeAPIServerConfig *master.Config, delegateAPIServer genericapiserver.DelegationTarget, sharedInformers informers.SharedInformerFactory) (*master.Master, error) { - kubeAPIServer, err := kubeAPIServerConfig.Complete().New(delegateAPIServer) +func CreateKubeAPIServer(kubeAPIServerConfig *master.Config, delegateAPIServer genericapiserver.DelegationTarget, sharedInformers informers.SharedInformerFactory, versionedInformers clientgoinformers.SharedInformerFactory) (*master.Master, error) { + kubeAPIServer, err := kubeAPIServerConfig.Complete(versionedInformers).New(delegateAPIServer) if err != nil { return nil, err } @@ -466,6 +466,7 @@ func BuildGenericConfig(s *options.ServerRunOptions) (*genericapiserver.Config, err = s.Admission.ApplyTo( genericConfig, + versionedInformers, pluginInitializer) if err != nil { return nil, nil, nil, nil, nil, fmt.Errorf("failed to initialize admission: %v", err) diff --git a/federation/cmd/federation-apiserver/app/server.go b/federation/cmd/federation-apiserver/app/server.go index 47f3054cc55..78d50ea2abe 100644 --- a/federation/cmd/federation-apiserver/app/server.go +++ b/federation/cmd/federation-apiserver/app/server.go @@ -39,6 +39,8 @@ import ( genericapiserver "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server/filters" serverstorage "k8s.io/apiserver/pkg/server/storage" + clientgoinformers "k8s.io/client-go/informers" + clientgoclientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes" openapicommon "k8s.io/kube-openapi/pkg/common" federationv1beta1 "k8s.io/kubernetes/federation/apis/federation/v1beta1" @@ -189,6 +191,12 @@ func NonBlockingRun(s *options.ServerRunOptions, stopCh <-chan struct{}) error { } sharedInformers := informers.NewSharedInformerFactory(client, 10*time.Minute) + clientgoExternalClient, err := clientgoclientset.NewForConfig(genericConfig.LoopbackClientConfig) + if err != nil { + return fmt.Errorf("failed to create real external clientset: %v", err) + } + versionedInformers := clientgoinformers.NewSharedInformerFactory(clientgoExternalClient, 10*time.Minute) + authorizationConfig := s.Authorization.ToAuthorizationConfig(sharedInformers) apiAuthorizer, _, err := authorizationConfig.New() if err != nil { @@ -210,6 +218,7 @@ func NonBlockingRun(s *options.ServerRunOptions, stopCh <-chan struct{}) error { err = s.Admission.ApplyTo( genericConfig, + versionedInformers, pluginInitializer, ) if err != nil { @@ -235,7 +244,7 @@ func NonBlockingRun(s *options.ServerRunOptions, stopCh <-chan struct{}) error { cachesize.SetWatchCacheSizes(s.GenericServerRunOptions.WatchCacheSizes) } - m, err := genericConfig.Complete().New("federation", genericapiserver.EmptyDelegate) + m, err := genericConfig.Complete(versionedInformers).New("federation", genericapiserver.EmptyDelegate) if err != nil { return err } diff --git a/pkg/master/master.go b/pkg/master/master.go index 184d10a282b..b2117e00f2b 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -62,6 +62,7 @@ import ( "github.com/prometheus/client_golang/prometheus" // RESTStorage installers + "k8s.io/client-go/informers" admissionregistrationrest "k8s.io/kubernetes/pkg/registry/admissionregistration/rest" appsrest "k8s.io/kubernetes/pkg/registry/apps/rest" authenticationrest "k8s.io/kubernetes/pkg/registry/authentication/rest" @@ -163,9 +164,9 @@ type Master struct { } // Complete fills in any fields not set that are required to have valid data. It's mutating the receiver. -func (cfg *Config) Complete() CompletedConfig { +func (cfg *Config) Complete(informers informers.SharedInformerFactory) CompletedConfig { c := completedConfig{ - cfg.GenericConfig.Complete(), + cfg.GenericConfig.Complete(informers), &cfg.ExtraConfig, } diff --git a/pkg/master/master_openapi_test.go b/pkg/master/master_openapi_test.go index 4629e4159eb..92501ca40f5 100644 --- a/pkg/master/master_openapi_test.go +++ b/pkg/master/master_openapi_test.go @@ -41,7 +41,7 @@ import ( // TestValidOpenAPISpec verifies that the open api is added // at the proper endpoint and the spec is valid. func TestValidOpenAPISpec(t *testing.T) { - etcdserver, config, assert := setUp(t) + etcdserver, config, sharedInformers, assert := setUp(t) defer etcdserver.Terminate(t) config.GenericConfig.EnableIndex = true @@ -54,7 +54,7 @@ func TestValidOpenAPISpec(t *testing.T) { } config.GenericConfig.SwaggerConfig = genericapiserver.DefaultSwaggerConfig() - master, err := config.Complete().New(genericapiserver.EmptyDelegate) + master, err := config.Complete(sharedInformers).New(genericapiserver.EmptyDelegate) if err != nil { t.Fatalf("Error in bringing up the master: %v", err) } diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 89f2b2ae22b..11ec1e0a01b 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -66,11 +66,11 @@ import ( ) // setUp is a convience function for setting up for (most) tests. -func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertions) { +func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, informers.SharedInformerFactory, *assert.Assertions) { server, storageConfig := etcdtesting.NewUnsecuredEtcd3TestClientServer(t, api.Scheme) config := &Config{ - GenericConfig: genericapiserver.NewConfig(api.Codecs), + GenericConfig: genericapiserver.NewConfig(api.Codecs), ExtraConfig: ExtraConfig{ APIResourceConfigSource: DefaultAPIResourceConfigSource(), APIServerServicePort: 443, @@ -115,9 +115,9 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion if err != nil { t.Fatalf("unable to create client set due to %v", err) } - config.GenericConfig.SharedInformerFactory = informers.NewSharedInformerFactory(clientset, config.GenericConfig.LoopbackClientConfig.Timeout) + sharedInformers := informers.NewSharedInformerFactory(clientset, config.GenericConfig.LoopbackClientConfig.Timeout) - return server, *config, assert.New(t) + return server, *config, sharedInformers, assert.New(t) } // TestLegacyRestStorageStrategies ensures that all Storage objects which are using the generic registry Store have @@ -180,9 +180,9 @@ func TestCertificatesRestStorageStrategies(t *testing.T) { } func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { - etcdserver, config, assert := setUp(t) + etcdserver, config, sharedInformers, assert := setUp(t) - master, err := config.Complete().New(genericapiserver.EmptyDelegate) + master, err := config.Complete(sharedInformers).New(genericapiserver.EmptyDelegate) if err != nil { t.Fatalf("Error in bringing up the master: %v", err) } @@ -206,7 +206,7 @@ func limitedAPIResourceConfigSource() *serverstorage.ResourceConfig { // newLimitedMaster only enables the core group, the extensions group, the batch group, and the autoscaling group. func newLimitedMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { - etcdserver, config, assert := setUp(t) + etcdserver, config, sharedInformers, assert := setUp(t) config.ExtraConfig.APIResourceConfigSource = limitedAPIResourceConfigSource() master, err := config.Complete(sharedInformers).New(genericapiserver.EmptyDelegate) if err != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go index e98f20d1c97..de90cef9068 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go @@ -83,7 +83,7 @@ type ExtraConfig struct { } type Config struct { - GenericConfig *genericapiserver.Config + GenericConfig *genericapiserver.RecommendedConfig ExtraConfig ExtraConfig } diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go index a2dccd5a066..b38d564b8a4 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go @@ -94,7 +94,7 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err return nil, fmt.Errorf("error creating self-signed certificates: %v", err) } - serverConfig := genericapiserver.NewConfig(apiserver.Codecs) + serverConfig := genericapiserver.NewRecommendedConfig(apiserver.Codecs) if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil { return nil, err } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go index c5c593c8c43..5c8efe7cf71 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go @@ -53,7 +53,7 @@ func DefaultServerConfig() (*extensionsapiserver.Config, error) { options.RecommendedOptions.Etcd.StorageConfig.ServerList = []string{etcdURL} options.RecommendedOptions.Etcd.StorageConfig.Prefix = uuid.New() - genericConfig := genericapiserver.NewConfig(extensionsapiserver.Codecs) + genericConfig := genericapiserver.NewRecommendedConfig(extensionsapiserver.Codecs) if err := options.RecommendedOptions.SecureServing.MaybeDefaultWithSelfSignedCerts("localhost", nil, []net.IP{net.ParseIP("127.0.0.1")}); err != nil { return nil, fmt.Errorf("error creating self-signed certificates: %v", err) diff --git a/staging/src/k8s.io/apiserver/pkg/server/config.go b/staging/src/k8s.io/apiserver/pkg/server/config.go index 062c5b3359d..2c459d9b680 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config.go @@ -122,8 +122,6 @@ type Config struct { // Will default to a value based on secure serving info and available ipv4 IPs. ExternalAddress string - // SharedInformerFactory provides shared informers for resources - SharedInformerFactory informers.SharedInformerFactory //=========================================================================== // Fields you probably don't care about changing //=========================================================================== @@ -187,6 +185,13 @@ type Config struct { PublicAddress net.IP } +type RecommendedConfig struct { + Config + + // SharedInformerFactory provides shared informers for resources + SharedInformerFactory informers.SharedInformerFactory +} + type SecureServingInfo struct { // BindAddress is the ip:port to serve on BindAddress string @@ -242,6 +247,13 @@ func NewConfig(codecs serializer.CodecFactory) *Config { } } +// NewRecommendedConfig returns a RecommendedConfig struct with the default values +func NewRecommendedConfig(codecs serializer.CodecFactory) *RecommendedConfig { + return &RecommendedConfig{ + Config: *NewConfig(codecs), + } +} + func DefaultOpenAPIConfig(getDefinitions openapicommon.GetOpenAPIDefinitions, scheme *runtime.Scheme) *openapicommon.Config { defNamer := apiopenapi.NewDefinitionNamer(scheme) return &openapicommon.Config{ @@ -301,6 +313,13 @@ func (c *Config) ApplyClientCert(clientCAFile string) (*Config, error) { type completedConfig struct { *Config + + //=========================================================================== + // values below here are filled in during completion + //=========================================================================== + + // SharedInformerFactory provides shared informers for resources + SharedInformerFactory informers.SharedInformerFactory } type CompletedConfig struct { @@ -310,7 +329,7 @@ type CompletedConfig struct { // Complete fills in any fields not set that are required to have valid data and can be derived // from other fields. If you're going to `ApplyOptions`, do that first. It's mutating the receiver. -func (c *Config) Complete() CompletedConfig { +func (c *Config) Complete(informers informers.SharedInformerFactory) CompletedConfig { if len(c.ExternalAddress) == 0 && c.PublicAddress != nil { hostAndPort := c.PublicAddress.String() if c.ReadWritePort != 0 { @@ -385,7 +404,13 @@ func (c *Config) Complete() CompletedConfig { c.RequestInfoResolver = NewRequestInfoResolver(c) } - return CompletedConfig{&completedConfig{c}} + return CompletedConfig{&completedConfig{c, informers}} +} + +// Complete fills in any fields not set that are required to have valid data and can be derived +// from other fields. If you're going to `ApplyOptions`, do that first. It's mutating the receiver. +func (c *RecommendedConfig) Complete() CompletedConfig { + return c.Config.Complete(c.SharedInformerFactory) } // New creates a new server which logically combines the handling chain with the passed server. diff --git a/staging/src/k8s.io/apiserver/pkg/server/config_test.go b/staging/src/k8s.io/apiserver/pkg/server/config_test.go index 8fd48f1fc68..9f0ac45c5d1 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config_test.go @@ -44,7 +44,6 @@ func TestNewWithDelegate(t *testing.T) { if clientset == nil { t.Fatal("unable to create fake client set") } - delegateConfig.SharedInformerFactory = informers.NewSharedInformerFactory(clientset, delegateConfig.LoopbackClientConfig.Timeout) delegateHealthzCalled := false delegateConfig.HealthzChecks = append(delegateConfig.HealthzChecks, healthz.NamedCheck("delegate-health", func(r *http.Request) error { @@ -52,7 +51,8 @@ func TestNewWithDelegate(t *testing.T) { return fmt.Errorf("delegate failed healthcheck") })) - delegateServer, err := delegateConfig.Complete().New("test", EmptyDelegate) + sharedInformers := informers.NewSharedInformerFactory(clientset, delegateConfig.LoopbackClientConfig.Timeout) + delegateServer, err := delegateConfig.Complete(sharedInformers).New("test", EmptyDelegate) if err != nil { t.Fatal(err) } @@ -73,7 +73,6 @@ func TestNewWithDelegate(t *testing.T) { wrappingConfig.LegacyAPIGroupPrefixes = sets.NewString("/api") wrappingConfig.LoopbackClientConfig = &rest.Config{} wrappingConfig.SwaggerConfig = DefaultSwaggerConfig() - wrappingConfig.SharedInformerFactory = informers.NewSharedInformerFactory(clientset, wrappingConfig.LoopbackClientConfig.Timeout) wrappingHealthzCalled := false wrappingConfig.HealthzChecks = append(wrappingConfig.HealthzChecks, healthz.NamedCheck("wrapping-health", func(r *http.Request) error { @@ -81,7 +80,8 @@ func TestNewWithDelegate(t *testing.T) { return fmt.Errorf("wrapping failed healthcheck") })) - wrappingServer, err := wrappingConfig.Complete().New("test", delegateServer) + sharedInformers = informers.NewSharedInformerFactory(clientset, wrappingConfig.LoopbackClientConfig.Timeout) + wrappingServer, err := wrappingConfig.Complete(sharedInformers).New("test", delegateServer) if err != nil { t.Fatal(err) } diff --git a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver_test.go b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver_test.go index e74fbf10fb8..54a6540fdaf 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver_test.go @@ -96,7 +96,6 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion if clientset == nil { t.Fatal("unable to create fake client set") } - config.SharedInformerFactory = informers.NewSharedInformerFactory(clientset, config.LoopbackClientConfig.Timeout) // TODO restore this test, but right now, eliminate our cycle // config.OpenAPIConfig = DefaultOpenAPIConfig(testGetOpenAPIDefinitions, runtime.NewScheme()) @@ -107,7 +106,8 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion // }, // } config.SwaggerConfig = DefaultSwaggerConfig() - config.Complete() + sharedInformers := informers.NewSharedInformerFactory(clientset, config.LoopbackClientConfig.Timeout) + config.Complete(sharedInformers) return etcdServer, *config, assert.New(t) } @@ -115,7 +115,7 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion func newMaster(t *testing.T) (*GenericAPIServer, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { etcdserver, config, assert := setUp(t) - s, err := config.Complete().New("test", EmptyDelegate) + s, err := config.Complete(nil).New("test", EmptyDelegate) if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } @@ -147,7 +147,7 @@ func TestInstallAPIGroups(t *testing.T) { config.LegacyAPIGroupPrefixes = sets.NewString("/apiPrefix") config.DiscoveryAddresses = discovery.DefaultAddresses{DefaultAddress: "ExternalAddress"} - s, err := config.Complete().New("test", EmptyDelegate) + s, err := config.Complete(nil).New("test", EmptyDelegate) if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } @@ -351,7 +351,7 @@ func TestCustomHandlerChain(t *testing.T) { called = true }) - s, err := config.Complete().New("test", EmptyDelegate) + s, err := config.Complete(nil).New("test", EmptyDelegate) if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } @@ -406,7 +406,7 @@ func TestNotRestRoutesHaveAuth(t *testing.T) { kubeVersion := fakeVersion() config.Version = &kubeVersion - s, err := config.Complete().New("test", EmptyDelegate) + s, err := config.Complete(nil).New("test", EmptyDelegate) if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go index 5604681825f..40c34ce3d3a 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go @@ -24,6 +24,7 @@ import ( "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission/initializer" "k8s.io/apiserver/pkg/server" + "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" ) @@ -63,17 +64,17 @@ func (a *AdmissionOptions) AddFlags(fs *pflag.FlagSet) { // genericconfig.LoopbackClientConfig // genericconfig.SharedInformerFactory // genericconfig.Authorizer -func (a *AdmissionOptions) ApplyTo(serverCfg *server.Config, pluginInitializers ...admission.PluginInitializer) error { +func (a *AdmissionOptions) ApplyTo(c *server.Config, informers informers.SharedInformerFactory, pluginInitializers ...admission.PluginInitializer) error { pluginsConfigProvider, err := admission.ReadAdmissionConfiguration(a.PluginNames, a.ConfigFile) if err != nil { return fmt.Errorf("failed to read plugin config: %v", err) } - clientset, err := kubernetes.NewForConfig(serverCfg.LoopbackClientConfig) + clientset, err := kubernetes.NewForConfig(c.LoopbackClientConfig) if err != nil { return err } - genericInitializer, err := initializer.New(clientset, serverCfg.SharedInformerFactory, serverCfg.Authorizer) + genericInitializer, err := initializer.New(clientset, informers, c.Authorizer) if err != nil { return err } @@ -86,7 +87,7 @@ func (a *AdmissionOptions) ApplyTo(serverCfg *server.Config, pluginInitializers return err } - serverCfg.AdmissionControl = admissionChain + c.AdmissionControl = admissionChain return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go index a0efcb49a52..2cf8f919701 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go @@ -17,11 +17,16 @@ limitations under the License. package options import ( + "fmt" + "time" + "github.com/spf13/pflag" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/storage/storagebackend" + clientgoinformers "k8s.io/client-go/informers" + clientgoclientset "k8s.io/client-go/kubernetes" ) // RecommendedOptions contains the recommended options for running an API server @@ -55,26 +60,33 @@ func (o *RecommendedOptions) AddFlags(fs *pflag.FlagSet) { o.Features.AddFlags(fs) } -func (o *RecommendedOptions) ApplyTo(config *server.Config) error { - if err := o.Etcd.ApplyTo(config); err != nil { +func (o *RecommendedOptions) ApplyTo(config *server.RecommendedConfig) error { + if err := o.Etcd.ApplyTo(&config.Config); err != nil { return err } - if err := o.SecureServing.ApplyTo(config); err != nil { + if err := o.SecureServing.ApplyTo(&config.Config); err != nil { return err } - if err := o.Authentication.ApplyTo(config); err != nil { + if err := o.Authentication.ApplyTo(&config.Config); err != nil { return err } - if err := o.Authorization.ApplyTo(config); err != nil { + if err := o.Authorization.ApplyTo(&config.Config); err != nil { return err } - if err := o.Audit.ApplyTo(config); err != nil { + if err := o.Audit.ApplyTo(&config.Config); err != nil { return err } - if err := o.Features.ApplyTo(config); err != nil { + if err := o.Features.ApplyTo(&config.Config); err != nil { return err } + // do convenience work for RecommendedOptions users + clientgoExternalClient, err := clientgoclientset.NewForConfig(config.LoopbackClientConfig) + if err != nil { + return fmt.Errorf("failed to create real external clientset: %v", err) + } + config.SharedInformerFactory = clientgoinformers.NewSharedInformerFactory(clientgoExternalClient, 10*time.Minute) + return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/serving.go b/staging/src/k8s.io/apiserver/pkg/server/options/serving.go index b21f0002c34..8cd6bfc693f 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/serving.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/serving.go @@ -24,7 +24,6 @@ import ( "net" "path" "strconv" - "time" "github.com/golang/glog" "github.com/pborman/uuid" @@ -33,9 +32,6 @@ import ( utilnet "k8s.io/apimachinery/pkg/util/net" "k8s.io/apiserver/pkg/server" utilflag "k8s.io/apiserver/pkg/util/flag" - "k8s.io/client-go/informers" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" certutil "k8s.io/client-go/util/cert" ) @@ -175,26 +171,6 @@ func (s *SecureServingOptions) ApplyTo(c *server.Config) error { c.SecureServingInfo.SNICerts[server.LoopbackClientServerNameOverride] = &tlsCert } - // create shared informers, if not explicitly set use in cluster config. - // do not fail on an error, this allows an external API server to startup - // outside of a kube cluster. - var clientCfg *rest.Config - err = nil - if s.useLoopbackCfg { - clientCfg = c.LoopbackClientConfig - } else { - clientCfg, err = rest.InClusterConfig() - } - if err != nil { - glog.Errorf("Couldn't create in cluster config due to %v. SharedInformerFactory will not be set.", err) - return nil - } - clientset, err := kubernetes.NewForConfig(clientCfg) - if err != nil { - glog.Errorf("Couldn't create clientset due to %v. SharedInformerFactory will not be set.", err) - return nil - } - c.SharedInformerFactory = informers.NewSharedInformerFactory(clientset, 10*time.Minute) return nil } diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/serving_test.go b/staging/src/k8s.io/apiserver/pkg/server/options/serving_test.go index c70a2ccb4e6..6d41262573a 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/serving_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/serving_test.go @@ -487,7 +487,7 @@ NextTest: return } - s, err := config.Complete().New("test", server.EmptyDelegate) + s, err := config.Complete(nil).New("test", server.EmptyDelegate) if err != nil { t.Errorf("%q - failed creating the server: %v", title, err) return diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go index 1fff050c193..a85794e166d 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go @@ -88,7 +88,7 @@ type ExtraConfig struct { } type Config struct { - GenericConfig *genericapiserver.Config + GenericConfig *genericapiserver.RecommendedConfig ExtraConfig ExtraConfig } diff --git a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go index d5214d7a6ea..b5cc1e20826 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go @@ -118,7 +118,7 @@ func (o AggregatorOptions) RunAggregator(stopCh <-chan struct{}) error { return fmt.Errorf("error creating self-signed certificates: %v", err) } - serverConfig := genericapiserver.NewConfig(apiserver.Codecs) + serverConfig := genericapiserver.NewRecommendedConfig(apiserver.Codecs) if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil { return err diff --git a/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go b/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go index c6c0f36ccf4..e36dc1360ae 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go @@ -30,7 +30,6 @@ import ( "k8s.io/sample-apiserver/pkg/apis/wardle" "k8s.io/sample-apiserver/pkg/apis/wardle/install" "k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1" - informers "k8s.io/sample-apiserver/pkg/client/informers_generated/internalversion" wardleregistry "k8s.io/sample-apiserver/pkg/registry" fischerstorage "k8s.io/sample-apiserver/pkg/registry/wardle/fischer" flunderstorage "k8s.io/sample-apiserver/pkg/registry/wardle/flunder" @@ -66,7 +65,7 @@ type ExtraConfig struct { } type Config struct { - GenericConfig *genericapiserver.Config + GenericConfig *genericapiserver.RecommendedConfig ExtraConfig ExtraConfig } diff --git a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go index 7ebc41e187e..8bdeb19e1b5 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go @@ -104,7 +104,7 @@ func (o WardleServerOptions) Config() (*apiserver.Config, error) { return nil, fmt.Errorf("error creating self-signed certificates: %v", err) } - serverConfig := genericapiserver.NewConfig(apiserver.Codecs) + serverConfig := genericapiserver.NewRecommendedConfig(apiserver.Codecs) if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil { return nil, err } @@ -119,7 +119,7 @@ func (o WardleServerOptions) Config() (*apiserver.Config, error) { return nil, err } - if err := o.Admission.ApplyTo(serverConfig, admissionInitializer); err != nil { + if err := o.Admission.ApplyTo(&serverConfig.Config, serverConfig.SharedInformerFactory, admissionInitializer); err != nil { return nil, err } diff --git a/test/integration/etcd/etcd_storage_path_test.go b/test/integration/etcd/etcd_storage_path_test.go index 41d96532168..b631514ab3d 100644 --- a/test/integration/etcd/etcd_storage_path_test.go +++ b/test/integration/etcd/etcd_storage_path_test.go @@ -685,14 +685,14 @@ func startRealMasterOrDie(t *testing.T, certDir string) (*allClient, clientv3.KV if err != nil { t.Fatal(err) } - kubeAPIServerConfig, sharedInformers, _, _, _, err := app.CreateKubeAPIServerConfig(kubeAPIServerOptions, tunneler, proxyTransport) + kubeAPIServerConfig, sharedInformers, versionedInformers, _, _, err := app.CreateKubeAPIServerConfig(kubeAPIServerOptions, tunneler, proxyTransport) if err != nil { t.Fatal(err) } kubeAPIServerConfig.ExtraConfig.APIResourceConfigSource = &allResourceSource{} // force enable all resources - kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, genericapiserver.EmptyDelegate, sharedInformers) + kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, genericapiserver.EmptyDelegate, sharedInformers, versionedInformers) if err != nil { t.Fatal(err) } diff --git a/test/integration/examples/apiserver_test.go b/test/integration/examples/apiserver_test.go index 671f4cc84a2..a36b30c0ac7 100644 --- a/test/integration/examples/apiserver_test.go +++ b/test/integration/examples/apiserver_test.go @@ -116,13 +116,13 @@ func TestAggregatedAPIServer(t *testing.T) { if err != nil { t.Fatal(err) } - kubeAPIServerConfig, sharedInformers, _, _, _, err := app.CreateKubeAPIServerConfig(kubeAPIServerOptions, tunneler, proxyTransport) + kubeAPIServerConfig, sharedInformers, versionedInformers, _, _, err := app.CreateKubeAPIServerConfig(kubeAPIServerOptions, tunneler, proxyTransport) if err != nil { t.Fatal(err) } kubeClientConfigValue.Store(kubeAPIServerConfig.GenericConfig.LoopbackClientConfig) - kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, genericapiserver.EmptyDelegate, sharedInformers) + kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, genericapiserver.EmptyDelegate, sharedInformers, versionedInformers) if err != nil { t.Fatal(err) } diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index d279812c03c..235d692a302 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -248,9 +248,9 @@ func startMasterOrDie(masterConfig *master.Config, incomingServer *httptest.Serv if err != nil { glog.Fatal(err) } - masterConfig.GenericConfig.SharedInformerFactory = extinformers.NewSharedInformerFactory(clientset, masterConfig.GenericConfig.LoopbackClientConfig.Timeout) - m, err = masterConfig.Complete().New(genericapiserver.EmptyDelegate) + sharedInformers := extinformers.NewSharedInformerFactory(clientset, masterConfig.GenericConfig.LoopbackClientConfig.Timeout) + m, err = masterConfig.Complete(sharedInformers).New(genericapiserver.EmptyDelegate) if err != nil { closeFn() glog.Fatalf("error in bringing up the master: %v", err)