Skip to content

Commit 8392baf

Browse files
authored
Merge pull request kubernetes#88632 from liggitt/admission-feature
Remove global variable dependency from runtimeclass admission
2 parents 6416163 + 57ea7a1 commit 8392baf

File tree

4 files changed

+29
-20
lines changed

4 files changed

+29
-20
lines changed

plugin/pkg/admission/runtimeclass/BUILD

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ go_library(
1616
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
1717
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
1818
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
19-
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
2019
"//staging/src/k8s.io/client-go/informers:go_default_library",
2120
"//staging/src/k8s.io/client-go/listers/node/v1beta1:go_default_library",
21+
"//staging/src/k8s.io/component-base/featuregate:go_default_library",
2222
],
2323
)
2424

@@ -28,16 +28,13 @@ go_test(
2828
embed = [":go_default_library"],
2929
deps = [
3030
"//pkg/apis/core:go_default_library",
31-
"//pkg/features:go_default_library",
3231
"//staging/src/k8s.io/api/core/v1:go_default_library",
3332
"//staging/src/k8s.io/api/node/v1beta1:go_default_library",
3433
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
3534
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
3635
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
3736
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
3837
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
39-
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
40-
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
4138
"//vendor/github.com/stretchr/testify/assert:go_default_library",
4239
],
4340
)

