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:
Kubernetes Submit Queue 2018-08-22 18:20:24 -07:00 committed by GitHub
commit d085301d51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 34 deletions

View File

@ -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",
], ],
) )

View File

@ -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)

View File

@ -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