| /* |
| 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" |
| apiextensionsoptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options" |
| "k8s.io/apiserver/pkg/admission" |
| "k8s.io/apiserver/pkg/features" |
| genericapiserver "k8s.io/apiserver/pkg/server" |
| genericoptions "k8s.io/apiserver/pkg/server/options" |
| utilfeature "k8s.io/apiserver/pkg/util/feature" |
| "k8s.io/apiserver/pkg/util/webhook" |
| kubeexternalinformers "k8s.io/client-go/informers" |
| "k8s.io/kubernetes/cmd/kube-apiserver/app/options" |
| ) |
| |
| func createAPIExtensionsConfig( |
| kubeAPIServerConfig genericapiserver.Config, |
| externalInformers kubeexternalinformers.SharedInformerFactory, |
| pluginInitializers []admission.PluginInitializer, |
| commandOptions *options.ServerRunOptions, |
| masterCount int, |
| serviceResolver webhook.ServiceResolver, |
| authResolverWrapper webhook.AuthenticationInfoResolverWrapper, |
| ) (*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 |
| |
| // 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...) |
| |
| // copy the etcd options so we don't mutate originals. |
| etcdOptions := *commandOptions.Etcd |
| etcdOptions.StorageConfig.Paging = utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking) |
| etcdOptions.StorageConfig.Codec = apiextensionsapiserver.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion) |
| genericConfig.RESTOptionsGetter = &genericoptions.SimpleRestOptionsFactory{Options: etcdOptions} |
| |
| // override MergedResourceConfig with apiextensions defaults and registry |
| if err := commandOptions.APIEnablement.ApplyTo( |
| &genericConfig, |
| apiextensionsapiserver.DefaultAPIResourceConfigSource(), |
| apiextensionsapiserver.Scheme); err != nil { |
| return nil, err |
| } |
| |
| apiextensionsConfig := &apiextensionsapiserver.Config{ |
| GenericConfig: &genericapiserver.RecommendedConfig{ |
| Config: genericConfig, |
| SharedInformerFactory: externalInformers, |
| }, |
| ExtraConfig: apiextensionsapiserver.ExtraConfig{ |
| CRDRESTOptionsGetter: apiextensionsoptions.NewCRDRESTOptionsGetter(etcdOptions), |
| MasterCount: masterCount, |
| AuthResolverWrapper: authResolverWrapper, |
| ServiceResolver: serviceResolver, |
| }, |
| } |
| |
| return apiextensionsConfig, nil |
| } |
| |
| func createAPIExtensionsServer(apiextensionsConfig *apiextensionsapiserver.Config, delegateAPIServer genericapiserver.DelegationTarget) (*apiextensionsapiserver.CustomResourceDefinitions, error) { |
| return apiextensionsConfig.Complete().New(delegateAPIServer) |
| } |