apiserver: separate apiserver specific configs into ExtraConfig

This commit is contained in:
Dr. Stefan Schimanski 2017-09-06 17:46:05 +02:00
parent eda3db550b
commit 7d09148ad7
20 changed files with 165 additions and 133 deletions

View File

@ -77,11 +77,13 @@ func createAggregatorConfig(kubeAPIServerConfig genericapiserver.Config, command
aggregatorConfig := &aggregatorapiserver.Config{ aggregatorConfig := &aggregatorapiserver.Config{
GenericConfig: &genericConfig, GenericConfig: &genericConfig,
ExtraConfig: aggregatorapiserver.ExtraConfig{
CoreKubeInformers: externalInformers, CoreKubeInformers: externalInformers,
ProxyClientCert: certBytes, ProxyClientCert: certBytes,
ProxyClientKey: keyBytes, ProxyClientKey: keyBytes,
ServiceResolver: serviceResolver, ServiceResolver: serviceResolver,
ProxyTransport: proxyTransport, ProxyTransport: proxyTransport,
},
} }
return aggregatorConfig, nil return aggregatorConfig, nil

View File

@ -41,11 +41,12 @@ func createAPIExtensionsConfig(kubeAPIServerConfig genericapiserver.Config, comm
apiextensionsConfig := &apiextensionsapiserver.Config{ apiextensionsConfig := &apiextensionsapiserver.Config{
GenericConfig: &genericConfig, GenericConfig: &genericConfig,
ExtraConfig: apiextensionsapiserver.ExtraConfig{
CRDRESTOptionsGetter: apiextensionscmd.NewCRDRESTOptionsGetter(etcdOptions), CRDRESTOptionsGetter: apiextensionscmd.NewCRDRESTOptionsGetter(etcdOptions),
},
} }
return apiextensionsConfig, nil return apiextensionsConfig, nil
} }
func createAPIExtensionsServer(apiextensionsConfig *apiextensionsapiserver.Config, delegateAPIServer genericapiserver.DelegationTarget) (*apiextensionsapiserver.CustomResourceDefinitions, error) { func createAPIExtensionsServer(apiextensionsConfig *apiextensionsapiserver.Config, delegateAPIServer genericapiserver.DelegationTarget) (*apiextensionsapiserver.CustomResourceDefinitions, error) {

View File

@ -172,8 +172,8 @@ func CreateServerChain(runOptions *options.ServerRunOptions, stopCh <-chan struc
if err != nil { if err != nil {
return nil, err return nil, err
} }
aggregatorConfig.ProxyTransport = proxyTransport aggregatorConfig.ExtraConfig.ProxyTransport = proxyTransport
aggregatorConfig.ServiceResolver = serviceResolver aggregatorConfig.ExtraConfig.ServiceResolver = serviceResolver
aggregatorServer, err := createAggregatorServer(aggregatorConfig, kubeAPIServer.GenericAPIServer, apiExtensionsServer.Informers) aggregatorServer, err := createAggregatorServer(aggregatorConfig, kubeAPIServer.GenericAPIServer, apiExtensionsServer.Informers)
if err != nil { if err != nil {
// we don't need special handling for innerStopCh because the aggregator server doesn't create any go routines // we don't need special handling for innerStopCh because the aggregator server doesn't create any go routines
@ -312,7 +312,7 @@ func CreateKubeAPIServerConfig(s *options.ServerRunOptions, nodeTunneler tunnele
config := &master.Config{ config := &master.Config{
GenericConfig: genericConfig, GenericConfig: genericConfig,
ExtraConfig: master.ExtraConfig{
ClientCARegistrationHook: master.ClientCARegistrationHook{ ClientCARegistrationHook: master.ClientCARegistrationHook{
ClientCA: clientCA, ClientCA: clientCA,
RequestHeaderUsernameHeaders: s.Authentication.RequestHeader.UsernameHeaders, RequestHeaderUsernameHeaders: s.Authentication.RequestHeader.UsernameHeaders,
@ -341,11 +341,12 @@ func CreateKubeAPIServerConfig(s *options.ServerRunOptions, nodeTunneler tunnele
KubernetesServiceNodePort: s.KubernetesServiceNodePort, KubernetesServiceNodePort: s.KubernetesServiceNodePort,
MasterCount: s.MasterCount, MasterCount: s.MasterCount,
},
} }
if nodeTunneler != nil { if nodeTunneler != nil {
// Use the nodeTunneler's dialer to connect to the kubelet // 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 return config, sharedInformers, versionedInformers, insecureServingOptions, serviceResolver, nil

View File

@ -82,28 +82,28 @@ func (c *Config) NewBootstrapController(legacyRESTStorage corerest.LegacyRESTSto
ServiceClient: serviceClient, ServiceClient: serviceClient,
NamespaceClient: nsClient, NamespaceClient: nsClient,
EndpointReconciler: c.EndpointReconcilerConfig.Reconciler, EndpointReconciler: c.ExtraConfig.EndpointReconcilerConfig.Reconciler,
EndpointInterval: c.EndpointReconcilerConfig.Interval, EndpointInterval: c.ExtraConfig.EndpointReconcilerConfig.Interval,
SystemNamespaces: []string{metav1.NamespaceSystem, metav1.NamespacePublic}, SystemNamespaces: []string{metav1.NamespaceSystem, metav1.NamespacePublic},
SystemNamespacesInterval: 1 * time.Minute, SystemNamespacesInterval: 1 * time.Minute,
ServiceClusterIPRegistry: legacyRESTStorage.ServiceClusterIPAllocator, ServiceClusterIPRegistry: legacyRESTStorage.ServiceClusterIPAllocator,
ServiceClusterIPRange: c.ServiceIPRange, ServiceClusterIPRange: c.ExtraConfig.ServiceIPRange,
ServiceClusterIPInterval: 3 * time.Minute, ServiceClusterIPInterval: 3 * time.Minute,
ServiceNodePortRegistry: legacyRESTStorage.ServiceNodePortAllocator, ServiceNodePortRegistry: legacyRESTStorage.ServiceNodePortAllocator,
ServiceNodePortRange: c.ServiceNodePortRange, ServiceNodePortRange: c.ExtraConfig.ServiceNodePortRange,
ServiceNodePortInterval: 3 * time.Minute, ServiceNodePortInterval: 3 * time.Minute,
PublicIP: c.GenericConfig.PublicAddress, PublicIP: c.GenericConfig.PublicAddress,
ServiceIP: c.APIServerServiceIP, ServiceIP: c.ExtraConfig.APIServerServiceIP,
ServicePort: c.APIServerServicePort, ServicePort: c.ExtraConfig.APIServerServicePort,
ExtraServicePorts: c.ExtraServicePorts, ExtraServicePorts: c.ExtraConfig.ExtraServicePorts,
ExtraEndpointPorts: c.ExtraEndpointPorts, ExtraEndpointPorts: c.ExtraConfig.ExtraEndpointPorts,
PublicServicePort: c.GenericConfig.ReadWritePort, PublicServicePort: c.GenericConfig.ReadWritePort,
KubernetesServiceNodePort: c.KubernetesServiceNodePort, KubernetesServiceNodePort: c.ExtraConfig.KubernetesServiceNodePort,
} }
} }

View File

@ -85,9 +85,7 @@ const (
DefaultEndpointReconcilerInterval = 10 * time.Second DefaultEndpointReconcilerInterval = 10 * time.Second
) )
type Config struct { type ExtraConfig struct {
GenericConfig *genericapiserver.Config
ClientCARegistrationHook ClientCARegistrationHook ClientCARegistrationHook ClientCARegistrationHook
APIResourceConfigSource serverstorage.APIResourceConfigSource APIResourceConfigSource serverstorage.APIResourceConfigSource
@ -135,6 +133,11 @@ type Config struct {
MasterCount int MasterCount int
} }
type Config struct {
GenericConfig *genericapiserver.Config
ExtraConfig ExtraConfig
}
// EndpointReconcilerConfig holds the endpoint reconciler and endpoint reconciliation interval to be // EndpointReconcilerConfig holds the endpoint reconciler and endpoint reconciliation interval to be
// used by the master. // used by the master.
type EndpointReconcilerConfig struct { type EndpointReconcilerConfig struct {
@ -157,42 +160,42 @@ type completedConfig struct {
func (c *Config) Complete() completedConfig { func (c *Config) Complete() completedConfig {
c.GenericConfig.Complete() c.GenericConfig.Complete()
serviceIPRange, apiServerServiceIP, err := DefaultServiceIPRange(c.ServiceIPRange) serviceIPRange, apiServerServiceIP, err := DefaultServiceIPRange(c.ExtraConfig.ServiceIPRange)
if err != nil { if err != nil {
glog.Fatalf("Error determining service IP ranges: %v", err) glog.Fatalf("Error determining service IP ranges: %v", err)
} }
if c.ServiceIPRange.IP == nil { if c.ExtraConfig.ServiceIPRange.IP == nil {
c.ServiceIPRange = serviceIPRange c.ExtraConfig.ServiceIPRange = serviceIPRange
} }
if c.APIServerServiceIP == nil { if c.ExtraConfig.APIServerServiceIP == nil {
c.APIServerServiceIP = apiServerServiceIP c.ExtraConfig.APIServerServiceIP = apiServerServiceIP
} }
discoveryAddresses := discovery.DefaultAddresses{DefaultAddress: c.GenericConfig.ExternalAddress} discoveryAddresses := discovery.DefaultAddresses{DefaultAddress: c.GenericConfig.ExternalAddress}
discoveryAddresses.CIDRRules = append(discoveryAddresses.CIDRRules, 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 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?) // 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) // 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. // but then that breaks the strict nestedness of ServiceType.
// Review post-v1 // Review post-v1
c.ServiceNodePortRange = options.DefaultServiceNodePortRange c.ExtraConfig.ServiceNodePortRange = options.DefaultServiceNodePortRange
glog.Infof("Node port range unspecified. Defaulting to %v.", c.ServiceNodePortRange) glog.Infof("Node port range unspecified. Defaulting to %v.", c.ExtraConfig.ServiceNodePortRange)
} }
// enable swagger UI only if general UI support is on // 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 { if c.ExtraConfig.EndpointReconcilerConfig.Interval == 0 {
c.EndpointReconcilerConfig.Interval = DefaultEndpointReconcilerInterval 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 // use a default endpoint reconciler if nothing is set
endpointClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) 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 // 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: // Certain config fields must be specified, including:
// KubeletClientConfig // KubeletClientConfig
func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) (*Master, error) { 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") 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 return nil, err
} }
if c.EnableUISupport { if c.ExtraConfig.EnableUISupport {
routes.UIRedirect{}.Install(s.Handler.NonGoRestfulMux) routes.UIRedirect{}.Install(s.Handler.NonGoRestfulMux)
} }
if c.EnableLogsSupport { if c.ExtraConfig.EnableLogsSupport {
routes.Logs{}.Install(s.Handler.GoRestfulContainer) routes.Logs{}.Install(s.Handler.GoRestfulContainer)
} }
@ -232,14 +235,14 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
} }
// install legacy rest storage // install legacy rest storage
if c.APIResourceConfigSource.AnyResourcesForVersionEnabled(apiv1.SchemeGroupVersion) { if c.ExtraConfig.APIResourceConfigSource.AnyResourcesForVersionEnabled(apiv1.SchemeGroupVersion) {
legacyRESTStorageProvider := corerest.LegacyRESTStorageProvider{ legacyRESTStorageProvider := corerest.LegacyRESTStorageProvider{
StorageFactory: c.StorageFactory, StorageFactory: c.ExtraConfig.StorageFactory,
ProxyTransport: c.ProxyTransport, ProxyTransport: c.ExtraConfig.ProxyTransport,
KubeletClientConfig: c.KubeletClientConfig, KubeletClientConfig: c.ExtraConfig.KubeletClientConfig,
EventTTL: c.EventTTL, EventTTL: c.ExtraConfig.EventTTL,
ServiceIPRange: c.ServiceIPRange, ServiceIPRange: c.ExtraConfig.ServiceIPRange,
ServiceNodePortRange: c.ServiceNodePortRange, ServiceNodePortRange: c.ExtraConfig.ServiceNodePortRange,
LoopbackClientConfig: c.GenericConfig.LoopbackClientConfig, LoopbackClientConfig: c.GenericConfig.LoopbackClientConfig,
} }
m.InstallLegacyAPI(c.Config, c.Config.GenericConfig.RESTOptionsGetter, legacyRESTStorageProvider) m.InstallLegacyAPI(c.Config, c.Config.GenericConfig.RESTOptionsGetter, legacyRESTStorageProvider)
@ -270,13 +273,13 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
appsrest.RESTStorageProvider{}, appsrest.RESTStorageProvider{},
admissionregistrationrest.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 { if c.ExtraConfig.Tunneler != nil {
m.installTunneler(c.Tunneler, corev1client.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes()) 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 return m, nil
} }
@ -287,7 +290,7 @@ func (m *Master) InstallLegacyAPI(c *Config, restOptionsGetter generic.RESTOptio
glog.Fatalf("Error building core storage: %v", err) glog.Fatalf("Error building core storage: %v", err)
} }
if c.EnableCoreControllers { if c.ExtraConfig.EnableCoreControllers {
coreClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig) coreClient := coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig)
bootstrapController := c.NewBootstrapController(legacyRESTStorage, coreClient, coreClient) bootstrapController := c.NewBootstrapController(legacyRESTStorage, coreClient, coreClient)
m.GenericAPIServer.AddPostStartHookOrDie("bootstrap-controller", bootstrapController.PostStartHook) m.GenericAPIServer.AddPostStartHookOrDie("bootstrap-controller", bootstrapController.PostStartHook)

View File

@ -71,9 +71,11 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion
config := &Config{ config := &Config{
GenericConfig: genericapiserver.NewConfig(api.Codecs), GenericConfig: genericapiserver.NewConfig(api.Codecs),
ExtraConfig: ExtraConfig{
APIResourceConfigSource: DefaultAPIResourceConfigSource(), APIResourceConfigSource: DefaultAPIResourceConfigSource(),
APIServerServicePort: 443, APIServerServicePort: 443,
MasterCount: 1, MasterCount: 1,
},
} }
resourceEncoding := serverstorage.NewDefaultResourceEncodingConfig(api.Registry) resourceEncoding := serverstorage.NewDefaultResourceEncodingConfig(api.Registry)
@ -95,16 +97,16 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion
kubeVersion := kubeversion.Get() kubeVersion := kubeversion.Get()
config.GenericConfig.Version = &kubeVersion 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.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}}
config.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4") config.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4")
config.GenericConfig.LegacyAPIGroupPrefixes = sets.NewString("/api") config.GenericConfig.LegacyAPIGroupPrefixes = sets.NewString("/api")
config.GenericConfig.RequestContextMapper = genericapirequest.NewRequestContextMapper() config.GenericConfig.RequestContextMapper = genericapirequest.NewRequestContextMapper()
config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}}
config.GenericConfig.EnableMetrics = true config.GenericConfig.EnableMetrics = true
config.EnableCoreControllers = false config.ExtraConfig.EnableCoreControllers = false
config.KubeletClientConfig = kubeletclient.KubeletClientConfig{Port: 10250} config.ExtraConfig.KubeletClientConfig = kubeletclient.KubeletClientConfig{Port: 10250}
config.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{ config.ExtraConfig.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{
Dial: func(network, addr string) (net.Conn, error) { return nil, nil }, Dial: func(network, addr string) (net.Conn, error) { return nil, nil },
TLSClientConfig: &tls.Config{}, TLSClientConfig: &tls.Config{},
}) })
@ -126,12 +128,12 @@ func TestLegacyRestStorageStrategies(t *testing.T) {
defer etcdserver.Terminate(t) defer etcdserver.Terminate(t)
storageProvider := corerest.LegacyRESTStorageProvider{ storageProvider := corerest.LegacyRESTStorageProvider{
StorageFactory: masterCfg.StorageFactory, StorageFactory: masterCfg.ExtraConfig.StorageFactory,
ProxyTransport: masterCfg.ProxyTransport, ProxyTransport: masterCfg.ExtraConfig.ProxyTransport,
KubeletClientConfig: masterCfg.KubeletClientConfig, KubeletClientConfig: masterCfg.ExtraConfig.KubeletClientConfig,
EventTTL: masterCfg.EventTTL, EventTTL: masterCfg.ExtraConfig.EventTTL,
ServiceIPRange: masterCfg.ServiceIPRange, ServiceIPRange: masterCfg.ExtraConfig.ServiceIPRange,
ServiceNodePortRange: masterCfg.ServiceNodePortRange, ServiceNodePortRange: masterCfg.ExtraConfig.ServiceNodePortRange,
LoopbackClientConfig: masterCfg.GenericConfig.LoopbackClientConfig, LoopbackClientConfig: masterCfg.GenericConfig.LoopbackClientConfig,
} }
@ -162,7 +164,7 @@ func TestCertificatesRestStorageStrategies(t *testing.T) {
defer etcdserver.Terminate(t) defer etcdserver.Terminate(t)
certStorageProvider := certificatesrest.RESTStorageProvider{} certStorageProvider := certificatesrest.RESTStorageProvider{}
apiGroupInfo, _ := certStorageProvider.NewRESTStorage(masterCfg.APIResourceConfigSource, masterCfg.GenericConfig.RESTOptionsGetter) apiGroupInfo, _ := certStorageProvider.NewRESTStorage(masterCfg.ExtraConfig.APIResourceConfigSource, masterCfg.GenericConfig.RESTOptionsGetter)
exceptions := registrytest.StrategyExceptions{ exceptions := registrytest.StrategyExceptions{
HasExportStrategy: []string{ 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. // 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) { func newLimitedMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
etcdserver, config, assert := setUp(t) etcdserver, config, assert := setUp(t)
config.APIResourceConfigSource = limitedAPIResourceConfigSource() config.ExtraConfig.APIResourceConfigSource = limitedAPIResourceConfigSource()
master, err := config.Complete().New(genericapiserver.EmptyDelegate) master, err := config.Complete(sharedInformers).New(genericapiserver.EmptyDelegate)
if err != nil { if err != nil {
t.Fatalf("Error in bringing up the master: %v", err) t.Fatalf("Error in bringing up the master: %v", err)
} }

View File

@ -78,10 +78,14 @@ func init() {
Scheme.AddUnversionedTypes(unversionedVersion, unversionedTypes...) Scheme.AddUnversionedTypes(unversionedVersion, unversionedTypes...)
} }
type ExtraConfig struct {
CRDRESTOptionsGetter genericregistry.RESTOptionsGetter
}
type Config struct { type Config struct {
GenericConfig *genericapiserver.Config GenericConfig *genericapiserver.Config
ExtraConfig ExtraConfig
}
CRDRESTOptionsGetter genericregistry.RESTOptionsGetter
} }
type CustomResourceDefinitions struct { 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().Lister(),
s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(),
delegateHandler, delegateHandler,
c.CRDRESTOptionsGetter, c.ExtraConfig.CRDRESTOptionsGetter,
c.GenericConfig.AdmissionControl, c.GenericConfig.AdmissionControl,
) )
s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", crdHandler) s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", crdHandler)

View File

@ -101,7 +101,9 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err
config := &apiserver.Config{ config := &apiserver.Config{
GenericConfig: serverConfig, GenericConfig: serverConfig,
ExtraConfig: apiserver.ExtraConfig{
CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd), CRDRESTOptionsGetter: NewCRDRESTOptionsGetter(*o.RecommendedOptions.Etcd),
},
} }
return config, nil return config, nil
} }