plugin/pkg/admission/runtimeclass/admission.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ import (
3131
apierrors "k8s.io/apimachinery/pkg/api/errors"
3232
"k8s.io/apiserver/pkg/admission"
3333
genericadmissioninitailizer "k8s.io/apiserver/pkg/admission/initializer"
34-
utilfeature "k8s.io/apiserver/pkg/util/feature"
3534
"k8s.io/client-go/informers"
3635
nodev1beta1listers "k8s.io/client-go/listers/node/v1beta1"
36+
"k8s.io/component-base/featuregate"
3737
api "k8s.io/kubernetes/pkg/apis/core"
3838
node "k8s.io/kubernetes/pkg/apis/node"
3939
nodev1beta1 "k8s.io/kubernetes/pkg/apis/node/v1beta1"
@@ -58,16 +58,27 @@ func Register(plugins *admission.Plugins) {
5858
type RuntimeClass struct {
5959
*admission.Handler
6060
runtimeClassLister nodev1beta1listers.RuntimeClassLister
61+
62+
inspectedFeatures bool
63+
runtimeClassEnabled bool
64+
podOverheadEnabled bool
6165
}
6266

6367
var _ admission.MutationInterface = &RuntimeClass{}
6468
var _ admission.ValidationInterface = &RuntimeClass{}
6569

6670
var _ genericadmissioninitailizer.WantsExternalKubeInformerFactory = &RuntimeClass{}
6771

72+
// InspectFeatureGates allows setting bools without taking a dep on a global variable
73+
func (r *RuntimeClass) InspectFeatureGates(featureGates featuregate.FeatureGate) {
74+
r.runtimeClassEnabled = featureGates.Enabled(features.RuntimeClass)
75+
r.podOverheadEnabled = featureGates.Enabled(features.PodOverhead)
76+
r.inspectedFeatures = true
77+
}
78+
6879
// SetExternalKubeInformerFactory implements the WantsExternalKubeInformerFactory interface.
6980
func (r *RuntimeClass) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
70-
if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) {
81+
if !r.runtimeClassEnabled {
7182
return
7283
}
7384
runtimeClassInformer := f.Node().V1beta1().RuntimeClasses()
@@ -77,7 +88,10 @@ func (r *RuntimeClass) SetExternalKubeInformerFactory(f informers.SharedInformer
7788

7889
// ValidateInitialization implements the WantsExternalKubeInformerFactory interface.
7990
func (r *RuntimeClass) ValidateInitialization() error {
80-
if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) {
91+
if !r.inspectedFeatures {
92+
return fmt.Errorf("InspectFeatureGates was not called")
93+
}
94+
if !r.runtimeClassEnabled {
8195
return nil
8296
}
8397
if r.runtimeClassLister == nil {
@@ -88,7 +102,7 @@ func (r *RuntimeClass) ValidateInitialization() error {
88102

89103
// Admit makes an admission decision based on the request attributes
90104
func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attributes, o admission.ObjectInterfaces) error {
91-
if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) {
105+
if !r.runtimeClassEnabled {
92106
return nil
93107
}
94108

@@ -101,7 +115,7 @@ func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attribute
101115
if err != nil {
102116
return err
103117
}
104-
if utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) {
118+
if r.podOverheadEnabled {
105119
if err := setOverhead(attributes, pod, runtimeClass); err != nil {
106120
return err
107121
}
@@ -116,7 +130,7 @@ func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attribute
116130

117131
// Validate makes sure that pod adhere's to RuntimeClass's definition
118132
func (r *RuntimeClass) Validate(ctx context.Context, attributes admission.Attributes, o admission.ObjectInterfaces) error {
119-
if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) {
133+
if !r.runtimeClassEnabled {
120134
return nil
121135
}
122136

@@ -129,7 +143,7 @@ func (r *RuntimeClass) Validate(ctx context.Context, attributes admission.Attrib
129143
if err != nil {
130144
return err
131145
}
132-
if utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) {
146+
if r.podOverheadEnabled {
133147
if err := validateOverhead(attributes, pod, runtimeClass); err != nil {
134148
return err
135149
}

plugin/pkg/admission/runtimeclass/admission_test.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ import (
2929
"k8s.io/apimachinery/pkg/runtime"
3030
"k8s.io/apiserver/pkg/admission"
3131
"k8s.io/apiserver/pkg/authentication/user"
32-
utilfeature "k8s.io/apiserver/pkg/util/feature"
33-
featuregatetesting "k8s.io/component-base/featuregate/testing"
3432
"k8s.io/kubernetes/pkg/apis/core"
35-
"k8s.io/kubernetes/pkg/features"
3633

3734
"github.com/stretchr/testify/assert"
3835
)
@@ -319,8 +316,6 @@ func NewObjectInterfacesForTest() admission.ObjectInterfaces {
319316
}
320317

321318
func TestValidate(t *testing.T) {
322-
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodOverhead, true)()
323-
324319
tests := []struct {
325320
name string
326321
runtimeClass *v1beta1.RuntimeClass
@@ -368,6 +363,8 @@ func TestValidate(t *testing.T) {
368363
},
369364
}
370365
rt := NewRuntimeClass()
366+
rt.runtimeClassEnabled = true
367+
rt.podOverheadEnabled = true
371368
o := NewObjectInterfacesForTest()
372369
for _, tc := range tests {
373370
t.Run(tc.name, func(t *testing.T) {

staging/src/k8s.io/apiserver/pkg/admission/initializer/initializer.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ func New(
5151
// Initialize checks the initialization interfaces implemented by a plugin
5252
// and provide the appropriate initialization data
5353
func (i pluginInitializer) Initialize(plugin admission.Interface) {
54+
// First tell the plugin about enabled features, so it can decide whether to start informers or not
55+
if wants, ok := plugin.(WantsFeatures); ok {
56+
wants.InspectFeatureGates(i.featureGates)
57+
}
58+
5459
if wants, ok := plugin.(WantsExternalKubeClientSet); ok {
5560
wants.SetExternalKubeClientSet(i.externalClient)
5661
}
@@ -62,10 +67,6 @@ func (i pluginInitializer) Initialize(plugin admission.Interface) {
6267
if wants, ok := plugin.(WantsAuthorizer); ok {
6368
wants.SetAuthorizer(i.authorizer)
6469
}
65-
66-
if wants, ok := plugin.(WantsFeatures); ok {
67-
wants.InspectFeatureGates(i.featureGates)
68-
}
6970
}
7071

7172
var _ admission.PluginInitializer = pluginInitializer{}

0 commit comments

Comments
 (0)