mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-22 03:11:40 +00:00
Remove global variable dependency from runtimeclass admission
This commit is contained in:
parent
13beb9b3ce
commit
57ea7a11a6
@ -16,9 +16,9 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_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:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/initializer: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/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/listers/node/v1beta1: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"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//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/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/node/v1beta1:go_default_library",
|
"//staging/src/k8s.io/api/node/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource: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/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission: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/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",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -31,9 +31,9 @@ import (
|
|||||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
genericadmissioninitailizer "k8s.io/apiserver/pkg/admission/initializer"
|
genericadmissioninitailizer "k8s.io/apiserver/pkg/admission/initializer"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
nodev1beta1listers "k8s.io/client-go/listers/node/v1beta1"
|
nodev1beta1listers "k8s.io/client-go/listers/node/v1beta1"
|
||||||
|
"k8s.io/component-base/featuregate"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
node "k8s.io/kubernetes/pkg/apis/node"
|
node "k8s.io/kubernetes/pkg/apis/node"
|
||||||
nodev1beta1 "k8s.io/kubernetes/pkg/apis/node/v1beta1"
|
nodev1beta1 "k8s.io/kubernetes/pkg/apis/node/v1beta1"
|
||||||
@ -58,6 +58,10 @@ func Register(plugins *admission.Plugins) {
|
|||||||
type RuntimeClass struct {
|
type RuntimeClass struct {
|
||||||
*admission.Handler
|
*admission.Handler
|
||||||
runtimeClassLister nodev1beta1listers.RuntimeClassLister
|
runtimeClassLister nodev1beta1listers.RuntimeClassLister
|
||||||
|
|
||||||
|
inspectedFeatures bool
|
||||||
|
runtimeClassEnabled bool
|
||||||
|
podOverheadEnabled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ admission.MutationInterface = &RuntimeClass{}
|
var _ admission.MutationInterface = &RuntimeClass{}
|
||||||
@ -65,9 +69,16 @@ var _ admission.ValidationInterface = &RuntimeClass{}
|
|||||||
|
|
||||||
var _ genericadmissioninitailizer.WantsExternalKubeInformerFactory = &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.
|
// SetExternalKubeInformerFactory implements the WantsExternalKubeInformerFactory interface.
|
||||||
func (r *RuntimeClass) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
|
func (r *RuntimeClass) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
|
||||||
if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) {
|
if !r.runtimeClassEnabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
runtimeClassInformer := f.Node().V1beta1().RuntimeClasses()
|
runtimeClassInformer := f.Node().V1beta1().RuntimeClasses()
|
||||||
@ -77,7 +88,10 @@ func (r *RuntimeClass) SetExternalKubeInformerFactory(f informers.SharedInformer
|
|||||||
|
|
||||||
// ValidateInitialization implements the WantsExternalKubeInformerFactory interface.
|
// ValidateInitialization implements the WantsExternalKubeInformerFactory interface.
|
||||||
func (r *RuntimeClass) ValidateInitialization() error {
|
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
|
return nil
|
||||||
}
|
}
|
||||||
if r.runtimeClassLister == nil {
|
if r.runtimeClassLister == nil {
|
||||||
@ -88,7 +102,7 @@ func (r *RuntimeClass) ValidateInitialization() error {
|
|||||||
|
|
||||||
// Admit makes an admission decision based on the request attributes
|
// Admit makes an admission decision based on the request attributes
|
||||||
func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attributes, o admission.ObjectInterfaces) error {
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +115,7 @@ func (r *RuntimeClass) Admit(ctx context.Context, attributes admission.Attribute
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) {
|
if r.podOverheadEnabled {
|
||||||
if err := setOverhead(attributes, pod, runtimeClass); err != nil {
|
if err := setOverhead(attributes, pod, runtimeClass); err != nil {
|
||||||
return err
|
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
|
// 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 {
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,7 +143,7 @@ func (r *RuntimeClass) Validate(ctx context.Context, attributes admission.Attrib
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.PodOverhead) {
|
if r.podOverheadEnabled {
|
||||||
if err := validateOverhead(attributes, pod, runtimeClass); err != nil {
|
if err := validateOverhead(attributes, pod, runtimeClass); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -29,10 +29,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"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/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
@ -319,8 +316,6 @@ func NewObjectInterfacesForTest() admission.ObjectInterfaces {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestValidate(t *testing.T) {
|
func TestValidate(t *testing.T) {
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodOverhead, true)()
|
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
runtimeClass *v1beta1.RuntimeClass
|
runtimeClass *v1beta1.RuntimeClass
|
||||||
@ -368,6 +363,8 @@ func TestValidate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
rt := NewRuntimeClass()
|
rt := NewRuntimeClass()
|
||||||
|
rt.runtimeClassEnabled = true
|
||||||
|
rt.podOverheadEnabled = true
|
||||||
o := NewObjectInterfacesForTest()
|
o := NewObjectInterfacesForTest()
|
||||||
for _, tc := range tests {
|
for _, tc := range tests {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
@ -51,6 +51,11 @@ func New(
|
|||||||
// Initialize checks the initialization interfaces implemented by a plugin
|
// Initialize checks the initialization interfaces implemented by a plugin
|
||||||
// and provide the appropriate initialization data
|
// and provide the appropriate initialization data
|
||||||
func (i pluginInitializer) Initialize(plugin admission.Interface) {
|
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 {
|
if wants, ok := plugin.(WantsExternalKubeClientSet); ok {
|
||||||
wants.SetExternalKubeClientSet(i.externalClient)
|
wants.SetExternalKubeClientSet(i.externalClient)
|
||||||
}
|
}
|
||||||
@ -62,10 +67,6 @@ func (i pluginInitializer) Initialize(plugin admission.Interface) {
|
|||||||
if wants, ok := plugin.(WantsAuthorizer); ok {
|
if wants, ok := plugin.(WantsAuthorizer); ok {
|
||||||
wants.SetAuthorizer(i.authorizer)
|
wants.SetAuthorizer(i.authorizer)
|
||||||
}
|
}
|
||||||
|
|
||||||
if wants, ok := plugin.(WantsFeatures); ok {
|
|
||||||
wants.InspectFeatureGates(i.featureGates)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ admission.PluginInitializer = pluginInitializer{}
|
var _ admission.PluginInitializer = pluginInitializer{}
|
||||||
|
Loading…
Reference in New Issue
Block a user