From 15fc230a59207f3dd7f309dab77677c939b4b78d Mon Sep 17 00:00:00 2001 From: Solly Ross Date: Mon, 2 Nov 2015 10:18:53 -0500 Subject: [PATCH] Make HPA Controller use Namespacers The HPA controller had previously used a single Client object to act as three different Namespacers. To improve ease of extensibility and to make it clearer what the HPA controller actually needs to use from the client, it should use separate Namespacers for each of its needs (Scales, HPAs, and Events). --- .../app/controllermanager.go | 2 +- pkg/controller/podautoscaler/horizontal.go | 23 +++++++++++-------- .../podautoscaler/horizontal_test.go | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index eec5d2c8b13..ffaea0ba59a 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -365,7 +365,7 @@ func (s *CMServer) Run(_ []string) error { metrics.DefaultHeapsterService, metrics.DefaultHeapsterPort, ) - podautoscaler.NewHorizontalController(hpaClient, metricsClient). + podautoscaler.NewHorizontalController(hpaClient, hpaClient, hpaClient, metricsClient). Run(s.HorizontalPodAutoscalerSyncPeriod) } diff --git a/pkg/controller/podautoscaler/horizontal.go b/pkg/controller/podautoscaler/horizontal.go index 979d816b789..4220f6158fc 100644 --- a/pkg/controller/podautoscaler/horizontal.go +++ b/pkg/controller/podautoscaler/horizontal.go @@ -38,7 +38,9 @@ const ( ) type HorizontalController struct { - client client.Interface + scaleNamespacer client.ScaleNamespacer + hpaNamespacer client.HorizontalPodAutoscalersNamespacer + metricsClient metrics.MetricsClient eventRecorder record.EventRecorder } @@ -46,15 +48,16 @@ type HorizontalController struct { var downscaleForbiddenWindow = 5 * time.Minute var upscaleForbiddenWindow = 3 * time.Minute -func NewHorizontalController(client client.Interface, metricsClient metrics.MetricsClient) *HorizontalController { +func NewHorizontalController(evtNamespacer client.EventNamespacer, scaleNamespacer client.ScaleNamespacer, hpaNamespacer client.HorizontalPodAutoscalersNamespacer, metricsClient metrics.MetricsClient) *HorizontalController { broadcaster := record.NewBroadcaster() - broadcaster.StartRecordingToSink(client.Events("")) + broadcaster.StartRecordingToSink(evtNamespacer.Events("")) recorder := broadcaster.NewRecorder(api.EventSource{Component: "horizontal-pod-autoscaler"}) return &HorizontalController{ - client: client, - metricsClient: metricsClient, - eventRecorder: recorder, + metricsClient: metricsClient, + eventRecorder: recorder, + scaleNamespacer: scaleNamespacer, + hpaNamespacer: hpaNamespacer, } } @@ -93,7 +96,7 @@ func (a *HorizontalController) computeReplicasForCPUUtilization(hpa extensions.H func (a *HorizontalController) reconcileAutoscaler(hpa extensions.HorizontalPodAutoscaler) error { reference := fmt.Sprintf("%s/%s/%s", hpa.Spec.ScaleRef.Kind, hpa.Namespace, hpa.Spec.ScaleRef.Name) - scale, err := a.client.Extensions().Scales(hpa.Namespace).Get(hpa.Spec.ScaleRef.Kind, hpa.Spec.ScaleRef.Name) + scale, err := a.scaleNamespacer.Scales(hpa.Namespace).Get(hpa.Spec.ScaleRef.Kind, hpa.Spec.ScaleRef.Name) if err != nil { a.eventRecorder.Event(&hpa, api.EventTypeWarning, "FailedGetScale", err.Error()) return fmt.Errorf("failed to query scale subresource for %s: %v", reference, err) @@ -140,7 +143,7 @@ func (a *HorizontalController) reconcileAutoscaler(hpa extensions.HorizontalPodA if rescale { scale.Spec.Replicas = desiredReplicas - _, err = a.client.Extensions().Scales(hpa.Namespace).Update(hpa.Spec.ScaleRef.Kind, scale) + _, err = a.scaleNamespacer.Scales(hpa.Namespace).Update(hpa.Spec.ScaleRef.Kind, scale) if err != nil { a.eventRecorder.Eventf(&hpa, api.EventTypeWarning, "FailedRescale", "New size: %d; error: %v", desiredReplicas, err.Error()) return fmt.Errorf("failed to rescale %s: %v", reference, err) @@ -163,7 +166,7 @@ func (a *HorizontalController) reconcileAutoscaler(hpa extensions.HorizontalPodA hpa.Status.LastScaleTime = &now } - _, err = a.client.Extensions().HorizontalPodAutoscalers(hpa.Namespace).UpdateStatus(&hpa) + _, err = a.hpaNamespacer.HorizontalPodAutoscalers(hpa.Namespace).UpdateStatus(&hpa) if err != nil { a.eventRecorder.Event(&hpa, api.EventTypeWarning, "FailedUpdateStatus", err.Error()) return fmt.Errorf("failed to update status for %s: %v", hpa.Name, err) @@ -173,7 +176,7 @@ func (a *HorizontalController) reconcileAutoscaler(hpa extensions.HorizontalPodA func (a *HorizontalController) reconcileAutoscalers() error { ns := api.NamespaceAll - list, err := a.client.Extensions().HorizontalPodAutoscalers(ns).List(api.ListOptions{}) + list, err := a.hpaNamespacer.HorizontalPodAutoscalers(ns).List(api.ListOptions{}) if err != nil { return fmt.Errorf("error listing nodes: %v", err) } diff --git a/pkg/controller/podautoscaler/horizontal_test.go b/pkg/controller/podautoscaler/horizontal_test.go index 03334e7f509..ea51a2273cd 100644 --- a/pkg/controller/podautoscaler/horizontal_test.go +++ b/pkg/controller/podautoscaler/horizontal_test.go @@ -206,7 +206,7 @@ func (tc *testCase) verifyResults(t *testing.T) { func (tc *testCase) runTest(t *testing.T) { testClient := tc.prepareTestClient(t) metricsClient := metrics.NewHeapsterMetricsClient(testClient, metrics.DefaultHeapsterNamespace, metrics.DefaultHeapsterScheme, metrics.DefaultHeapsterService, metrics.DefaultHeapsterPort) - hpaController := NewHorizontalController(testClient, metricsClient) + hpaController := NewHorizontalController(testClient, testClient.Extensions(), testClient.Extensions(), metricsClient) err := hpaController.reconcileAutoscalers() assert.Equal(t, nil, err) if tc.verifyEvents {