View File

@ -457,7 +457,7 @@ func TestEtcdStorage(t *testing.T) {
} }
func getPrefixFromConfig(t *testing.T, config *extensionsapiserver.Config) string { func getPrefixFromConfig(t *testing.T, config *extensionsapiserver.Config) string {
extensionsOptionsGetter, ok := config.CRDRESTOptionsGetter.(extensionsapiserver.CRDRESTOptionsGetter) extensionsOptionsGetter, ok := config.ExtraConfig.CRDRESTOptionsGetter.(extensionsapiserver.CRDRESTOptionsGetter)
if !ok { if !ok {
t.Fatal("can't obtain etcd prefix: unable to cast config.CRDRESTOptionsGetter to extensionsapiserver.CRDRESTOptionsGetter") t.Fatal("can't obtain etcd prefix: unable to cast config.CRDRESTOptionsGetter to extensionsapiserver.CRDRESTOptionsGetter")
} }

View File

@ -89,7 +89,9 @@ func DefaultServerConfig() (*extensionsapiserver.Config, error) {
config := &extensionsapiserver.Config{ config := &extensionsapiserver.Config{
GenericConfig: genericConfig, GenericConfig: genericConfig,
ExtraConfig: extensionsapiserver.ExtraConfig{
CRDRESTOptionsGetter: customResourceDefinitionRESTOptionsGetter, CRDRESTOptionsGetter: customResourceDefinitionRESTOptionsGetter,
},
} }
return config, nil return config, nil

View File

@ -70,9 +70,7 @@ func init() {
// legacyAPIServiceName is the fixed name of the only non-groupified API version // legacyAPIServiceName is the fixed name of the only non-groupified API version
const legacyAPIServiceName = "v1." const legacyAPIServiceName = "v1."
type Config struct { type ExtraConfig struct {
GenericConfig *genericapiserver.Config
// CoreKubeInformers is used to watch kube resources // CoreKubeInformers is used to watch kube resources
CoreKubeInformers kubeinformers.SharedInformerFactory CoreKubeInformers kubeinformers.SharedInformerFactory
@ -89,6 +87,11 @@ type Config struct {
ServiceResolver ServiceResolver ServiceResolver ServiceResolver
} }
type Config struct {
GenericConfig *genericapiserver.RecommendedConfig
ExtraConfig ExtraConfig
}
// APIAggregator contains state for a Kubernetes cluster master/api server. // APIAggregator contains state for a Kubernetes cluster master/api server.
type APIAggregator struct { type APIAggregator struct {
GenericAPIServer *genericapiserver.GenericAPIServer GenericAPIServer *genericapiserver.GenericAPIServer
@ -168,14 +171,14 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg
GenericAPIServer: genericServer, GenericAPIServer: genericServer,
delegateHandler: delegationTarget.UnprotectedHandler(), delegateHandler: delegationTarget.UnprotectedHandler(),
contextMapper: c.GenericConfig.RequestContextMapper, contextMapper: c.GenericConfig.RequestContextMapper,
proxyClientCert: c.ProxyClientCert, proxyClientCert: c.ExtraConfig.ProxyClientCert,
proxyClientKey: c.ProxyClientKey, proxyClientKey: c.ExtraConfig.ProxyClientKey,
proxyTransport: c.ProxyTransport, proxyTransport: c.ExtraConfig.ProxyTransport,
proxyHandlers: map[string]*proxyHandler{}, proxyHandlers: map[string]*proxyHandler{},
handledGroups: sets.String{}, handledGroups: sets.String{},
lister: informerFactory.Apiregistration().InternalVersion().APIServices().Lister(), lister: informerFactory.Apiregistration().InternalVersion().APIServices().Lister(),
APIRegistrationInformers: informerFactory, APIRegistrationInformers: informerFactory,
serviceResolver: c.ServiceResolver, serviceResolver: c.ExtraConfig.ServiceResolver,
} }
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName, registry, Scheme, metav1.ParameterCodec, Codecs) 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.Handle("/apis", apisHandler)
s.GenericAPIServer.Handler.NonGoRestfulMux.UnlistedHandle("/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( availableController := statuscontrollers.NewAvailableConditionController(
informerFactory.Apiregistration().InternalVersion().APIServices(), informerFactory.Apiregistration().InternalVersion().APIServices(),
c.CoreKubeInformers.Core().V1().Services(), c.ExtraConfig.CoreKubeInformers.Core().V1().Services(),
c.CoreKubeInformers.Core().V1().Endpoints(), c.ExtraConfig.CoreKubeInformers.Core().V1().Endpoints(),
apiregistrationClient.Apiregistration(), apiregistrationClient.Apiregistration(),
) )
s.GenericAPIServer.AddPostStartHook("start-kube-aggregator-informers", func(context genericapiserver.PostStartHookContext) error { s.GenericAPIServer.AddPostStartHook("start-kube-aggregator-informers", func(context genericapiserver.PostStartHookContext) error {
informerFactory.Start(context.StopCh) informerFactory.Start(context.StopCh)
c.CoreKubeInformers.Start(context.StopCh) c.ExtraConfig.CoreKubeInformers.Start(context.StopCh)
return nil return nil
}) })
s.GenericAPIServer.AddPostStartHook("apiservice-registration-controller", func(context genericapiserver.PostStartHookContext) error { s.GenericAPIServer.AddPostStartHook("apiservice-registration-controller", func(context genericapiserver.PostStartHookContext) error {

View File

@ -152,15 +152,17 @@ func (o AggregatorOptions) RunAggregator(stopCh <-chan struct{}) error {
config := apiserver.Config{ config := apiserver.Config{
GenericConfig: serverConfig, GenericConfig: serverConfig,
ExtraConfig: apiserver.ExtraConfig{
CoreKubeInformers: kubeInformers, CoreKubeInformers: kubeInformers,
ServiceResolver: serviceResolver, ServiceResolver: serviceResolver,
},
} }
config.ProxyClientCert, err = ioutil.ReadFile(o.ProxyClientCertFile) config.ExtraConfig.ProxyClientCert, err = ioutil.ReadFile(o.ProxyClientCertFile)
if err != nil { if err != nil {
return err return err
} }
config.ProxyClientKey, err = ioutil.ReadFile(o.ProxyClientKeyFile) config.ExtraConfig.ProxyClientKey, err = ioutil.ReadFile(o.ProxyClientKeyFile)
if err != nil { if err != nil {
return err return err
} }

View File

@ -61,10 +61,15 @@ func init() {
) )
} }
type ExtraConfig struct {
// Place you custom config here.
}
type Config struct { type Config struct {
GenericConfig *genericapiserver.Config GenericConfig *genericapiserver.Config
// SharedInformerFactory provides shared informers for resources // SharedInformerFactory provides shared informers for resources
SharedInformerFactory informers.SharedInformerFactory SharedInformerFactory informers.SharedInformerFactory
ExtraConfig ExtraConfig
} }
// WardleServer contains state for a Kubernetes cluster master/api server. // WardleServer contains state for a Kubernetes cluster master/api server.

View File

@ -126,6 +126,7 @@ func (o WardleServerOptions) Config() (*apiserver.Config, error) {
config := &apiserver.Config{ config := &apiserver.Config{
GenericConfig: serverConfig, GenericConfig: serverConfig,
SharedInformerFactory: informerFactory, SharedInformerFactory: informerFactory,
ExtraConfig: apiserver.ExtraConfig{},
} }
return config, nil return config, nil
} }

View File

@ -44,7 +44,7 @@ import (
func setup(t *testing.T) (*httptest.Server, clientset.Interface, framework.CloseFunc) { func setup(t *testing.T) (*httptest.Server, clientset.Interface, framework.CloseFunc) {
masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig := framework.NewIntegrationTestMasterConfig()
masterConfig.EnableCoreControllers = false masterConfig.ExtraConfig.EnableCoreControllers = false
_, s, closeFn := framework.RunAMaster(masterConfig) _, s, closeFn := framework.RunAMaster(masterConfig)
clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL}) clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL})

View File

@ -75,7 +75,7 @@ type testRESTOptionsGetter struct {
} }
func (getter *testRESTOptionsGetter) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { 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 { if err != nil {
return generic.RESTOptions{}, fmt.Errorf("failed to get storage: %v", err) return generic.RESTOptions{}, fmt.Errorf("failed to get storage: %v", err)
} }

View File

@ -690,7 +690,7 @@ func startRealMasterOrDie(t *testing.T, certDir string) (*allClient, clientv3.KV
t.Fatal(err) 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) kubeAPIServer, err := app.CreateKubeAPIServer(kubeAPIServerConfig, genericapiserver.EmptyDelegate, sharedInformers)
if err != nil { if err != nil {

View File

@ -358,21 +358,23 @@ func NewMasterConfig() *master.Config {
return &master.Config{ return &master.Config{
GenericConfig: genericConfig, GenericConfig: genericConfig,
ExtraConfig: master.ExtraConfig{
APIResourceConfigSource: master.DefaultAPIResourceConfigSource(), APIResourceConfigSource: master.DefaultAPIResourceConfigSource(),
StorageFactory: storageFactory, StorageFactory: storageFactory,
EnableCoreControllers: true, EnableCoreControllers: true,
KubeletClientConfig: kubeletclient.KubeletClientConfig{Port: 10250}, KubeletClientConfig: kubeletclient.KubeletClientConfig{Port: 10250},
APIServerServicePort: 443, APIServerServicePort: 443,
MasterCount: 1, MasterCount: 1,
},
} }
} }
// Returns the master config appropriate for most integration tests. // Returns the master config appropriate for most integration tests.
func NewIntegrationTestMasterConfig() *master.Config { func NewIntegrationTestMasterConfig() *master.Config {
masterConfig := NewMasterConfig() masterConfig := NewMasterConfig()
masterConfig.EnableCoreControllers = true masterConfig.ExtraConfig.EnableCoreControllers = true
masterConfig.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4") masterConfig.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4")
masterConfig.APIResourceConfigSource = master.DefaultAPIResourceConfigSource() masterConfig.ExtraConfig.APIResourceConfigSource = master.DefaultAPIResourceConfigSource()
return masterConfig return masterConfig
} }

View File

@ -548,7 +548,7 @@ func TestServiceAlloc(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("bad cidr: %v", err) t.Fatalf("bad cidr: %v", err)
} }
cfg.ServiceIPRange = *cidr cfg.ExtraConfig.ServiceIPRange = *cidr
_, s, closeFn := framework.RunAMaster(cfg) _, s, closeFn := framework.RunAMaster(cfg)
defer closeFn() defer closeFn()

View File

@ -30,9 +30,11 @@ func TestMasterExportsSymbols(t *testing.T) {
GenericConfig: &genericapiserver.Config{ GenericConfig: &genericapiserver.Config{
EnableMetrics: true, EnableMetrics: true,
}, },
ExtraConfig: master.ExtraConfig{
EnableCoreControllers: false, EnableCoreControllers: false,
EnableUISupport: false, EnableUISupport: false,
EnableLogsSupport: false, EnableLogsSupport: false,
},
} }
_ = &master.Master{ _ = &master.Master{
GenericAPIServer: &genericapiserver.GenericAPIServer{}, GenericAPIServer: &genericapiserver.GenericAPIServer{},