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 PublicAddress net.IP
} }
type AdmissionInitializersInitFunc func() (admission.PluginInitializer, error)
type RecommendedConfig struct { type RecommendedConfig struct {
Config Config
ExtraAdmissionInitializersInitFunc []AdmissionInitializersInitFunc
// SharedInformerFactory provides shared informers for Kubernetes resources. This value is set by // 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 // 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. // 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 { func NewRecommendedConfig(codecs serializer.CodecFactory) *RecommendedConfig {
return &RecommendedConfig{ return &RecommendedConfig{
Config: *NewConfig(codecs), Config: *NewConfig(codecs),
ExtraAdmissionInitializersInitFunc: make([]AdmissionInitializersInitFunc, 0),
} }
} }

View File

@ -104,6 +104,16 @@ func (a *AdmissionOptions) ApplyTo(
return nil 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 pluginNames := a.PluginNames
if len(a.PluginNames) == 0 { if len(a.PluginNames) == 0 {
pluginNames = a.enabledPluginNames() pluginNames = a.enabledPluginNames()

View File

@ -17,8 +17,6 @@ limitations under the License.
package options package options
import ( import (
"fmt"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
@ -38,19 +36,24 @@ type RecommendedOptions struct {
Audit *AuditOptions Audit *AuditOptions
Features *FeatureOptions Features *FeatureOptions
CoreAPI *CoreAPIOptions 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 { func NewRecommendedOptions(prefix string, codec runtime.Codec) *RecommendedOptions {
return &RecommendedOptions{ return &RecommendedOptions{
Etcd: NewEtcdOptions(storagebackend.NewDefaultConfig(prefix, codec)), Etcd: NewEtcdOptions(storagebackend.NewDefaultConfig(prefix, codec)),
SecureServing: NewSecureServingOptions(), SecureServing: NewSecureServingOptions(),
Authentication: NewDelegatingAuthenticationOptions(), Authentication: NewDelegatingAuthenticationOptions(),
Authorization: NewDelegatingAuthorizationOptions(), Authorization: NewDelegatingAuthorizationOptions(),
Audit: NewAuditOptions(), Audit: NewAuditOptions(),
Features: NewFeatureOptions(), Features: NewFeatureOptions(),
CoreAPI: NewCoreAPIOptions(), CoreAPI: NewCoreAPIOptions(),
Admission: NewAdmissionOptions(), 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 { if err := o.CoreAPI.ApplyTo(config); err != nil {
return err return err
} }
if o.Admission != nil { if initializers, err := o.ExtraAdmissionInitializers(); err != nil {
// Admission depends on CoreAPI to set SharedInformerFactory and ClientConfig. return err
if o.CoreAPI == nil { } else if err := o.Admission.ApplyTo(&config.Config, config.SharedInformerFactory, config.ClientConfig, scheme, initializers...); err != nil {
return fmt.Errorf("admission depends on CoreAPI, so it must be set") return err
}
// 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
}
} }
return nil return nil

View File

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