From a8127df3bb396717b4fb2a7f688c1f98e6bef6b4 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 20 Dec 2017 12:17:44 +0100 Subject: [PATCH] Simplify extra initializer logic --- .../src/k8s.io/apiserver/pkg/server/config.go | 5 -- .../apiserver/pkg/server/options/admission.go | 10 ++++ .../pkg/server/options/recommended.go | 57 ++++++------------- .../sample-apiserver/pkg/cmd/server/start.go | 7 +-- 4 files changed, 30 insertions(+), 49 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/config.go b/staging/src/k8s.io/apiserver/pkg/server/config.go index cd98717d2c0..877071ad3b2 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config.go @@ -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), } } diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go index 30716869146..2565c0a69cf 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/admission.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/admission.go @@ -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() diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go index eff7cde33d3..829647a2490 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/recommended.go @@ -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 diff --git a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go index b375d46e609..e38eb749359 100644 --- a/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/sample-apiserver/pkg/cmd/server/start.go @@ -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 }