diff --git a/pkg/controller/podautoscaler/horizontal.go b/pkg/controller/podautoscaler/horizontal.go index b5e7ab38764..176c9e62b17 100644 --- a/pkg/controller/podautoscaler/horizontal.go +++ b/pkg/controller/podautoscaler/horizontal.go @@ -292,9 +292,12 @@ func (a *HorizontalController) reconcileAutoscaler(hpa *autoscaling.HorizontalPo rescaleReason := "" timestamp := time.Now() + rescale := true + if scale.Spec.Replicas == 0 { // Autoscaling is disabled for this resource desiredReplicas = 0 + rescale = false } else if currentReplicas > hpa.Spec.MaxReplicas { rescaleReason = "Current number of replicas above Spec.MaxReplicas" desiredReplicas = hpa.Spec.MaxReplicas @@ -360,9 +363,10 @@ func (a *HorizontalController) reconcileAutoscaler(hpa *autoscaling.HorizontalPo if desiredReplicas > calculateScaleUpLimit(currentReplicas) { desiredReplicas = calculateScaleUpLimit(currentReplicas) } + + rescale = shouldScale(hpa, currentReplicas, desiredReplicas, timestamp) } - rescale := shouldScale(hpa, currentReplicas, desiredReplicas, timestamp) if rescale { scale.Spec.Replicas = desiredReplicas _, err = a.scaleNamespacer.Scales(hpa.Namespace).Update(hpa.Spec.ScaleTargetRef.Kind, scale) diff --git a/pkg/controller/podautoscaler/horizontal_test.go b/pkg/controller/podautoscaler/horizontal_test.go index 0652a4d8ba0..669523ecfa4 100644 --- a/pkg/controller/podautoscaler/horizontal_test.go +++ b/pkg/controller/podautoscaler/horizontal_test.go @@ -96,6 +96,9 @@ type testCase struct { // Target resource information. resource *fakeResource + + // Last scale time + lastScaleTime *unversioned.Time } // Needs to be called under a lock. @@ -1043,4 +1046,36 @@ func TestComputedToleranceAlgImplementation(t *testing.T) { tc.runTest(t) } +func TestScaleUpRCImmediately(t *testing.T) { + time := unversioned.Time{Time: time.Now()} + tc := testCase{ + minReplicas: 2, + maxReplicas: 6, + initialReplicas: 1, + desiredReplicas: 2, + verifyCPUCurrent: true, + reportedLevels: []uint64{0, 0, 0, 0}, + reportedCPURequests: []resource.Quantity{resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0"), resource.MustParse("1.0")}, + useMetricsApi: true, + lastScaleTime: &time, + } + tc.runTest(t) +} + +func TestScaleDownRCImmediately(t *testing.T) { + time := unversioned.Time{Time: time.Now()} + tc := testCase{ + minReplicas: 2, + maxReplicas: 5, + initialReplicas: 6, + desiredReplicas: 5, + CPUTarget: 50, + reportedLevels: []uint64{8000, 9500, 1000}, + reportedCPURequests: []resource.Quantity{resource.MustParse("0.9"), resource.MustParse("1.0"), resource.MustParse("1.1")}, + useMetricsApi: true, + lastScaleTime: &time, + } + tc.runTest(t) +} + // TODO: add more tests