Update admission initializers.

Moved RestMapper and add DynamicClient
This commit is contained in:
Cici Huang 2022-11-07 21:24:46 +00:00
parent a949227be1
commit c8a089de46
13 changed files with 40 additions and 19 deletions

View File

@ -30,11 +30,6 @@ type WantsCloudConfig interface {
SetCloudConfig([]byte) SetCloudConfig([]byte)
} }
// WantsRESTMapper defines a function which sets RESTMapper for admission plugins that need it.
type WantsRESTMapper interface {
SetRESTMapper(meta.RESTMapper)
}
// PluginInitializer is used for initialization of the Kubernetes specific admission plugins. // PluginInitializer is used for initialization of the Kubernetes specific admission plugins.
type PluginInitializer struct { type PluginInitializer struct {
cloudConfig []byte cloudConfig []byte
@ -66,7 +61,7 @@ func (i *PluginInitializer) Initialize(plugin admission.Interface) {
wants.SetCloudConfig(i.cloudConfig) wants.SetCloudConfig(i.cloudConfig)
} }
if wants, ok := plugin.(WantsRESTMapper); ok { if wants, ok := plugin.(initializer.WantsRESTMapper); ok {
wants.SetRESTMapper(i.restMapper) wants.SetRESTMapper(i.restMapper)
} }

View File

@ -115,7 +115,7 @@ func newGCPermissionsEnforcement() (*gcPermissionsEnforcement, error) {
whiteList: whiteList, whiteList: whiteList,
} }
genericPluginInitializer := initializer.New(nil, nil, fakeAuthorizer{}, nil, nil) genericPluginInitializer := initializer.New(nil, nil, nil, fakeAuthorizer{}, nil, nil)
fakeDiscoveryClient := &fakediscovery.FakeDiscovery{Fake: &coretesting.Fake{}} fakeDiscoveryClient := &fakediscovery.FakeDiscovery{Fake: &coretesting.Fake{}}
fakeDiscoveryClient.Resources = []*metav1.APIResourceList{ fakeDiscoveryClient.Resources = []*metav1.APIResourceList{
{ {

View File

@ -792,7 +792,7 @@ func newHandlerForTest(c clientset.Interface) (*LimitRanger, informers.SharedInf
if err != nil { if err != nil {
return nil, f, err return nil, f, err
} }
pluginInitializer := genericadmissioninitializer.New(c, f, nil, nil, nil) pluginInitializer := genericadmissioninitializer.New(c, nil, f, nil, nil, nil)
pluginInitializer.Initialize(handler) pluginInitializer.Initialize(handler)
err = admission.ValidateInitialization(handler) err = admission.ValidateInitialization(handler)
return handler, f, err return handler, f, err

View File

@ -41,7 +41,7 @@ import (
func newHandlerForTest(c clientset.Interface) (admission.MutationInterface, informers.SharedInformerFactory, error) { func newHandlerForTest(c clientset.Interface) (admission.MutationInterface, informers.SharedInformerFactory, error) {
f := informers.NewSharedInformerFactory(c, 5*time.Minute) f := informers.NewSharedInformerFactory(c, 5*time.Minute)
handler := NewProvision() handler := NewProvision()
pluginInitializer := genericadmissioninitializer.New(c, f, nil, nil, nil) pluginInitializer := genericadmissioninitializer.New(c, nil, f, nil, nil, nil)
pluginInitializer.Initialize(handler) pluginInitializer.Initialize(handler)
err := admission.ValidateInitialization(handler) err := admission.ValidateInitialization(handler)
return handler, f, err return handler, f, err

View File

@ -39,7 +39,7 @@ import (
func newHandlerForTest(c kubernetes.Interface) (admission.ValidationInterface, informers.SharedInformerFactory, error) { func newHandlerForTest(c kubernetes.Interface) (admission.ValidationInterface, informers.SharedInformerFactory, error) {
f := informers.NewSharedInformerFactory(c, 5*time.Minute) f := informers.NewSharedInformerFactory(c, 5*time.Minute)
handler := NewExists() handler := NewExists()
pluginInitializer := genericadmissioninitializer.New(c, f, nil, nil, nil) pluginInitializer := genericadmissioninitializer.New(c, nil, f, nil, nil, nil)
pluginInitializer.Initialize(handler) pluginInitializer.Initialize(handler)
err := admission.ValidateInitialization(handler) err := admission.ValidateInitialization(handler)
return handler, f, err return handler, f, err

View File

@ -198,7 +198,7 @@ func TestHandles(t *testing.T) {
func newHandlerForTest(c kubernetes.Interface) (*Plugin, informers.SharedInformerFactory, error) { func newHandlerForTest(c kubernetes.Interface) (*Plugin, informers.SharedInformerFactory, error) {
f := informers.NewSharedInformerFactory(c, 5*time.Minute) f := informers.NewSharedInformerFactory(c, 5*time.Minute)
handler := NewPodNodeSelector(nil) handler := NewPodNodeSelector(nil)
pluginInitializer := genericadmissioninitializer.New(c, f, nil, nil, nil) pluginInitializer := genericadmissioninitializer.New(c, nil, f, nil, nil, nil)
pluginInitializer.Initialize(handler) pluginInitializer.Initialize(handler)
err := admission.ValidateInitialization(handler) err := admission.ValidateInitialization(handler)
return handler, f, err return handler, f, err

View File

@ -355,7 +355,7 @@ func newHandlerForTest(c kubernetes.Interface) (*Plugin, informers.SharedInforme
return nil, nil, err return nil, nil, err
} }
handler := NewPodTolerationsPlugin(pluginConfig) handler := NewPodTolerationsPlugin(pluginConfig)
pluginInitializer := genericadmissioninitializer.New(c, f, nil, nil, nil) pluginInitializer := genericadmissioninitializer.New(c, nil, f, nil, nil, nil)
pluginInitializer.Initialize(handler) pluginInitializer.Initialize(handler)
err = admission.ValidateInitialization(handler) err = admission.ValidateInitialization(handler)
return handler, f, err return handler, f, err

View File

@ -107,7 +107,7 @@ func createHandlerWithConfig(kubeClient kubernetes.Interface, informerFactory in
} }
initializers := admission.PluginInitializers{ initializers := admission.PluginInitializers{
genericadmissioninitializer.New(kubeClient, informerFactory, nil, nil, stopCh), genericadmissioninitializer.New(kubeClient, nil, informerFactory, nil, nil, stopCh),
kubeapiserveradmission.NewPluginInitializer(nil, nil, quotaConfiguration), kubeapiserveradmission.NewPluginInitializer(nil, nil, quotaConfiguration),
} }
initializers.Initialize(handler) initializers.Initialize(handler)

View File

@ -19,6 +19,7 @@ package initializer
import ( import (
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
"k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/apiserver/pkg/authorization/authorizer"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/component-base/featuregate" "k8s.io/component-base/featuregate"
@ -26,6 +27,7 @@ import (
type pluginInitializer struct { type pluginInitializer struct {
externalClient kubernetes.Interface externalClient kubernetes.Interface
dynamicClient dynamic.Interface
externalInformers informers.SharedInformerFactory externalInformers informers.SharedInformerFactory
authorizer authorizer.Authorizer authorizer authorizer.Authorizer
featureGates featuregate.FeatureGate featureGates featuregate.FeatureGate
@ -37,6 +39,7 @@ type pluginInitializer struct {
// during compilation when they update a level. // during compilation when they update a level.
func New( func New(
extClientset kubernetes.Interface, extClientset kubernetes.Interface,
dynamicClient dynamic.Interface,
extInformers informers.SharedInformerFactory, extInformers informers.SharedInformerFactory,
authz authorizer.Authorizer, authz authorizer.Authorizer,
featureGates featuregate.FeatureGate, featureGates featuregate.FeatureGate,
@ -44,6 +47,7 @@ func New(
) pluginInitializer { ) pluginInitializer {
return pluginInitializer{ return pluginInitializer{
externalClient: extClientset, externalClient: extClientset,
dynamicClient: dynamicClient,
externalInformers: extInformers, externalInformers: extInformers,
authorizer: authz, authorizer: authz,
featureGates: featureGates, featureGates: featureGates,
@ -68,6 +72,10 @@ func (i pluginInitializer) Initialize(plugin admission.Interface) {
wants.SetExternalKubeClientSet(i.externalClient) wants.SetExternalKubeClientSet(i.externalClient)
} }
if wants, ok := plugin.(WantsDynamicClient); ok {
wants.SetDynamicClient(i.dynamicClient)
}
if wants, ok := plugin.(WantsExternalKubeInformerFactory); ok { if wants, ok := plugin.(WantsExternalKubeInformerFactory); ok {
wants.SetExternalKubeInformerFactory(i.externalInformers) wants.SetExternalKubeInformerFactory(i.externalInformers)
} }

View File

@ -32,7 +32,7 @@ import (
// TestWantsAuthorizer ensures that the authorizer is injected // TestWantsAuthorizer ensures that the authorizer is injected
// when the WantsAuthorizer interface is implemented by a plugin. // when the WantsAuthorizer interface is implemented by a plugin.
func TestWantsAuthorizer(t *testing.T) { func TestWantsAuthorizer(t *testing.T) {
target := initializer.New(nil, nil, &TestAuthorizer{}, nil, nil) target := initializer.New(nil, nil, nil, &TestAuthorizer{}, nil, nil)
wantAuthorizerAdmission := &WantAuthorizerAdmission{} wantAuthorizerAdmission := &WantAuthorizerAdmission{}
target.Initialize(wantAuthorizerAdmission) target.Initialize(wantAuthorizerAdmission)
if wantAuthorizerAdmission.auth == nil { if wantAuthorizerAdmission.auth == nil {
@ -44,7 +44,7 @@ func TestWantsAuthorizer(t *testing.T) {
// when the WantsExternalKubeClientSet interface is implemented by a plugin. // when the WantsExternalKubeClientSet interface is implemented by a plugin.
func TestWantsExternalKubeClientSet(t *testing.T) { func TestWantsExternalKubeClientSet(t *testing.T) {
cs := &fake.Clientset{} cs := &fake.Clientset{}
target := initializer.New(cs, nil, &TestAuthorizer{}, nil, nil) target := initializer.New(cs, nil, nil, &TestAuthorizer{}, nil, nil)
wantExternalKubeClientSet := &WantExternalKubeClientSet{} wantExternalKubeClientSet := &WantExternalKubeClientSet{}
target.Initialize(wantExternalKubeClientSet) target.Initialize(wantExternalKubeClientSet)
if wantExternalKubeClientSet.cs != cs { if wantExternalKubeClientSet.cs != cs {
@ -57,7 +57,7 @@ func TestWantsExternalKubeClientSet(t *testing.T) {
func TestWantsExternalKubeInformerFactory(t *testing.T) { func TestWantsExternalKubeInformerFactory(t *testing.T) {
cs := &fake.Clientset{} cs := &fake.Clientset{}
sf := informers.NewSharedInformerFactory(cs, time.Duration(1)*time.Second) sf := informers.NewSharedInformerFactory(cs, time.Duration(1)*time.Second)
target := initializer.New(cs, sf, &TestAuthorizer{}, nil, nil) target := initializer.New(cs, nil, sf, &TestAuthorizer{}, nil, nil)
wantExternalKubeInformerFactory := &WantExternalKubeInformerFactory{} wantExternalKubeInformerFactory := &WantExternalKubeInformerFactory{}
target.Initialize(wantExternalKubeInformerFactory) target.Initialize(wantExternalKubeInformerFactory)
if wantExternalKubeInformerFactory.sf != sf { if wantExternalKubeInformerFactory.sf != sf {
@ -69,7 +69,7 @@ func TestWantsExternalKubeInformerFactory(t *testing.T) {
// when the WantsShutdownSignal interface is implemented by a plugin. // when the WantsShutdownSignal interface is implemented by a plugin.
func TestWantsShutdownNotification(t *testing.T) { func TestWantsShutdownNotification(t *testing.T) {
stopCh := make(chan struct{}) stopCh := make(chan struct{})
target := initializer.New(nil, nil, &TestAuthorizer{}, nil, stopCh) target := initializer.New(nil, nil, nil, &TestAuthorizer{}, nil, stopCh)
wantDrainedNotification := &WantDrainedNotification{} wantDrainedNotification := &WantDrainedNotification{}
target.Initialize(wantDrainedNotification) target.Initialize(wantDrainedNotification)
if wantDrainedNotification.stopCh == nil { if wantDrainedNotification.stopCh == nil {

View File

@ -17,9 +17,11 @@ limitations under the License.
package initializer package initializer
import ( import (
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
"k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/apiserver/pkg/authorization/authorizer"
quota "k8s.io/apiserver/pkg/quota/v1" quota "k8s.io/apiserver/pkg/quota/v1"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/component-base/featuregate" "k8s.io/component-base/featuregate"
@ -68,3 +70,14 @@ type WantsFeatures interface {
InspectFeatureGates(featuregate.FeatureGate) InspectFeatureGates(featuregate.FeatureGate)
admission.InitializationValidator admission.InitializationValidator
} }
type WantsDynamicClient interface {
SetDynamicClient(dynamic.Interface)
admission.InitializationValidator
}
// WantsRESTMapper defines a function which sets RESTMapper for admission plugins that need it.
type WantsRESTMapper interface {
SetRESTMapper(meta.RESTMapper)
admission.InitializationValidator
}

View File

@ -53,7 +53,7 @@ func newHandlerForTestWithClock(c clientset.Interface, cacheClock clock.Clock) (
if err != nil { if err != nil {
return nil, f, err return nil, f, err
} }
pluginInitializer := kubeadmission.New(c, f, nil, nil, nil) pluginInitializer := kubeadmission.New(c, nil, f, nil, nil, nil)
pluginInitializer.Initialize(handler) pluginInitializer.Initialize(handler)
err = admission.ValidateInitialization(handler) err = admission.ValidateInitialization(handler)
return handler, f, err return handler, f, err

View File

@ -35,6 +35,7 @@ import (
apiserverapiv1 "k8s.io/apiserver/pkg/apis/apiserver/v1" apiserverapiv1 "k8s.io/apiserver/pkg/apis/apiserver/v1"
apiserverapiv1alpha1 "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1" apiserverapiv1alpha1 "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1"
"k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
@ -145,7 +146,11 @@ func (a *AdmissionOptions) ApplyTo(
if err != nil { if err != nil {
return err return err
} }
genericInitializer := initializer.New(clientset, informers, c.Authorization.Authorizer, features, c.DrainedNotify()) dynamicClient, err := dynamic.NewForConfig(kubeAPIServerClientConfig)
if err != nil {
return err
}
genericInitializer := initializer.New(clientset, dynamicClient, informers, c.Authorization.Authorizer, features, c.DrainedNotify())
initializersChain := admission.PluginInitializers{genericInitializer} initializersChain := admission.PluginInitializers{genericInitializer}
initializersChain = append(initializersChain, pluginInitializers...) initializersChain = append(initializersChain, pluginInitializers...)