From 62157572cf783736ab42057d3c22b53a8d3f4951 Mon Sep 17 00:00:00 2001 From: deads2k Date: Wed, 19 Jul 2017 15:36:45 -0400 Subject: [PATCH] tighten quota controller interface --- cmd/kube-controller-manager/app/BUILD | 1 + cmd/kube-controller-manager/app/core.go | 7 ++++++- pkg/controller/resourcequota/BUILD | 3 +-- .../resourcequota/resource_quota_controller.go | 14 +++++--------- .../resource_quota_controller_test.go | 10 +++++----- test/integration/quota/quota_test.go | 4 ++-- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD index 821ae23affa..38f9cd2f544 100644 --- a/cmd/kube-controller-manager/app/BUILD +++ b/cmd/kube-controller-manager/app/BUILD @@ -68,6 +68,7 @@ go_library( "//pkg/quota/install:go_default_library", "//pkg/serviceaccount:go_default_library", "//pkg/util/configz:go_default_library", + "//pkg/util/metrics:go_default_library", "//pkg/version:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/aws_ebs:go_default_library", diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index 12de3bd0031..41b9567f610 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -56,6 +56,7 @@ import ( persistentvolumecontroller "k8s.io/kubernetes/pkg/controller/volume/persistentvolume" "k8s.io/kubernetes/pkg/features" quotainstall "k8s.io/kubernetes/pkg/quota/install" + "k8s.io/kubernetes/pkg/util/metrics" ) func startServiceController(ctx ControllerContext) (bool, error) { @@ -230,7 +231,7 @@ func startResourceQuotaController(ctx ControllerContext) (bool, error) { api.Kind("ConfigMap"), } resourceQuotaControllerOptions := &resourcequotacontroller.ResourceQuotaControllerOptions{ - KubeClient: resourceQuotaControllerClient, + QuotaClient: resourceQuotaControllerClient.Core(), ResourceQuotaInformer: ctx.InformerFactory.Core().V1().ResourceQuotas(), ResyncPeriod: controller.StaticResyncPeriodFunc(ctx.Options.ResourceQuotaSyncPeriod.Duration), Registry: resourceQuotaRegistry, @@ -238,6 +239,10 @@ func startResourceQuotaController(ctx ControllerContext) (bool, error) { ReplenishmentResyncPeriod: ResyncPeriod(&ctx.Options), GroupKindsToReplenish: groupKindsToReplenish, } + if resourceQuotaControllerClient.Core().RESTClient().GetRateLimiter() != nil { + metrics.RegisterMetricAndTrackRateLimiterUsage("resource_quota_controller", resourceQuotaControllerClient.Core().RESTClient().GetRateLimiter()) + } + go resourcequotacontroller.NewResourceQuotaController( resourceQuotaControllerOptions, ).Run(int(ctx.Options.ConcurrentResourceQuotaSyncs), ctx.Stop) diff --git a/pkg/controller/resourcequota/BUILD b/pkg/controller/resourcequota/BUILD index 922b4c256dd..df7ed3c6e41 100644 --- a/pkg/controller/resourcequota/BUILD +++ b/pkg/controller/resourcequota/BUILD @@ -22,7 +22,6 @@ go_library( "//pkg/controller:go_default_library", "//pkg/quota:go_default_library", "//pkg/quota/evaluator/core:go_default_library", - "//pkg/util/metrics:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -36,7 +35,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/client-go/util/workqueue:go_default_library", diff --git a/pkg/controller/resourcequota/resource_quota_controller.go b/pkg/controller/resourcequota/resource_quota_controller.go index 77116495465..43acf9878cf 100644 --- a/pkg/controller/resourcequota/resource_quota_controller.go +++ b/pkg/controller/resourcequota/resource_quota_controller.go @@ -32,7 +32,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" coreinformers "k8s.io/client-go/informers/core/v1" - clientset "k8s.io/client-go/kubernetes" + corev1client "k8s.io/client-go/kubernetes/typed/core/v1" corelisters "k8s.io/client-go/listers/core/v1" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" @@ -40,13 +40,12 @@ import ( k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/quota" - "k8s.io/kubernetes/pkg/util/metrics" ) // ResourceQuotaControllerOptions holds options for creating a quota controller type ResourceQuotaControllerOptions struct { // Must have authority to list all quotas, and update quota status - KubeClient clientset.Interface + QuotaClient corev1client.ResourceQuotasGetter // Shared informer for resource quotas ResourceQuotaInformer coreinformers.ResourceQuotaInformer // Controls full recalculation of quota usage @@ -65,7 +64,7 @@ type ResourceQuotaControllerOptions struct { // ResourceQuotaController is responsible for tracking quota usage status in the system type ResourceQuotaController struct { // Must have authority to list all resources in the system, and update quota status - kubeClient clientset.Interface + rqClient corev1client.ResourceQuotasGetter // A lister/getter of resource quota objects rqLister corelisters.ResourceQuotaLister // A list of functions that return true when their caches have synced @@ -87,7 +86,7 @@ type ResourceQuotaController struct { func NewResourceQuotaController(options *ResourceQuotaControllerOptions) *ResourceQuotaController { // build the resource quota controller rq := &ResourceQuotaController{ - kubeClient: options.KubeClient, + rqClient: options.QuotaClient, rqLister: options.ResourceQuotaInformer.Lister(), informerSyncedFuncs: []cache.InformerSynced{options.ResourceQuotaInformer.Informer().HasSynced}, queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "resourcequota_primary"), @@ -96,9 +95,6 @@ func NewResourceQuotaController(options *ResourceQuotaControllerOptions) *Resour registry: options.Registry, replenishmentControllers: []cache.Controller{}, } - if options.KubeClient != nil && options.KubeClient.Core().RESTClient().GetRateLimiter() != nil { - metrics.RegisterMetricAndTrackRateLimiterUsage("resource_quota_controller", options.KubeClient.Core().RESTClient().GetRateLimiter()) - } // set the synchronization handler rq.syncHandler = rq.syncResourceQuotaFromKey @@ -341,7 +337,7 @@ func (rq *ResourceQuotaController) syncResourceQuota(v1ResourceQuota *v1.Resourc if err := k8s_api_v1.Convert_api_ResourceQuota_To_v1_ResourceQuota(&usage, v1Usage, nil); err != nil { return err } - _, err = rq.kubeClient.Core().ResourceQuotas(usage.Namespace).UpdateStatus(v1Usage) + _, err = rq.rqClient.ResourceQuotas(usage.Namespace).UpdateStatus(v1Usage) return err } return nil diff --git a/pkg/controller/resourcequota/resource_quota_controller_test.go b/pkg/controller/resourcequota/resource_quota_controller_test.go index d91d96feca9..3ab76385998 100644 --- a/pkg/controller/resourcequota/resource_quota_controller_test.go +++ b/pkg/controller/resourcequota/resource_quota_controller_test.go @@ -109,7 +109,7 @@ func TestSyncResourceQuota(t *testing.T) { kubeClient := fake.NewSimpleClientset(&podList, &resourceQuota) informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, + QuotaClient: kubeClient.Core(), ResourceQuotaInformer: informerFactory.Core().V1().ResourceQuotas(), ResyncPeriod: controller.NoResyncPeriodFunc, Registry: install.NewRegistry(kubeClient, nil), @@ -196,7 +196,7 @@ func TestSyncResourceQuotaSpecChange(t *testing.T) { kubeClient := fake.NewSimpleClientset(&resourceQuota) informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, + QuotaClient: kubeClient.Core(), ResourceQuotaInformer: informerFactory.Core().V1().ResourceQuotas(), ResyncPeriod: controller.NoResyncPeriodFunc, Registry: install.NewRegistry(kubeClient, nil), @@ -286,7 +286,7 @@ func TestSyncResourceQuotaSpecHardChange(t *testing.T) { kubeClient := fake.NewSimpleClientset(&resourceQuota) informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, + QuotaClient: kubeClient.Core(), ResourceQuotaInformer: informerFactory.Core().V1().ResourceQuotas(), ResyncPeriod: controller.NoResyncPeriodFunc, Registry: install.NewRegistry(kubeClient, nil), @@ -376,7 +376,7 @@ func TestSyncResourceQuotaNoChange(t *testing.T) { kubeClient := fake.NewSimpleClientset(&v1.PodList{}, &resourceQuota) informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, + QuotaClient: kubeClient.Core(), ResourceQuotaInformer: informerFactory.Core().V1().ResourceQuotas(), ResyncPeriod: controller.NoResyncPeriodFunc, Registry: install.NewRegistry(kubeClient, nil), @@ -410,7 +410,7 @@ func TestAddQuota(t *testing.T) { kubeClient := fake.NewSimpleClientset() informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) resourceQuotaControllerOptions := &ResourceQuotaControllerOptions{ - KubeClient: kubeClient, + QuotaClient: kubeClient.Core(), ResourceQuotaInformer: informerFactory.Core().V1().ResourceQuotas(), ResyncPeriod: controller.NoResyncPeriodFunc, Registry: install.NewRegistry(kubeClient, nil), diff --git a/test/integration/quota/quota_test.go b/test/integration/quota/quota_test.go index f1580e74c10..1f226b3c25e 100644 --- a/test/integration/quota/quota_test.go +++ b/test/integration/quota/quota_test.go @@ -106,7 +106,7 @@ func TestQuota(t *testing.T) { api.Kind("Pod"), } resourceQuotaControllerOptions := &resourcequotacontroller.ResourceQuotaControllerOptions{ - KubeClient: clientset, + QuotaClient: clientset.Core(), ResourceQuotaInformer: informers.Core().V1().ResourceQuotas(), ResyncPeriod: controller.NoResyncPeriodFunc, Registry: resourceQuotaRegistry, @@ -291,7 +291,7 @@ func TestQuotaLimitedResourceDenial(t *testing.T) { api.Kind("Pod"), } resourceQuotaControllerOptions := &resourcequotacontroller.ResourceQuotaControllerOptions{ - KubeClient: clientset, + QuotaClient: clientset.Core(), ResourceQuotaInformer: informers.Core().V1().ResourceQuotas(), ResyncPeriod: controller.NoResyncPeriodFunc, Registry: resourceQuotaRegistry,