2018-01-09 18:57:14 +00:00
|
|
|
/*
|
|
|
|
Copyright 2017 The Kubernetes Authors.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Package app does all of the work necessary to create a Kubernetes
|
|
|
|
// APIServer by binding together the API, master and APIServer infrastructure.
|
|
|
|
// It can be configured and called directly or via the hyperkube framework.
|
|
|
|
package app
|
|
|
|
|
|
|
|
import (
|
|
|
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
|
|
|
apiextensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
|
2018-11-26 18:23:56 +00:00
|
|
|
apiextensionsoptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
|
2018-07-18 14:47:22 +00:00
|
|
|
"k8s.io/apiserver/pkg/admission"
|
2018-11-26 18:23:56 +00:00
|
|
|
"k8s.io/apiserver/pkg/features"
|
2018-01-09 18:57:14 +00:00
|
|
|
genericapiserver "k8s.io/apiserver/pkg/server"
|
|
|
|
genericoptions "k8s.io/apiserver/pkg/server/options"
|
2018-11-26 18:23:56 +00:00
|
|
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
|
|
"k8s.io/apiserver/pkg/util/webhook"
|
2018-01-09 18:57:14 +00:00
|
|
|
kubeexternalinformers "k8s.io/client-go/informers"
|
|
|
|
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
|
|
|
|
)
|
|
|
|
|
2018-07-18 14:47:22 +00:00
|
|
|
func createAPIExtensionsConfig(
|
|
|
|
kubeAPIServerConfig genericapiserver.Config,
|
|
|
|
externalInformers kubeexternalinformers.SharedInformerFactory,
|
|
|
|
pluginInitializers []admission.PluginInitializer,
|
|
|
|
commandOptions *options.ServerRunOptions,
|
|
|
|
masterCount int,
|
2018-11-26 18:23:56 +00:00
|
|
|
serviceResolver webhook.ServiceResolver,
|
|
|
|
authResolverWrapper webhook.AuthenticationInfoResolverWrapper,
|
2018-07-18 14:47:22 +00:00
|
|
|
) (*apiextensionsapiserver.Config, error) {
|
2018-01-09 18:57:14 +00:00
|
|
|
// 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
|
|
|
|
|
2018-07-18 14:47:22 +00:00
|
|
|
// override genericConfig.AdmissionControl with apiextensions' scheme,
|
|
|
|
// because apiextentions apiserver should use its own scheme to convert resources.
|
|
|
|
commandOptions.Admission.ApplyTo(
|
|
|
|
&genericConfig,
|
|
|
|
externalInformers,
|
|
|
|
genericConfig.LoopbackClientConfig,
|
|
|
|
apiextensionsapiserver.Scheme,
|
|
|
|
pluginInitializers...)
|
|
|
|
|
2018-01-09 18:57:14 +00:00
|
|
|
// copy the etcd options so we don't mutate originals.
|
|
|
|
etcdOptions := *commandOptions.Etcd
|
2018-11-26 18:23:56 +00:00
|
|
|
etcdOptions.StorageConfig.Paging = utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking)
|
2018-01-09 18:57:14 +00:00
|
|
|
etcdOptions.StorageConfig.Codec = apiextensionsapiserver.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion)
|
|
|
|
genericConfig.RESTOptionsGetter = &genericoptions.SimpleRestOptionsFactory{Options: etcdOptions}
|
|
|
|
|
2018-03-06 22:33:18 +00:00
|
|
|
// override MergedResourceConfig with apiextensions defaults and registry
|
|
|
|
if err := commandOptions.APIEnablement.ApplyTo(
|
|
|
|
&genericConfig,
|
|
|
|
apiextensionsapiserver.DefaultAPIResourceConfigSource(),
|
2018-07-18 14:47:22 +00:00
|
|
|
apiextensionsapiserver.Scheme); err != nil {
|
2018-03-06 22:33:18 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2018-01-09 18:57:14 +00:00
|
|
|
apiextensionsConfig := &apiextensionsapiserver.Config{
|
|
|
|
GenericConfig: &genericapiserver.RecommendedConfig{
|
|
|
|
Config: genericConfig,
|
|
|
|
SharedInformerFactory: externalInformers,
|
|
|
|
},
|
|
|
|
ExtraConfig: apiextensionsapiserver.ExtraConfig{
|
2018-11-26 18:23:56 +00:00
|
|
|
CRDRESTOptionsGetter: apiextensionsoptions.NewCRDRESTOptionsGetter(etcdOptions),
|
2018-07-18 14:47:22 +00:00
|
|
|
MasterCount: masterCount,
|
2018-11-26 18:23:56 +00:00
|
|
|
AuthResolverWrapper: authResolverWrapper,
|
|
|
|
ServiceResolver: serviceResolver,
|
2018-01-09 18:57:14 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
return apiextensionsConfig, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func createAPIExtensionsServer(apiextensionsConfig *apiextensionsapiserver.Config, delegateAPIServer genericapiserver.DelegationTarget) (*apiextensionsapiserver.CustomResourceDefinitions, error) {
|
2018-07-18 14:47:22 +00:00
|
|
|
return apiextensionsConfig.Complete().New(delegateAPIServer)
|
2018-01-09 18:57:14 +00:00
|
|
|
}
|