diff --git a/plugin/pkg/admission/runtimeclass/BUILD b/plugin/pkg/admission/runtimeclass/BUILD index 49fc4539670..04b2d5221eb 100644 --- a/plugin/pkg/admission/runtimeclass/BUILD +++ b/plugin/pkg/admission/runtimeclass/BUILD @@ -16,9 +16,9 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/listers/node/v1beta1:go_default_library", + "//staging/src/k8s.io/component-base/featuregate:go_default_library", ], ) @@ -28,7 +28,6 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/node/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", @@ -36,8 +35,6 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", ], ) diff --git a/plugin/pkg/admission/runtimeclass/admission.go b/plugin/pkg/admission/runtimeclass/admission.go index 8f1731bbd02..4af7e826683 100644 --- a/plugin/pkg/admission/runtimeclass/admission.go +++ b/plugin/pkg/admission/runtimeclass/admission.go @@ -31,9 +31,9 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apiserver/pkg/admission" genericadmissioninitailizer "k8s.io/apiserver/pkg/admission/initializer" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/informers" nodev1beta1listers "k8s.io/client-go/listers/node/v1beta1" + "k8s.io/component-base/featuregate" api "k8s.io/kubernetes/pkg/apis/core" node "k8s.io/kubernetes/pkg/apis/node" nodev1beta1 "k8s.io/kubernetes/pkg/apis/node/v1beta1" @@ -58,6 +58,10 @@ func Register(plugins *admission.Plugins) { type RuntimeClass struct { *admission.Handler runtimeClassLister nodev1beta1listers.RuntimeClassLister + + inspectedFeatures bool + runtimeClassEnabled bool + podOverheadEnabled bool } var _ admission.MutationInterface = &RuntimeClass{} @@ -65,9 +69,16 @@ var _ admission.ValidationInterface = &RuntimeClass{} var _ genericadmissioninitailizer.WantsExternalKubeInformerFactory = &RuntimeClass{} +// InspectFeatureGates allows setting bools without taking a dep on a global variable +func (r *RuntimeClass) InspectFeatureGates(featureGates featuregate.FeatureGate) { + r.runtimeClassEnabled = featureGates.Enabled(features.RuntimeClass) + r.podOverheadEnabled = featureGates.Enabled(features.PodOverhead) + r.inspectedFeatures = true +} + // SetExternalKubeInformerFactory implements the WantsExternalKubeInformerFactory interface. func (r *RuntimeClass) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) { - if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) { + if !r.runtimeClassEnabled { return } runtimeClassInformer := f.Node().V1beta1().RuntimeClasses() @@ -77,7 +88,10 @@ func (r *RuntimeClass) SetExternalKubeInformerFactory(f informers.SharedInformer // ValidateInitialization implements the WantsExternalKubeInformerFactory interface. func (r *RuntimeClass) ValidateInitialization() error { - if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) { + if !r.inspectedFeatures { + return fmt.Errorf("InspectFeatureGates was not called") + } + if !r.runtimeClassEnabled { return nil } if r.runtimeClassLister == nil { @@ -88,7 +102,7 @@ func (r *RuntimeClass) ValidateInitialization() error { // Admit makes an admission decision based on the request attributes func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attributes, o admission.ObjectInterfaces) error { - if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) { + if !r.runtimeClassEnabled { return nil } @@ -101,7 +115,7 @@ func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attribute if err != nil { return err } - if utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) { + if r.podOverheadEnabled { if err := setOverhead(attributes, pod, runtimeClass); err != nil { return err } @@ -116,7 +130,7 @@ func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attribute // Validate makes sure that pod adhere's to RuntimeClass's definition func (r *RuntimeClass) Validate(ctx context.Context, attributes admission.Attributes, o admission.ObjectInterfaces) error { - if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) { + if !r.runtimeClassEnabled { return nil } @@ -129,7 +143,7 @@ func (r *RuntimeClass) Validate(ctx context.Context, attributes admission.Attrib if err != nil { return err } - if utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) { + if r.podOverheadEnabled { if err := validateOverhead(attributes, pod, runtimeClass); err != nil { return err } diff --git a/plugin/pkg/admission/runtimeclass/admission_test.go b/plugin/pkg/admission/runtimeclass/admission_test.go index 5e2d74d7827..c5552ee332e 100644 --- a/plugin/pkg/admission/runtimeclass/admission_test.go +++ b/plugin/pkg/admission/runtimeclass/admission_test.go @@ -29,10 +29,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/authentication/user" - utilfeature "k8s.io/apiserver/pkg/util/feature" - featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/features" "github.com/stretchr/testify/assert" ) @@ -319,8 +316,6 @@ func NewObjectInterfacesForTest() admission.ObjectInterfaces { } func TestValidate(t *testing.T) { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodOverhead, true)() - tests := []struct { name string runtimeClass *v1beta1.RuntimeClass @@ -368,6 +363,8 @@ func TestValidate(t *testing.T) { }, } rt := NewRuntimeClass() + rt.runtimeClassEnabled = true + rt.podOverheadEnabled = true o := NewObjectInterfacesForTest() for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { diff --git a/staging/src/k8s.io/apiserver/pkg/admission/initializer/initializer.go b/staging/src/k8s.io/apiserver/pkg/admission/initializer/initializer.go index 740db6d6155..613baf8efaf 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/initializer/initializer.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/initializer/initializer.go @@ -51,6 +51,11 @@ func New( // Initialize checks the initialization interfaces implemented by a plugin // and provide the appropriate initialization data func (i pluginInitializer) Initialize(plugin admission.Interface) { + // First tell the plugin about enabled features, so it can decide whether to start informers or not + if wants, ok := plugin.(WantsFeatures); ok { + wants.InspectFeatureGates(i.featureGates) + } + if wants, ok := plugin.(WantsExternalKubeClientSet); ok { wants.SetExternalKubeClientSet(i.externalClient) } @@ -62,10 +67,6 @@ func (i pluginInitializer) Initialize(plugin admission.Interface) { if wants, ok := plugin.(WantsAuthorizer); ok { wants.SetAuthorizer(i.authorizer) } - - if wants, ok := plugin.(WantsFeatures); ok { - wants.InspectFeatureGates(i.featureGates) - } } var _ admission.PluginInitializer = pluginInitializer{}