mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 04:33:26 +00:00
Merge pull request #67704 from yue9944882/refactor/externalize-storage-class-admission-controller
Automatic merge from submit-queue (batch tested with PRs 66973, 67704, 67722, 67723, 63512). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Externalize default storageclass admission controller now continue with this low hanging fruit. and we will seriously step into deep water zone like `resourcequota` 🙃 ref: #66680 /assign deads2k **Release note**: ```release-note NONE ```
This commit is contained in:
commit
d085301d51
@ -13,14 +13,14 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/core/helper:go_default_library",
|
"//pkg/apis/core/helper:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
|
||||||
"//pkg/apis/storage/util:go_default_library",
|
"//pkg/apis/storage/util:go_default_library",
|
||||||
"//pkg/client/informers/informers_generated/internalversion:go_default_library",
|
"//staging/src/k8s.io/api/storage/v1:go_default_library",
|
||||||
"//pkg/client/listers/storage/internalversion:go_default_library",
|
|
||||||
"//pkg/kubeapiserver/admission:go_default_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/apimachinery/pkg/labels:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/labels: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/client-go/informers:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library",
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@ -31,12 +31,12 @@ 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/apis/storage:go_default_library",
|
|
||||||
"//pkg/apis/storage/util:go_default_library",
|
"//pkg/apis/storage/util:go_default_library",
|
||||||
"//pkg/client/informers/informers_generated/internalversion:go_default_library",
|
|
||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/storage/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1: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/client-go/informers:go_default_library",
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -22,16 +22,16 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
storagev1 "k8s.io/api/storage/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
admission "k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
genericadmissioninitializer "k8s.io/apiserver/pkg/admission/initializer"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
|
storagev1listers "k8s.io/client-go/listers/storage/v1"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/core/helper"
|
"k8s.io/kubernetes/pkg/apis/core/helper"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage"
|
|
||||||
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
|
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
|
||||||
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
|
||||||
storagelisters "k8s.io/kubernetes/pkg/client/listers/storage/internalversion"
|
|
||||||
kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -51,12 +51,12 @@ func Register(plugins *admission.Plugins) {
|
|||||||
type claimDefaulterPlugin struct {
|
type claimDefaulterPlugin struct {
|
||||||
*admission.Handler
|
*admission.Handler
|
||||||
|
|
||||||
lister storagelisters.StorageClassLister
|
lister storagev1listers.StorageClassLister
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ admission.Interface = &claimDefaulterPlugin{}
|
var _ admission.Interface = &claimDefaulterPlugin{}
|
||||||
var _ admission.MutationInterface = &claimDefaulterPlugin{}
|
var _ admission.MutationInterface = &claimDefaulterPlugin{}
|
||||||
var _ = kubeapiserveradmission.WantsInternalKubeInformerFactory(&claimDefaulterPlugin{})
|
var _ = genericadmissioninitializer.WantsExternalKubeInformerFactory(&claimDefaulterPlugin{})
|
||||||
|
|
||||||
// newPlugin creates a new admission plugin.
|
// newPlugin creates a new admission plugin.
|
||||||
func newPlugin() *claimDefaulterPlugin {
|
func newPlugin() *claimDefaulterPlugin {
|
||||||
@ -65,8 +65,8 @@ func newPlugin() *claimDefaulterPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *claimDefaulterPlugin) SetInternalKubeInformerFactory(f informers.SharedInformerFactory) {
|
func (a *claimDefaulterPlugin) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
|
||||||
informer := f.Storage().InternalVersion().StorageClasses()
|
informer := f.Storage().V1().StorageClasses()
|
||||||
a.lister = informer.Lister()
|
a.lister = informer.Lister()
|
||||||
a.SetReadyFunc(informer.Informer().HasSynced)
|
a.SetReadyFunc(informer.Informer().HasSynced)
|
||||||
}
|
}
|
||||||
@ -122,13 +122,13 @@ func (a *claimDefaulterPlugin) Admit(attr admission.Attributes) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// getDefaultClass returns the default StorageClass from the store, or nil.
|
// getDefaultClass returns the default StorageClass from the store, or nil.
|
||||||
func getDefaultClass(lister storagelisters.StorageClassLister) (*storage.StorageClass, error) {
|
func getDefaultClass(lister storagev1listers.StorageClassLister) (*storagev1.StorageClass, error) {
|
||||||
list, err := lister.List(labels.Everything())
|
list, err := lister.List(labels.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultClasses := []*storage.StorageClass{}
|
defaultClasses := []*storagev1.StorageClass{}
|
||||||
for _, class := range list {
|
for _, class := range list {
|
||||||
if storageutil.IsDefaultAnnotation(class.ObjectMeta) {
|
if storageutil.IsDefaultAnnotation(class.ObjectMeta) {
|
||||||
defaultClasses = append(defaultClasses, class)
|
defaultClasses = append(defaultClasses, class)
|
||||||
|
@ -21,12 +21,12 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
storagev1 "k8s.io/api/storage/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage"
|
|
||||||
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
|
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
|
||||||
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ func TestAdmission(t *testing.T) {
|
|||||||
empty := ""
|
empty := ""
|
||||||
foo := "foo"
|
foo := "foo"
|
||||||
|
|
||||||
defaultClass1 := &storage.StorageClass{
|
defaultClass1 := &storagev1.StorageClass{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
Kind: "StorageClass",
|
Kind: "StorageClass",
|
||||||
},
|
},
|
||||||
@ -46,7 +46,7 @@ func TestAdmission(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Provisioner: "default1",
|
Provisioner: "default1",
|
||||||
}
|
}
|
||||||
defaultClass2 := &storage.StorageClass{
|
defaultClass2 := &storagev1.StorageClass{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
Kind: "StorageClass",
|
Kind: "StorageClass",
|
||||||
},
|
},
|
||||||
@ -59,7 +59,7 @@ func TestAdmission(t *testing.T) {
|
|||||||
Provisioner: "default2",
|
Provisioner: "default2",
|
||||||
}
|
}
|
||||||
// Class that has explicit default = false
|
// Class that has explicit default = false
|
||||||
classWithFalseDefault := &storage.StorageClass{
|
classWithFalseDefault := &storagev1.StorageClass{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
Kind: "StorageClass",
|
Kind: "StorageClass",
|
||||||
},
|
},
|
||||||
@ -72,7 +72,7 @@ func TestAdmission(t *testing.T) {
|
|||||||
Provisioner: "nondefault1",
|
Provisioner: "nondefault1",
|
||||||
}
|
}
|
||||||
// Class with missing default annotation (=non-default)
|
// Class with missing default annotation (=non-default)
|
||||||
classWithNoDefault := &storage.StorageClass{
|
classWithNoDefault := &storagev1.StorageClass{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
Kind: "StorageClass",
|
Kind: "StorageClass",
|
||||||
},
|
},
|
||||||
@ -82,7 +82,7 @@ func TestAdmission(t *testing.T) {
|
|||||||
Provisioner: "nondefault1",
|
Provisioner: "nondefault1",
|
||||||
}
|
}
|
||||||
// Class with empty default annotation (=non-default)
|
// Class with empty default annotation (=non-default)
|
||||||
classWithEmptyDefault := &storage.StorageClass{
|
classWithEmptyDefault := &storagev1.StorageClass{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
Kind: "StorageClass",
|
Kind: "StorageClass",
|
||||||
},
|
},
|
||||||
@ -131,56 +131,56 @@ func TestAdmission(t *testing.T) {
|
|||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
classes []*storage.StorageClass
|
classes []*storagev1.StorageClass
|
||||||
claim *api.PersistentVolumeClaim
|
claim *api.PersistentVolumeClaim
|
||||||
expectError bool
|
expectError bool
|
||||||
expectedClassName string
|
expectedClassName string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
"no default, no modification of PVCs",
|
"no default, no modification of PVCs",
|
||||||
[]*storage.StorageClass{classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
claimWithNoClass,
|
claimWithNoClass,
|
||||||
false,
|
false,
|
||||||
"",
|
"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"one default, modify PVC with class=nil",
|
"one default, modify PVC with class=nil",
|
||||||
[]*storage.StorageClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
claimWithNoClass,
|
claimWithNoClass,
|
||||||
false,
|
false,
|
||||||
"default1",
|
"default1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"one default, no modification of PVC with class=''",
|
"one default, no modification of PVC with class=''",
|
||||||
[]*storage.StorageClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
claimWithEmptyClass,
|
claimWithEmptyClass,
|
||||||
false,
|
false,
|
||||||
"",
|
"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"one default, no modification of PVC with class='foo'",
|
"one default, no modification of PVC with class='foo'",
|
||||||
[]*storage.StorageClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{defaultClass1, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
claimWithClass,
|
claimWithClass,
|
||||||
false,
|
false,
|
||||||
"foo",
|
"foo",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"two defaults, error with PVC with class=nil",
|
"two defaults, error with PVC with class=nil",
|
||||||
[]*storage.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
claimWithNoClass,
|
claimWithNoClass,
|
||||||
true,
|
true,
|
||||||
"",
|
"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"two defaults, no modification of PVC with class=''",
|
"two defaults, no modification of PVC with class=''",
|
||||||
[]*storage.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
claimWithEmptyClass,
|
claimWithEmptyClass,
|
||||||
false,
|
false,
|
||||||
"",
|
"",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"two defaults, no modification of PVC with class='foo'",
|
"two defaults, no modification of PVC with class='foo'",
|
||||||
[]*storage.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
[]*storagev1.StorageClass{defaultClass1, defaultClass2, classWithFalseDefault, classWithNoDefault, classWithEmptyDefault},
|
||||||
claimWithClass,
|
claimWithClass,
|
||||||
false,
|
false,
|
||||||
"foo",
|
"foo",
|
||||||
@ -195,9 +195,9 @@ func TestAdmission(t *testing.T) {
|
|||||||
|
|
||||||
ctrl := newPlugin()
|
ctrl := newPlugin()
|
||||||
informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc())
|
||||||
ctrl.SetInternalKubeInformerFactory(informerFactory)
|
ctrl.SetExternalKubeInformerFactory(informerFactory)
|
||||||
for _, c := range test.classes {
|
for _, c := range test.classes {
|
||||||
informerFactory.Storage().InternalVersion().StorageClasses().Informer().GetStore().Add(c)
|
informerFactory.Storage().V1().StorageClasses().Informer().GetStore().Add(c)
|
||||||
}
|
}
|
||||||
attrs := admission.NewAttributesRecord(
|
attrs := admission.NewAttributesRecord(
|
||||||
claim, // new object
|
claim, // new object
|
||||||
|
Loading…
Reference in New Issue
Block a user