Simplify extra initializer logic

This commit is contained in:
Dr. Stefan Schimanski 2017-12-20 12:17:44 +01:00 committed by hzxuzhonghu
parent 5dab6bc40a
commit a8127df3bb
4 changed files with 30 additions and 49 deletions

View File

@ -188,13 +188,9 @@ type Config struct {
PublicAddress net.IP
}
type AdmissionInitializersInitFunc func() (admission.PluginInitializer, error)
type RecommendedConfig struct {
Config
ExtraAdmissionInitializersInitFunc []AdmissionInitializersInitFunc
// SharedInformerFactory provides shared informers for Kubernetes resources. This value is set by
// RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo. It uses an in-cluster client config
// by default, or the kubeconfig given with kubeconfig command line flag.
@ -263,7 +259,6 @@ func NewConfig(codecs serializer.CodecFactory) *Config {
func NewRecommendedConfig(codecs serializer.CodecFactory) *RecommendedConfig {
return &RecommendedConfig{
Config: *NewConfig(codecs),
ExtraAdmissionInitializersInitFunc: make([]AdmissionInitializersInitFunc, 0),
}
}

View File

@ -104,6 +104,16 @@ func (a *AdmissionOptions) ApplyTo(
return nil
}
// Admission need scheme to construct admission initializer.
if scheme == nil {
return fmt.Errorf("admission depends on a scheme, it cannot be nil")
}
// Admission depends on CoreAPI to set SharedInformerFactory and ClientConfig.
if informers == nil {
return fmt.Errorf("admission depends on a Kubernetes core API shared informer, it cannot be nil")
}
pluginNames := a.PluginNames
if len(a.PluginNames) == 0 {
pluginNames = a.enabledPluginNames()

View File

@ -17,8 +17,6 @@ limitations under the License.
package options
import (
"fmt"
"github.com/spf13/pflag"
"k8s.io/apimachinery/pkg/runtime"
@ -38,19 +36,24 @@ type RecommendedOptions struct {
Audit *AuditOptions
Features *FeatureOptions
CoreAPI *CoreAPIOptions
Admission *AdmissionOptions
// ExtraAdmissionInitializers is called once after all ApplyTo from the options above, to pass the returned
// admission plugin initializers to Admission.ApplyTo.
ExtraAdmissionInitializers func() ([]admission.PluginInitializer, error)
Admission *AdmissionOptions
}
func NewRecommendedOptions(prefix string, codec runtime.Codec) *RecommendedOptions {
return &RecommendedOptions{
Etcd: NewEtcdOptions(storagebackend.NewDefaultConfig(prefix, codec)),
SecureServing: NewSecureServingOptions(),
Authentication: NewDelegatingAuthenticationOptions(),
Authorization: NewDelegatingAuthorizationOptions(),
Audit: NewAuditOptions(),
Features: NewFeatureOptions(),
CoreAPI: NewCoreAPIOptions(),
Admission: NewAdmissionOptions(),
Etcd: NewEtcdOptions(storagebackend.NewDefaultConfig(prefix, codec)),
SecureServing: NewSecureServingOptions(),
Authentication: NewDelegatingAuthenticationOptions(),
Authorization: NewDelegatingAuthorizationOptions(),
Audit: NewAuditOptions(),
Features: NewFeatureOptions(),
CoreAPI: NewCoreAPIOptions(),
ExtraAdmissionInitializers: func() ([]admission.PluginInitializer, error) { return nil, nil },
Admission: NewAdmissionOptions(),
}
}
@ -90,34 +93,10 @@ func (o *RecommendedOptions) ApplyTo(config *server.RecommendedConfig, scheme *r
if err := o.CoreAPI.ApplyTo(config); err != nil {
return err
}
if o.Admission != nil {
// Admission depends on CoreAPI to set SharedInformerFactory and ClientConfig.
if o.CoreAPI == nil {
return fmt.Errorf("admission depends on CoreAPI, so it must be set")
}
// Admission need scheme to construct admission initializer.
if scheme == nil {
return fmt.Errorf("admission depends on shceme, so it must be set")
}
pluginInitializers := []admission.PluginInitializer{}
for _, initFunc := range config.ExtraAdmissionInitializersInitFunc {
intializer, err := initFunc()
if err != nil {
return err
}
pluginInitializers = append(pluginInitializers, intializer)
}
err := o.Admission.ApplyTo(
&config.Config,
config.SharedInformerFactory,
config.ClientConfig,
scheme,
pluginInitializers...)
if err != nil {
return err
}
if initializers, err := o.ExtraAdmissionInitializers(); err != nil {
return err
} else if err := o.Admission.ApplyTo(&config.Config, config.SharedInformerFactory, config.ClientConfig, scheme, initializers...); err != nil {
return err
}
return nil

View File

@ -104,18 +104,15 @@ func (o *WardleServerOptions) Config() (*apiserver.Config, error) {
serverConfig := genericapiserver.NewRecommendedConfig(apiserver.Codecs)
admissionInitializerInitFunc := func() (admission.PluginInitializer, error) {
o.RecommendedOptions.ExtraAdmissionInitializers = func() ([]admission.PluginInitializer, error) {
client, err := clientset.NewForConfig(serverConfig.LoopbackClientConfig)
if err != nil {
return nil, err
}
informerFactory := informers.NewSharedInformerFactory(client, serverConfig.LoopbackClientConfig.Timeout)
o.SharedInformerFactory = informerFactory
return wardleinitializer.New(informerFactory), nil
return []admission.PluginInitializer{wardleinitializer.New(informerFactory)}, nil
}
serverConfig.ExtraAdmissionInitializersInitFunc = []genericapiserver.AdmissionInitializersInitFunc{admissionInitializerInitFunc}
if err := o.RecommendedOptions.ApplyTo(serverConfig, apiserver.Scheme); err != nil {
return nil, err
}