From 21d2377821eee2b24d3bd00d65d2e3c9a26f4221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mudrini=C4=87?= Date: Tue, 28 Aug 2018 09:56:44 +0200 Subject: [PATCH] admission/priority: externalize priority admission controller --- plugin/pkg/admission/priority/BUILD | 13 +++++--- plugin/pkg/admission/priority/admission.go | 27 ++++++++-------- .../pkg/admission/priority/admission_test.go | 31 ++++++++++++++----- 3 files changed, 45 insertions(+), 26 deletions(-) diff --git a/plugin/pkg/admission/priority/BUILD b/plugin/pkg/admission/priority/BUILD index 6489d6830e..513cc84def 100644 --- a/plugin/pkg/admission/priority/BUILD +++ b/plugin/pkg/admission/priority/BUILD @@ -13,13 +13,15 @@ go_test( deps = [ "//pkg/apis/core:go_default_library", "//pkg/apis/scheduling:go_default_library", - "//pkg/client/informers/informers_generated/internalversion:go_default_library", + "//pkg/apis/scheduling/v1beta1:go_default_library", "//pkg/controller:go_default_library", "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1: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/authentication/user:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", "//vendor/github.com/golang/glog:go_default_library", ], ) @@ -31,17 +33,18 @@ go_library( deps = [ "//pkg/apis/core:go_default_library", "//pkg/apis/scheduling:go_default_library", - "//pkg/client/clientset_generated/internalclientset:go_default_library", - "//pkg/client/informers/informers_generated/internalversion:go_default_library", - "//pkg/client/listers/scheduling/internalversion:go_default_library", "//pkg/features:go_default_library", - "//pkg/kubeapiserver/admission:go_default_library", "//pkg/kubelet/types:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1: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/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/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/scheduling/v1beta1:go_default_library", ], ) diff --git a/plugin/pkg/admission/priority/admission.go b/plugin/pkg/admission/priority/admission.go index e7054a4746..8ae7afbe04 100644 --- a/plugin/pkg/admission/priority/admission.go +++ b/plugin/pkg/admission/priority/admission.go @@ -20,18 +20,19 @@ import ( "fmt" "io" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apiserver/pkg/admission" + genericadmissioninitializers "k8s.io/apiserver/pkg/admission/initializer" utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes" + schedulingv1beta1listers "k8s.io/client-go/listers/scheduling/v1beta1" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/scheduling" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" - schedulinglisters "k8s.io/kubernetes/pkg/client/listers/scheduling/internalversion" "k8s.io/kubernetes/pkg/features" - kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission" kubelettypes "k8s.io/kubernetes/pkg/kubelet/types" ) @@ -50,14 +51,14 @@ func Register(plugins *admission.Plugins) { // priorityPlugin is an implementation of admission.Interface. type priorityPlugin struct { *admission.Handler - client internalclientset.Interface - lister schedulinglisters.PriorityClassLister + client kubernetes.Interface + lister schedulingv1beta1listers.PriorityClassLister } var _ admission.MutationInterface = &priorityPlugin{} var _ admission.ValidationInterface = &priorityPlugin{} -var _ = kubeapiserveradmission.WantsInternalKubeInformerFactory(&priorityPlugin{}) -var _ = kubeapiserveradmission.WantsInternalKubeClientSet(&priorityPlugin{}) +var _ = genericadmissioninitializers.WantsExternalKubeInformerFactory(&priorityPlugin{}) +var _ = genericadmissioninitializers.WantsExternalKubeClientSet(&priorityPlugin{}) // NewPlugin creates a new priority admission plugin. func newPlugin() *priorityPlugin { @@ -78,13 +79,13 @@ func (p *priorityPlugin) ValidateInitialization() error { } // SetInternalKubeClientSet implements the WantsInternalKubeClientSet interface. -func (p *priorityPlugin) SetInternalKubeClientSet(client internalclientset.Interface) { +func (p *priorityPlugin) SetExternalKubeClientSet(client kubernetes.Interface) { p.client = client } // SetInternalKubeInformerFactory implements the WantsInternalKubeInformerFactory interface. -func (p *priorityPlugin) SetInternalKubeInformerFactory(f informers.SharedInformerFactory) { - priorityInformer := f.Scheduling().InternalVersion().PriorityClasses() +func (p *priorityPlugin) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) { + priorityInformer := f.Scheduling().V1beta1().PriorityClasses() p.lister = priorityInformer.Lister() p.SetReadyFunc(priorityInformer.Informer().HasSynced) } @@ -241,14 +242,14 @@ func (p *priorityPlugin) validatePriorityClass(a admission.Attributes) error { return nil } -func (p *priorityPlugin) getDefaultPriorityClass() (*scheduling.PriorityClass, error) { +func (p *priorityPlugin) getDefaultPriorityClass() (*schedulingv1beta1.PriorityClass, error) { list, err := p.lister.List(labels.Everything()) if err != nil { return nil, err } // In case more than one global default priority class is added as a result of a race condition, // we pick the one with the lowest priority value. - var defaultPC *scheduling.PriorityClass + var defaultPC *schedulingv1beta1.PriorityClass for _, pci := range list { if pci.GlobalDefault { if defaultPC == nil || defaultPC.Value > pci.Value { diff --git a/plugin/pkg/admission/priority/admission_test.go b/plugin/pkg/admission/priority/admission_test.go index 378d9d515a..19e599b778 100644 --- a/plugin/pkg/admission/priority/admission_test.go +++ b/plugin/pkg/admission/priority/admission_test.go @@ -22,24 +22,31 @@ import ( "github.com/golang/glog" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/authentication/user" utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/client-go/informers" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/scheduling" - informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion" + "k8s.io/kubernetes/pkg/apis/scheduling/v1beta1" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/features" ) -func addPriorityClasses(ctrl *priorityPlugin, priorityClasses []*scheduling.PriorityClass) { +func addPriorityClasses(ctrl *priorityPlugin, priorityClasses []*scheduling.PriorityClass) error { informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc()) - ctrl.SetInternalKubeInformerFactory(informerFactory) + ctrl.SetExternalKubeInformerFactory(informerFactory) // First add the existing classes to the cache. for _, c := range priorityClasses { - informerFactory.Scheduling().InternalVersion().PriorityClasses().Informer().GetStore().Add(c) + s := &schedulingv1beta1.PriorityClass{} + if err := v1beta1.Convert_scheduling_PriorityClass_To_v1beta1_PriorityClass(c, s, nil); err != nil { + return err + } + informerFactory.Scheduling().V1beta1().PriorityClasses().Informer().GetStore().Add(s) } + return nil } var defaultClass1 = &scheduling.PriorityClass{ @@ -135,7 +142,9 @@ func TestPriorityClassAdmission(t *testing.T) { ctrl := newPlugin() // Add existing priority classes. - addPriorityClasses(ctrl, test.existingClasses) + if err := addPriorityClasses(ctrl, test.existingClasses); err != nil { + t.Errorf("Test %q: unable to add object to informer: %v", test.name, err) + } // Now add the new class. attrs := admission.NewAttributesRecord( test.newClass, @@ -220,7 +229,9 @@ func TestDefaultPriority(t *testing.T) { for _, test := range tests { glog.V(4).Infof("starting test %q", test.name) ctrl := newPlugin() - addPriorityClasses(ctrl, test.classesBefore) + if err := addPriorityClasses(ctrl, test.classesBefore); err != nil { + t.Errorf("Test %q: unable to add object to informer: %v", test.name, err) + } defaultPriority, err := ctrl.getDefaultPriority() if err != nil { t.Errorf("Test %q: unexpected error while getting default priority: %v", test.name, err) @@ -234,7 +245,9 @@ func TestDefaultPriority(t *testing.T) { t.Errorf("Test %q: unexpected error received: %v", test.name, err) } } - addPriorityClasses(ctrl, test.classesAfter) + if err := addPriorityClasses(ctrl, test.classesAfter); err != nil { + t.Errorf("Test %q: unable to add object to informer: %v", test.name, err) + } defaultPriority, err = ctrl.getDefaultPriority() if err != nil { t.Errorf("Test %q: unexpected error while getting default priority: %v", test.name, err) @@ -557,7 +570,9 @@ func TestPodAdmission(t *testing.T) { ctrl := newPlugin() // Add existing priority classes. - addPriorityClasses(ctrl, test.existingClasses) + if err := addPriorityClasses(ctrl, test.existingClasses); err != nil { + t.Errorf("Test %q: unable to add object to informer: %v", test.name, err) + } // Create pod. attrs := admission.NewAttributesRecord(