Deflake HPA tests

- Scale down based on custom metric was flaking. Increase target value
of the metric.
- Scale down based on CPU was flaking during stabilization. Increase
tolerance of stabilization (caused by resource consumer using more CPU
than requested).
This commit is contained in:
Joachim Bartosik 2018-10-30 17:50:54 +01:00
parent 76234a31b0
commit cb6a8a2564
3 changed files with 13 additions and 7 deletions

View File

@ -109,7 +109,7 @@ var _ = SIGDescribe("[HPA] Horizontal pod autoscaling (scale resource: Custom Me
initialReplicas := 2 initialReplicas := 2
// metric should cause scale down // metric should cause scale down
metricValue := externalMetricValue metricValue := externalMetricValue
metricAverageTarget := 2 * metricValue metricAverageTarget := (3 * metricValue) / 2
metricTargets := map[string]externalMetricTarget{ metricTargets := map[string]externalMetricTarget{
"target_average": { "target_average": {
value: metricAverageTarget, value: metricAverageTarget,

View File

@ -102,7 +102,7 @@ type HPAScaleTest struct {
targetCPUUtilizationPercent int32 targetCPUUtilizationPercent int32
minPods int32 minPods int32
maxPods int32 maxPods int32
firstScale int32 firstScale int
firstScaleStasis time.Duration firstScaleStasis time.Duration
cpuBurst int cpuBurst int
secondScale int32 secondScale int32
@ -120,9 +120,9 @@ func (scaleTest *HPAScaleTest) run(name string, kind schema.GroupVersionKind, rc
defer rc.CleanUp() defer rc.CleanUp()
hpa := common.CreateCPUHorizontalPodAutoscaler(rc, scaleTest.targetCPUUtilizationPercent, scaleTest.minPods, scaleTest.maxPods) hpa := common.CreateCPUHorizontalPodAutoscaler(rc, scaleTest.targetCPUUtilizationPercent, scaleTest.minPods, scaleTest.maxPods)
defer common.DeleteHorizontalPodAutoscaler(rc, hpa.Name) defer common.DeleteHorizontalPodAutoscaler(rc, hpa.Name)
rc.WaitForReplicas(int(scaleTest.firstScale), timeToWait) rc.WaitForReplicas(scaleTest.firstScale, timeToWait)
if scaleTest.firstScaleStasis > 0 { if scaleTest.firstScaleStasis > 0 {
rc.EnsureDesiredReplicas(int(scaleTest.firstScale), scaleTest.firstScaleStasis) rc.EnsureDesiredReplicasInRange(scaleTest.firstScale, scaleTest.firstScale+1, scaleTest.firstScaleStasis)
} }
if scaleTest.cpuBurst > 0 && scaleTest.secondScale > 0 { if scaleTest.cpuBurst > 0 && scaleTest.secondScale > 0 {
rc.ConsumeCPU(scaleTest.cpuBurst) rc.ConsumeCPU(scaleTest.cpuBurst)

View File

@ -370,12 +370,18 @@ func (rc *ResourceConsumer) WaitForReplicas(desiredReplicas int, duration time.D
} }
func (rc *ResourceConsumer) EnsureDesiredReplicas(desiredReplicas int, duration time.Duration) { func (rc *ResourceConsumer) EnsureDesiredReplicas(desiredReplicas int, duration time.Duration) {
rc.EnsureDesiredReplicasInRange(desiredReplicas, desiredReplicas, duration)
}
func (rc *ResourceConsumer) EnsureDesiredReplicasInRange(minDesiredReplicas, maxDesiredReplicas int, duration time.Duration) {
interval := 10 * time.Second interval := 10 * time.Second
err := wait.PollImmediate(interval, duration, func() (bool, error) { err := wait.PollImmediate(interval, duration, func() (bool, error) {
replicas := rc.GetReplicas() replicas := rc.GetReplicas()
framework.Logf("expecting there to be %d replicas (are: %d)", desiredReplicas, replicas) framework.Logf("expecting there to be in [%d, %d] replicas (are: %d)", minDesiredReplicas, maxDesiredReplicas, replicas)
if replicas != desiredReplicas { if replicas < minDesiredReplicas {
return false, fmt.Errorf("number of replicas changed unexpectedly") return false, fmt.Errorf("number of replicas below target")
} else if replicas > maxDesiredReplicas {
return false, fmt.Errorf("number of replicas above target")
} else { } else {
return false, nil // Expected number of replicas found. Continue polling until timeout. return false, nil // Expected number of replicas found. Continue polling until timeout.
} }