From 0fe4910f935f4f13e2264eba7cf6fd2ee7f39315 Mon Sep 17 00:00:00 2001 From: Zhe Jin Date: Fri, 8 Sep 2017 11:42:00 +0800 Subject: [PATCH] update resource quota --- cmd/app/server.go | 2 +- pkg/controller/controller.go | 7 ++++-- pkg/controller/quota_manager.go | 41 +++++++++++++++++++++++++++------ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/cmd/app/server.go b/cmd/app/server.go index cd32a80d3..6035e00dc 100644 --- a/cmd/app/server.go +++ b/cmd/app/server.go @@ -44,7 +44,7 @@ func Run(opt *options.ServerOption) error { go cache.Run(neverStop) // TODO dump cache information and do something - c := controller.NewResourceQuotaAllocatorController(cache, proportion.New()) + c := controller.NewResourceQuotaAllocatorController(config, cache, proportion.New()) c.Run() return nil diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index d26584aeb..c87dcbf05 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -23,6 +23,7 @@ import ( "github.com/kubernetes-incubator/kube-arbitrator/pkg/schedulercache" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/rest" ) type ResourceQuotaAllocatorController struct { @@ -31,11 +32,13 @@ type ResourceQuotaAllocatorController struct { quotaManager *quotaManager } -func NewResourceQuotaAllocatorController(cache schedulercache.Cache, allocator policy.Interface) *ResourceQuotaAllocatorController { +func NewResourceQuotaAllocatorController(config *rest.Config, cache schedulercache.Cache, allocator policy.Interface) *ResourceQuotaAllocatorController { rqaController := &ResourceQuotaAllocatorController{ cache: cache, allocator: allocator, - quotaManager: "aManager{}, + quotaManager: "aManager{ + config: config, + }, } return rqaController diff --git a/pkg/controller/quota_manager.go b/pkg/controller/quota_manager.go index b1b681f95..d1abaf2b1 100644 --- a/pkg/controller/quota_manager.go +++ b/pkg/controller/quota_manager.go @@ -20,9 +20,14 @@ import ( "fmt" "github.com/kubernetes-incubator/kube-arbitrator/pkg/schedulercache" + "k8s.io/client-go/rest" + "k8s.io/client-go/kubernetes" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/api/resource" ) type quotaManager struct { + config *rest.Config } func (qm *quotaManager) updateQuota(allocator *schedulercache.ResourceQuotaAllocatorInfo) { @@ -31,14 +36,36 @@ func (qm *quotaManager) updateQuota(allocator *schedulercache.ResourceQuotaAlloc return } - fmt.Println("======================== QuotaManager.updateQuota") - fmt.Println(" Spec.Share:") - for k, v := range allocator.Allocator().Spec.Share { - fmt.Printf(" %s: %s\n", k, v.String()) + ns, ok := allocator.Allocator().Spec.Share["ns"] + if !ok { + fmt.Println("can't find ns field") + return } - fmt.Println(" Status.Share:") - for k, v := range allocator.Allocator().Status.Share { - fmt.Printf(" %s: %s\n", k, v.String()) + + cs := kubernetes.NewForConfigOrDie(qm.config) + rqController := cs.CoreV1().ResourceQuotas(ns.String()) + var options meta_v1.ListOptions + rqList, err := rqController.List(options) + if len(rqList.Items) != 1 || err != nil { + fmt.Println("failed to list quota") + return + } + for _, rq := range rqList.Items { + rqupdate := rq.DeepCopy() + for k, v := range allocator.Allocator().Status.Share { + switch k { + case "cpu": + rqupdate.Spec.Hard["limits.cpu"] = resource.MustParse(v.String()) + rqupdate.Spec.Hard["requests.cpu"] = resource.MustParse(v.String()) + case "memory": + rqupdate.Spec.Hard["limits.memory"] = resource.MustParse(v.String()) + rqupdate.Spec.Hard["requests.memory"] = resource.MustParse(v.String()) + } + } + _, err := rqController.Update(rqupdate) + if err != nil { + fmt.Println("failed to update") + } } }