diff --git a/cmd/kube-apiserver/app/aggregator.go b/cmd/kube-apiserver/app/aggregator.go index 2fc6944957f..1c31d537e9e 100644 --- a/cmd/kube-apiserver/app/aggregator.go +++ b/cmd/kube-apiserver/app/aggregator.go @@ -77,11 +77,13 @@ func createAggregatorConfig(kubeAPIServerConfig genericapiserver.Config, command aggregatorConfig := &aggregatorapiserver.Config{ GenericConfig: &genericConfig, - CoreKubeInformers: externalInformers, - ProxyClientCert: certBytes, - ProxyClientKey: keyBytes, - ServiceResolver: serviceResolver, - ProxyTransport: proxyTransport, + ExtraConfig: aggregatorapiserver.ExtraConfig{ + CoreKubeInformers: externalInformers, + ProxyClientCert: certBytes, + ProxyClientKey: keyBytes, + ServiceResolver: serviceResolver, + ProxyTransport: proxyTransport, + }, } return aggregatorConfig, nil diff --git a/cmd/kube-apiserver/app/apiextensions.go b/cmd/kube-apiserver/app/apiextensions.go index 5c0b19f1ece..1d2697cab66 100644 --- a/cmd/kube-apiserver/app/apiextensions.go +++ b/cmd/kube-apiserver/app/apiextensions.go @@ -41,11 +41,12 @@ func createAPIExtensionsConfig(kubeAPIServerConfig genericapiserver.Config, comm apiextensionsConfig := &apiextensionsapiserver.Config{ GenericConfig: &genericConfig, - CRDRESTOptionsGetter: apiextensionscmd.NewCRDRESTOptionsGetter(etcdOptions), + ExtraConfig: apiextensionsapiserver.ExtraConfig{ + CRDRESTOptionsGetter: apiextensionscmd.NewCRDRESTOptionsGetter(etcdOptions), + }, } return apiextensionsConfig, nil - } func createAPIExtensionsServer(apiextensionsConfig *apiextensionsapiserver.Config, delegateAPIServer genericapiserver.DelegationTarget) (*apiextensionsapiserver.CustomResourceDefinitions, error) { diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index fae0ef9f80e..1923512000c 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -172,8 +172,8 @@ func CreateServerChain(runOptions *options.ServerRunOptions, stopCh <-chan struc if err != nil { return nil, err } - aggregatorConfig.ProxyTransport = proxyTransport - aggregatorConfig.ServiceResolver = serviceResolver + aggregatorConfig.ExtraConfig.ProxyTransport = proxyTransport + aggregatorConfig.ExtraConfig.ServiceResolver = serviceResolver aggregatorServer, err := createAggregatorServer(aggregatorConfig, kubeAPIServer.GenericAPIServer, apiExtensionsServer.Informers) if err != nil { // we don't need special handling for innerStopCh because the aggregator server doesn't create any go routines @@ -312,40 +312,41 @@ func CreateKubeAPIServerConfig(s *options.ServerRunOptions, nodeTunneler tunnele config := &master.Config{ GenericConfig: genericConfig, + ExtraConfig: master.ExtraConfig{ + ClientCARegistrationHook: master.ClientCARegistrationHook{ + ClientCA: clientCA, + RequestHeaderUsernameHeaders: s.Authentication.RequestHeader.UsernameHeaders, + RequestHeaderGroupHeaders: s.Authentication.RequestHeader.GroupHeaders, + RequestHeaderExtraHeaderPrefixes: s.Authentication.RequestHeader.ExtraHeaderPrefixes, + RequestHeaderCA: requestHeaderProxyCA, + RequestHeaderAllowedNames: s.Authentication.RequestHeader.AllowedNames, + }, - ClientCARegistrationHook: master.ClientCARegistrationHook{ - ClientCA: clientCA, - RequestHeaderUsernameHeaders: s.Authentication.RequestHeader.UsernameHeaders, - RequestHeaderGroupHeaders: s.Authentication.RequestHeader.GroupHeaders, - RequestHeaderExtraHeaderPrefixes: s.Authentication.RequestHeader.ExtraHeaderPrefixes, - RequestHeaderCA: requestHeaderProxyCA, - RequestHeaderAllowedNames: s.Authentication.RequestHeader.AllowedNames, + APIResourceConfigSource: storageFactory.APIResourceConfigSource, + StorageFactory: storageFactory, + EnableCoreControllers: true, + EventTTL: s.EventTTL, + KubeletClientConfig: s.KubeletConfig, + EnableUISupport: true, + EnableLogsSupport: s.EnableLogsHandler, + ProxyTransport: proxyTransport, + + Tunneler: nodeTunneler, + + ServiceIPRange: serviceIPRange, + APIServerServiceIP: apiServerServiceIP, + APIServerServicePort: 443, + + ServiceNodePortRange: s.ServiceNodePortRange, + KubernetesServiceNodePort: s.KubernetesServiceNodePort, + + MasterCount: s.MasterCount, }, - - APIResourceConfigSource: storageFactory.APIResourceConfigSource, - StorageFactory: storageFactory, - EnableCoreControllers: true, - EventTTL: s.EventTTL, - KubeletClientConfig: s.KubeletConfig, - EnableUISupport: true, - EnableLogsSupport: s.EnableLogsHandler, - ProxyTransport: proxyTransport, - - Tunneler: nodeTunneler, - - ServiceIPRange: serviceIPRange, - APIServerServiceIP: apiServerServiceIP, - APIServerServicePort: 443, - - ServiceNodePortRange: s.ServiceNodePortRange, - KubernetesServiceNodePort: s.KubernetesServiceNodePort, - - MasterCount: s.MasterCount, } if nodeTunneler != nil { // Use the nodeTunneler's dialer to connect to the kubelet - config.KubeletClientConfig.Dial = nodeTunneler.Dial + config.ExtraConfig.KubeletClientConfig.Dial = nodeTunneler.Dial } return config, sharedInformers, versionedInformers, insecureServingOptions, serviceResolver, nil diff --git a/pkg/master/controller.go b/pkg/master/controller.go index 0e922e17b82..085687b13ca 100644 --- a/pkg/master/controller.go +++ b/pkg/master/controller.go @@ -82,28 +82,28 @@ func (c *Config) NewBootstrapController(legacyRESTStorage corerest.LegacyRESTSto ServiceClient: serviceClient, NamespaceClient: nsClient, - EndpointReconciler: c.EndpointReconcilerConfig.Reconciler, - EndpointInterval: c.EndpointReconcilerConfig.Interval, + EndpointReconciler: c.ExtraConfig.EndpointReconcilerConfig.Reconciler, + EndpointInterval: c.ExtraConfig.EndpointReconcilerConfig.Interval, SystemNamespaces: []string{metav1.NamespaceSystem, metav1.NamespacePublic}, SystemNamespacesInterval: 1 * time.Minute, ServiceClusterIPRegistry: legacyRESTStorage.ServiceClusterIPAllocator, - ServiceClusterIPRange: c.ServiceIPRange, + ServiceClusterIPRange: c.ExtraConfig.ServiceIPRange, ServiceClusterIPInterval: 3 * time.Minute, ServiceNodePortRegistry: legacyRESTStorage.ServiceNodePortAllocator, - ServiceNodePortRange: c.ServiceNodePortRange, + ServiceNodePortRange: c.ExtraConfig.ServiceNodePortRange, ServiceNodePortInterval: 3 * time.Minute, PublicIP: c.GenericConfig.PublicAddress, - ServiceIP: c.APIServerServiceIP, - ServicePort: c.APIServerServicePort, - ExtraServicePorts: c.ExtraServicePorts, - ExtraEndpointPorts: c.ExtraEndpointPorts, + ServiceIP: c.ExtraConfig.APIServerServiceIP, + ServicePort: c.ExtraConfig.APIServerServicePort, + ExtraServicePorts: c.ExtraConfig.ExtraServicePorts, + ExtraEndpointPorts: c.ExtraConfig.ExtraEndpointPorts, PublicServicePort: c.GenericConfig.ReadWritePort, - KubernetesServiceNodePort: c.KubernetesServiceNodePort, + KubernetesServiceNodePort: c.ExtraConfig.KubernetesServiceNodePort, } } diff --git a/pkg/master/master.go b/pkg/master/master.go index e5d5420fd59..ba3365de675 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -85,9 +85,7 @@ const ( DefaultEndpointReconcilerInterval = 10 * time.Second ) -type Config struct { - GenericConfig *genericapiserver.Config - +type ExtraConfig struct { ClientCARegistrationHook ClientCARegistrationHook APIResourceConfigSource serverstorage.APIResourceConfigSource @@ -135,6 +133,11 @@ type Config struct { MasterCount int } +type Config struct { + GenericConfig *genericapiserver.Config + ExtraConfig ExtraConfig +} + // EndpointReconcilerConfig holds the endpoint reconciler and endpoint reconciliation interval to be // used by the master. type EndpointReconcilerConfig struct { @@ -157,42 +160,42 @@ type completedConfig struct { func (c *Config) Complete() completedConfig { c.GenericConfig.Complete() - serviceIPRange, apiServerServiceIP, err := DefaultServiceIPRange(c.ServiceIPRange) + serviceIPRange, apiServerServiceIP, err := DefaultServiceIPRange(c.ExtraConfig.ServiceIPRange) if err != nil { glog.Fatalf("Error determining service IP ranges: %v", err) } - if c.ServiceIPRange.IP == nil { - c.ServiceIPRange = serviceIPRange + if c.ExtraConfig.ServiceIPRange.IP == nil { + c.ExtraConfig.ServiceIPRange = serviceIPRange } - if c.APIServerServiceIP == nil { - c.APIServerServiceIP = apiServerServiceIP + if c.ExtraConfig.APIServerServiceIP == nil { + c.ExtraConfig.APIServerServiceIP = apiServerServiceIP } discoveryAddresses := discovery.DefaultAddresses{DefaultAddress: c.GenericConfig.ExternalAddress} discoveryAddresses.CIDRRules = append(discoveryAddresses.CIDRRules, - discovery.CIDRRule{IPRange: c.ServiceIPRange, Address: net.JoinHostPort(c.APIServerServiceIP.String(), strconv.Itoa(c.APIServerServicePort))}) + discovery.CIDRRule{IPRange: c.ExtraConfig.ServiceIPRange, Address: net.JoinHostPort(c.ExtraConfig.APIServerServiceIP.String(), strconv.Itoa(c.ExtraConfig.APIServerServicePort))}) c.GenericConfig.DiscoveryAddresses = discoveryAddresses - if c.ServiceNodePortRange.Size == 0 { + if c.ExtraConfig.ServiceNodePortRange.Size == 0 { // TODO: Currently no way to specify an empty range (do we need to allow this?) // We should probably allow this for clouds that don't require NodePort to do load-balancing (GCE) // but then that breaks the strict nestedness of ServiceType. // Review post-v1 - c.ServiceNodePortRange = options.DefaultServiceNodePortRange - glog.Infof("Node port range unspecified. Defaulting to %v.", c.ServiceNodePortRange) + c.ExtraConfig.ServiceNodePortRange = options.DefaultServiceNodePortRange + glog.Infof("Node port range unspecified. Defaulting to %v.", c.ExtraConfig.ServiceNodePortRange) } // enable swagger UI only if general UI support is on - c.GenericConfig.EnableSwaggerUI = c.GenericConfig.EnableSwaggerUI && c.EnableUISupport + c.GenericConfig.EnableSwaggerUI = c.GenericConfig.EnableSwaggerUI && c.ExtraConfig.EnableUISupport - if c.EndpointReconcilerConfig.Interval == 0 { - c.EndpointReconcilerConfig.Interval = DefaultEndpointReconcilerInterval + if c.ExtraConfig.EndpointReconcilerConfig.Interval == 0 { + c.ExtraConfig.EndpointReconcilerConfig.Interval = DefaultEndpointReconcilerInterval } - if c.EndpointReconcilerConfig.Reconciler == nil { + if c.ExtraConfig.EndpointReconcilerConfig.Reconciler == nil { // use a default endpoint reconciler if nothing is set endpointClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) - c.EndpointReconcilerConfig.Reconciler = NewMasterCountEndpointReconciler(c.MasterCount, endpointClient) + c.ExtraConfig.EndpointReconcilerConfig.Reconciler = NewMasterCountEndpointReconciler(c.ExtraConfig.MasterCount, endpointClient) } // this has always been hardcoded true in the past @@ -211,7 +214,7 @@ func (c *Config) SkipComplete() completedConfig { // Certain config fields must be specified, including: // KubeletClientConfig func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*Master, error) { - if reflect.DeepEqual(c.KubeletClientConfig, kubeletclient.KubeletClientConfig{}) { + if reflect.DeepEqual(c.ExtraConfig.KubeletClientConfig, kubeletclient.KubeletClientConfig{}) { return nil, fmt.Errorf("Master.New() called with empty config.KubeletClientConfig") } @@ -220,10 +223,10 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) return nil, err } - if c.EnableUISupport { + if c.ExtraConfig.EnableUISupport { routes.UIRedirect{}.Install(s.Handler.NonGoRestfulMux) } - if c.EnableLogsSupport { + if c.ExtraConfig.EnableLogsSupport { routes.Logs{}.Install(s.Handler.GoRestfulContainer) } @@ -232,14 +235,14 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) } // install legacy rest storage - if c.APIResourceConfigSource.AnyResourcesForVersionEnabled(apiv1.SchemeGroupVersion) { + if c.ExtraConfig.APIResourceConfigSource.AnyResourcesForVersionEnabled(apiv1.SchemeGroupVersion) { legacyRESTStorageProvider := corerest.LegacyRESTStorageProvider{ - StorageFactory: c.StorageFactory, - ProxyTransport: c.ProxyTransport, - KubeletClientConfig: c.KubeletClientConfig, - EventTTL: c.EventTTL, - ServiceIPRange: c.ServiceIPRange, - ServiceNodePortRange: c.ServiceNodePortRange, + StorageFactory: c.ExtraConfig.StorageFactory, + ProxyTransport: c.ExtraConfig.ProxyTransport, + KubeletClientConfig: c.ExtraConfig.KubeletClientConfig, + EventTTL: c.ExtraConfig.EventTTL, + ServiceIPRange: c.ExtraConfig.ServiceIPRange, + ServiceNodePortRange: c.ExtraConfig.ServiceNodePortRange, LoopbackClientConfig: c.GenericConfig.LoopbackClientConfig, } m.InstallLegacyAPI(c.Config, c.Config.GenericConfig.RESTOptionsGetter, legacyRESTStorageProvider) @@ -270,13 +273,13 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) appsrest.RESTStorageProvider{}, admissionregistrationrest.RESTStorageProvider{}, } - m.InstallAPIs(c.Config.APIResourceConfigSource, c.Config.GenericConfig.RESTOptionsGetter, restStorageProviders...) + m.InstallAPIs(c.ExtraConfig.APIResourceConfigSource, c.GenericConfig.RESTOptionsGetter, restStorageProviders...) - if c.Tunneler != nil { - m.installTunneler(c.Tunneler, corev1client.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes()) + if c.ExtraConfig.Tunneler != nil { + m.installTunneler(c.ExtraConfig.Tunneler, corev1client.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes()) } - m.GenericAPIServer.AddPostStartHookOrDie("ca-registration", c.ClientCARegistrationHook.PostStartHook) + m.GenericAPIServer.AddPostStartHookOrDie("ca-registration", c.ExtraConfig.ClientCARegistrationHook.PostStartHook) return m, nil } @@ -287,7 +290,7 @@ func (m *Master) InstallLegacyAPI(c *Config, restOptionsGetter generic.RESTOptio glog.Fatalf("Error building core storage: %v", err) } - if c.EnableCoreControllers { + if c.ExtraConfig.EnableCoreControllers { coreClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) bootstrapController := c.NewBootstrapController(legacyRESTStorage, coreClient, coreClient) m.GenericAPIServer.AddPostStartHookOrDie("bootstrap-controller", bootstrapController.PostStartHook) diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index 8c3bc7ca89f..89f2b2ae22b 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -71,9 +71,11 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion config := &Config{ GenericConfig: genericapiserver.NewConfig(api.Codecs), - APIResourceConfigSource: DefaultAPIResourceConfigSource(), - APIServerServicePort: 443, - MasterCount: 1, + ExtraConfig: ExtraConfig{ + APIResourceConfigSource: DefaultAPIResourceConfigSource(), + APIServerServicePort: 443, + MasterCount: 1, + }, } resourceEncoding := serverstorage.NewDefaultResourceEncodingConfig(api.Registry) @@ -95,16 +97,16 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion kubeVersion := kubeversion.Get() config.GenericConfig.Version = &kubeVersion - config.StorageFactory = storageFactory + config.ExtraConfig.StorageFactory = storageFactory config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4") config.GenericConfig.LegacyAPIGroupPrefixes = sets.NewString("/api") config.GenericConfig.RequestContextMapper = genericapirequest.NewRequestContextMapper() config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.EnableMetrics = true - config.EnableCoreControllers = false - config.KubeletClientConfig = kubeletclient.KubeletClientConfig{Port: 10250} - config.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{ + config.ExtraConfig.EnableCoreControllers = false + config.ExtraConfig.KubeletClientConfig = kubeletclient.KubeletClientConfig{Port: 10250} + config.ExtraConfig.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{ Dial: func(network, addr string) (net.Conn, error) { return nil, nil }, TLSClientConfig: &tls.Config{}, }) @@ -126,12 +128,12 @@ func TestLegacyRestStorageStrategies(t *testing.T) { defer etcdserver.Terminate(t) storageProvider := corerest.LegacyRESTStorageProvider{ - StorageFactory: masterCfg.StorageFactory, - ProxyTransport: masterCfg.ProxyTransport, - KubeletClientConfig: masterCfg.KubeletClientConfig, - EventTTL: masterCfg.EventTTL, - ServiceIPRange: masterCfg.ServiceIPRange, - ServiceNodePortRange: masterCfg.ServiceNodePortRange, + StorageFactory: masterCfg.ExtraConfig.StorageFactory, + ProxyTransport: masterCfg.ExtraConfig.ProxyTransport, + KubeletClientConfig: masterCfg.ExtraConfig.KubeletClientConfig, + EventTTL: masterCfg.ExtraConfig.EventTTL, + ServiceIPRange: masterCfg.ExtraConfig.ServiceIPRange, + ServiceNodePortRange: masterCfg.ExtraConfig.ServiceNodePortRange, LoopbackClientConfig: masterCfg.GenericConfig.LoopbackClientConfig, } @@ -162,7 +164,7 @@ func TestCertificatesRestStorageStrategies(t *testing.T) { defer etcdserver.Terminate(t) certStorageProvider := certificatesrest.RESTStorageProvider{} - apiGroupInfo, _ := certStorageProvider.NewRESTStorage(masterCfg.APIResourceConfigSource, masterCfg.GenericConfig.RESTOptionsGetter) + apiGroupInfo, _ := certStorageProvider.NewRESTStorage(masterCfg.ExtraConfig.APIResourceConfigSource, masterCfg.GenericConfig.RESTOptionsGetter) exceptions := registrytest.StrategyExceptions{ HasExportStrategy: []string{ @@ -205,8 +207,8 @@ 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) - config.APIResourceConfigSource = limitedAPIResourceConfigSource() - master, err := config.Complete().New(genericapiserver.EmptyDelegate) + config.ExtraConfig.APIResourceConfigSource = limitedAPIResourceConfigSource() + master, err := config.Complete(sharedInformers).New(genericapiserver.EmptyDelegate) if err != nil { t.Fatalf("Error in bringing up the master: %v", err) } 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 1d1409d9a4d..b5b659a643b 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go @@ -78,10 +78,14 @@ func init() { Scheme.AddUnversionedTypes(unversionedVersion, unversionedTypes...) } +type ExtraConfig struct { + CRDRESTOptionsGetter genericregistry.RESTOptionsGetter +} type Config struct { GenericConfig *genericapiserver.Config + ExtraConfig ExtraConfig +} - CRDRESTOptionsGetter genericregistry.RESTOptionsGetter } type CustomResourceDefinitions struct { @@ -173,7 +177,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions().Lister(), s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), delegateHandler, - c.CRDRESTOptionsGetter, + c.ExtraConfig.CRDRESTOptionsGetter, c.GenericConfig.AdmissionControl, ) s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", crdHandler) 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 38c266e7073..a2dccd5a066 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 @@ -100,8 +100,10 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err } config := &apiserver.Config{ - GenericConfig: serverConfig, - CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd), + GenericConfig: serverConfig, + ExtraConfig: apiserver.ExtraConfig{ + CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd), + }, } return config, nil } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/registration_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/registration_test.go index a9bab6aec2a..a72ce2dcf9e 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/registration_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/registration_test.go @@ -457,7 +457,7 @@ func TestEtcdStorage(t *testing.T) { } func getPrefixFromConfig(t *testing.T, config *extensionsapiserver.Config) string { - extensionsOptionsGetter, ok := config.CRDRESTOptionsGetter.(extensionsapiserver.CRDRESTOptionsGetter) + extensionsOptionsGetter, ok := config.ExtraConfig.CRDRESTOptionsGetter.(extensionsapiserver.CRDRESTOptionsGetter) if !ok { t.Fatal("can't obtain etcd prefix: unable to cast config.CRDRESTOptionsGetter to extensionsapiserver.CRDRESTOptionsGetter") } 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 de23379c068..2c83a9335c1 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 @@ -88,8 +88,10 @@ func DefaultServerConfig() (*extensionsapiserver.Config, error) { customResourceDefinitionRESTOptionsGetter.StorageConfig.Copier = extensionsapiserver.UnstructuredCopier{} config := &extensionsapiserver.Config{ - GenericConfig: genericConfig, - CRDRESTOptionsGetter: customResourceDefinitionRESTOptionsGetter, + GenericConfig: genericConfig, + ExtraConfig: extensionsapiserver.ExtraConfig{ + CRDRESTOptionsGetter: customResourceDefinitionRESTOptionsGetter, + }, } return config, nil 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 65873c88e0c..bdf55a9688f 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go @@ -70,9 +70,7 @@ func init() { // legacyAPIServiceName is the fixed name of the only non-groupified API version const legacyAPIServiceName = "v1." -type Config struct { - GenericConfig *genericapiserver.Config - +type ExtraConfig struct { // CoreKubeInformers is used to watch kube resources CoreKubeInformers kubeinformers.SharedInformerFactory @@ -89,6 +87,11 @@ type Config struct { ServiceResolver ServiceResolver } +type Config struct { + GenericConfig *genericapiserver.RecommendedConfig + ExtraConfig ExtraConfig +} + // APIAggregator contains state for a Kubernetes cluster master/api server. type APIAggregator struct { GenericAPIServer *genericapiserver.GenericAPIServer @@ -168,14 +171,14 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg GenericAPIServer: genericServer, delegateHandler: delegationTarget.UnprotectedHandler(), contextMapper: c.GenericConfig.RequestContextMapper, - proxyClientCert: c.ProxyClientCert, - proxyClientKey: c.ProxyClientKey, - proxyTransport: c.ProxyTransport, + proxyClientCert: c.ExtraConfig.ProxyClientCert, + proxyClientKey: c.ExtraConfig.ProxyClientKey, + proxyTransport: c.ExtraConfig.ProxyTransport, proxyHandlers: map[string]*proxyHandler{}, handledGroups: sets.String{}, lister: informerFactory.Apiregistration().InternalVersion().APIServices().Lister(), APIRegistrationInformers: informerFactory, - serviceResolver: c.ServiceResolver, + serviceResolver: c.ExtraConfig.ServiceResolver, } apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName, registry, Scheme, metav1.ParameterCodec, Codecs) @@ -198,17 +201,17 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", apisHandler) s.GenericAPIServer.Handler.NonGoRestfulMux.UnlistedHandle("/apis/", apisHandler) - apiserviceRegistrationController := NewAPIServiceRegistrationController(informerFactory.Apiregistration().InternalVersion().APIServices(), c.CoreKubeInformers.Core().V1().Services(), s) + apiserviceRegistrationController := NewAPIServiceRegistrationController(informerFactory.Apiregistration().InternalVersion().APIServices(), c.ExtraConfig.CoreKubeInformers.Core().V1().Services(), s) availableController := statuscontrollers.NewAvailableConditionController( informerFactory.Apiregistration().InternalVersion().APIServices(), - c.CoreKubeInformers.Core().V1().Services(), - c.CoreKubeInformers.Core().V1().Endpoints(), + c.ExtraConfig.CoreKubeInformers.Core().V1().Services(), + c.ExtraConfig.CoreKubeInformers.Core().V1().Endpoints(), apiregistrationClient.Apiregistration(), ) s.GenericAPIServer.AddPostStartHook("start-kube-aggregator-informers", func(context genericapiserver.PostStartHookContext) error { informerFactory.Start(context.StopCh) - c.CoreKubeInformers.Start(context.StopCh) + c.ExtraConfig.CoreKubeInformers.Start(context.StopCh) return nil }) s.GenericAPIServer.AddPostStartHook("apiservice-registration-controller", func(context genericapiserver.PostStartHookContext) error { 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 1db47144b33..d5214d7a6ea 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 @@ -151,16 +151,18 @@ func (o AggregatorOptions) RunAggregator(stopCh <-chan struct{}) error { serviceResolver := apiserver.NewClusterIPServiceResolver(kubeInformers.Core().V1().Services().Lister()) config := apiserver.Config{ - GenericConfig: serverConfig, - CoreKubeInformers: kubeInformers, - ServiceResolver: serviceResolver, + GenericConfig: serverConfig, + ExtraConfig: apiserver.ExtraConfig{ + CoreKubeInformers: kubeInformers, + ServiceResolver: serviceResolver, + }, } - config.ProxyClientCert, err = ioutil.ReadFile(o.ProxyClientCertFile) + config.ExtraConfig.ProxyClientCert, err = ioutil.ReadFile(o.ProxyClientCertFile) if err != nil { return err } - config.ProxyClientKey, err = ioutil.ReadFile(o.ProxyClientKeyFile) + config.ExtraConfig.ProxyClientKey, err = ioutil.ReadFile(o.ProxyClientKeyFile) if 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 33ebf143c6a..32b3acfa2c1 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/apiserver/apiserver.go @@ -61,10 +61,15 @@ func init() { ) } +type ExtraConfig struct { + // Place you custom config here. +} + type Config struct { GenericConfig *genericapiserver.Config // SharedInformerFactory provides shared informers for resources SharedInformerFactory informers.SharedInformerFactory + ExtraConfig ExtraConfig } // WardleServer contains state for a Kubernetes cluster master/api server. 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 916ac18f4de..69b2aad9871 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 @@ -126,6 +126,7 @@ func (o WardleServerOptions) Config() (*apiserver.Config, error) { config := &apiserver.Config{ GenericConfig: serverConfig, SharedInformerFactory: informerFactory, + ExtraConfig: apiserver.ExtraConfig{}, } return config, nil } diff --git a/test/integration/apiserver/apiserver_test.go b/test/integration/apiserver/apiserver_test.go index 33d0cb1a994..5fc84d0ab7a 100644 --- a/test/integration/apiserver/apiserver_test.go +++ b/test/integration/apiserver/apiserver_test.go @@ -44,7 +44,7 @@ import ( func setup(t *testing.T) (*httptest.Server, clientset.Interface, framework.CloseFunc) { masterConfig := framework.NewIntegrationTestMasterConfig() - masterConfig.EnableCoreControllers = false + masterConfig.ExtraConfig.EnableCoreControllers = false _, s, closeFn := framework.RunAMaster(masterConfig) clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL}) diff --git a/test/integration/auth/rbac_test.go b/test/integration/auth/rbac_test.go index 58093392b0b..f1bf44c3470 100644 --- a/test/integration/auth/rbac_test.go +++ b/test/integration/auth/rbac_test.go @@ -75,7 +75,7 @@ type testRESTOptionsGetter struct { } func (getter *testRESTOptionsGetter) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { - storageConfig, err := getter.config.StorageFactory.NewConfig(resource) + storageConfig, err := getter.config.ExtraConfig.StorageFactory.NewConfig(resource) if err != nil { return generic.RESTOptions{}, fmt.Errorf("failed to get storage: %v", err) } diff --git a/test/integration/etcd/etcd_storage_path_test.go b/test/integration/etcd/etcd_storage_path_test.go index 96b85aec5f2..41d96532168 100644 --- a/test/integration/etcd/etcd_storage_path_test.go +++ b/test/integration/etcd/etcd_storage_path_test.go @@ -690,7 +690,7 @@ func startRealMasterOrDie(t *testing.T, certDir string) (*allClient, clientv3.KV t.Fatal(err) } - kubeAPIServerConfig.APIResourceConfigSource = &allResourceSource{} // force enable all resources + kubeAPIServerConfig.ExtraConfig.APIResourceConfigSource = &allResourceSource{} // force enable all resources kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, genericapiserver.EmptyDelegate, sharedInformers) if err != nil { diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index 9577cdce550..d279812c03c 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -357,22 +357,24 @@ func NewMasterConfig() *master.Config { } return &master.Config{ - GenericConfig: genericConfig, - APIResourceConfigSource: master.DefaultAPIResourceConfigSource(), - StorageFactory: storageFactory, - EnableCoreControllers: true, - KubeletClientConfig: kubeletclient.KubeletClientConfig{Port: 10250}, - APIServerServicePort: 443, - MasterCount: 1, + GenericConfig: genericConfig, + ExtraConfig: master.ExtraConfig{ + APIResourceConfigSource: master.DefaultAPIResourceConfigSource(), + StorageFactory: storageFactory, + EnableCoreControllers: true, + KubeletClientConfig: kubeletclient.KubeletClientConfig{Port: 10250}, + APIServerServicePort: 443, + MasterCount: 1, + }, } } // Returns the master config appropriate for most integration tests. func NewIntegrationTestMasterConfig() *master.Config { masterConfig := NewMasterConfig() - masterConfig.EnableCoreControllers = true + masterConfig.ExtraConfig.EnableCoreControllers = true masterConfig.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4") - masterConfig.APIResourceConfigSource = master.DefaultAPIResourceConfigSource() + masterConfig.ExtraConfig.APIResourceConfigSource = master.DefaultAPIResourceConfigSource() return masterConfig } diff --git a/test/integration/master/master_test.go b/test/integration/master/master_test.go index 22dda4b4b23..3355192e69b 100644 --- a/test/integration/master/master_test.go +++ b/test/integration/master/master_test.go @@ -548,7 +548,7 @@ func TestServiceAlloc(t *testing.T) { if err != nil { t.Fatalf("bad cidr: %v", err) } - cfg.ServiceIPRange = *cidr + cfg.ExtraConfig.ServiceIPRange = *cidr _, s, closeFn := framework.RunAMaster(cfg) defer closeFn() diff --git a/test/integration/openshift/openshift_test.go b/test/integration/openshift/openshift_test.go index a29b1a55b16..40b62455b72 100644 --- a/test/integration/openshift/openshift_test.go +++ b/test/integration/openshift/openshift_test.go @@ -30,9 +30,11 @@ func TestMasterExportsSymbols(t *testing.T) { GenericConfig: &genericapiserver.Config{ EnableMetrics: true, }, - EnableCoreControllers: false, - EnableUISupport: false, - EnableLogsSupport: false, + ExtraConfig: master.ExtraConfig{ + EnableCoreControllers: false, + EnableUISupport: false, + EnableLogsSupport: false, + }, } _ = &master.Master{ GenericAPIServer: &genericapiserver.GenericAPIServer{},