From 7fb7d765be66fac3284a9816a40397a7207158a6 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Fri, 28 Aug 2015 23:28:03 -0400 Subject: [PATCH] Handle scaling up in scaling library next_batch() function Handle the case where targ_capacity > curr_capacity. Change-Id: I53d6f51a3ff0f7e813720e28f9decfc8ef118a89 Partially-Implements: blueprint scaling-group-common --- heat/scaling/rolling_update.py | 12 ++-- heat/tests/autoscaling/test_rolling_update.py | 66 +++++++++++++++++++ 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/heat/scaling/rolling_update.py b/heat/scaling/rolling_update.py index 7dec0fd21c..c662aa4c6e 100644 --- a/heat/scaling/rolling_update.py +++ b/heat/scaling/rolling_update.py @@ -36,13 +36,13 @@ def next_batch(targ_capacity, curr_capacity, num_up_to_date, batch_size, update. """ - efft_min_sz = min(min_in_service, targ_capacity) + assert num_up_to_date <= curr_capacity + + efft_min_sz = min(min_in_service, targ_capacity, curr_capacity) efft_bat_sz = min(batch_size, max(targ_capacity - num_up_to_date, 0)) - if num_up_to_date >= efft_min_sz: - new_capacity = targ_capacity - else: - new_capacity = max(targ_capacity - efft_bat_sz, - efft_min_sz) + efft_bat_sz + new_capacity = efft_bat_sz + max(min(curr_capacity, + targ_capacity - efft_bat_sz), + efft_min_sz) return new_capacity, efft_bat_sz diff --git a/heat/tests/autoscaling/test_rolling_update.py b/heat/tests/autoscaling/test_rolling_update.py index 14b1ea67ad..c902172bbc 100644 --- a/heat/tests/autoscaling/test_rolling_update.py +++ b/heat/tests/autoscaling/test_rolling_update.py @@ -120,6 +120,72 @@ class TestNextBatch(common.HeatTestCase): batch=(8, 4))), ('4_4_4_5_6', dict(targ=4, curr=4, updated=4, bat_size=5, min_srv=6, batch=(4, 0))), + ('6_4_0_1_0', dict(targ=6, curr=4, updated=0, bat_size=1, min_srv=0, + batch=(5, 1))), + ('6_5_1_1_0', dict(targ=6, curr=5, updated=1, bat_size=1, min_srv=0, + batch=(6, 1))), + ('6_4_0_1_4', dict(targ=6, curr=4, updated=0, bat_size=1, min_srv=4, + batch=(5, 1))), + ('6_5_1_1_4', dict(targ=6, curr=5, updated=1, bat_size=1, min_srv=4, + batch=(6, 1))), + ('6_4_0_2_0', dict(targ=6, curr=4, updated=0, bat_size=2, min_srv=0, + batch=(6, 2))), + ('6_4_0_2_4', dict(targ=6, curr=4, updated=0, bat_size=2, min_srv=4, + batch=(6, 2))), + ('6_5_0_2_0', dict(targ=6, curr=5, updated=0, bat_size=2, min_srv=0, + batch=(6, 2))), + ('6_5_0_2_4', dict(targ=6, curr=5, updated=0, bat_size=2, min_srv=4, + batch=(6, 2))), + ('6_3_0_2_0', dict(targ=6, curr=3, updated=0, bat_size=2, min_srv=0, + batch=(5, 2))), + ('6_5_2_2_0', dict(targ=6, curr=5, updated=2, bat_size=2, min_srv=0, + batch=(6, 2))), + ('6_5_4_2_0', dict(targ=6, curr=5, updated=4, bat_size=2, min_srv=0, + batch=(6, 2))), + ('6_3_0_2_4', dict(targ=6, curr=3, updated=0, bat_size=2, min_srv=4, + batch=(5, 2))), + ('6_5_2_2_4', dict(targ=6, curr=5, updated=2, bat_size=2, min_srv=4, + batch=(6, 2))), + ('6_5_4_2_4', dict(targ=6, curr=5, updated=4, bat_size=2, min_srv=4, + batch=(6, 2))), + ('6_4_0_4_0', dict(targ=6, curr=4, updated=0, bat_size=4, min_srv=0, + batch=(6, 4))), + ('6_4_4_4_0', dict(targ=6, curr=4, updated=4, bat_size=4, min_srv=0, + batch=(6, 2))), + ('6_4_0_5_0', dict(targ=6, curr=4, updated=0, bat_size=5, min_srv=0, + batch=(6, 5))), + ('6_6_5_4_0', dict(targ=6, curr=6, updated=5, bat_size=4, min_srv=0, + batch=(6, 1))), + ('6_4_0_4_1', dict(targ=6, curr=4, updated=0, bat_size=4, min_srv=1, + batch=(6, 4))), + ('6_6_4_4_1', dict(targ=6, curr=6, updated=4, bat_size=4, min_srv=1, + batch=(6, 2))), + ('6_4_0_6_1', dict(targ=6, curr=4, updated=0, bat_size=6, min_srv=1, + batch=(7, 6))), + ('6_7_5_6_1', dict(targ=6, curr=7, updated=5, bat_size=6, min_srv=1, + batch=(6, 1))), + ('6_4_0_4_2', dict(targ=6, curr=4, updated=0, bat_size=4, min_srv=2, + batch=(6, 4))), + ('6_4_4_4_2', dict(targ=6, curr=4, updated=4, bat_size=4, min_srv=2, + batch=(6, 2))), + ('6_4_0_4_4', dict(targ=6, curr=4, updated=0, bat_size=4, min_srv=4, + batch=(8, 4))), + ('6_8_4_4_4', dict(targ=6, curr=4, updated=4, bat_size=4, min_srv=4, + batch=(6, 2))), + ('6_8_2_4_4', dict(targ=6, curr=8, updated=2, bat_size=4, min_srv=4, + batch=(8, 4))), + ('6_8_6_4_4', dict(targ=6, curr=8, updated=6, bat_size=4, min_srv=4, + batch=(6, 0))), + ('6_4_0_5_6', dict(targ=6, curr=4, updated=0, bat_size=5, min_srv=6, + batch=(9, 5))), + ('6_9_5_5_6', dict(targ=6, curr=9, updated=5, bat_size=5, min_srv=6, + batch=(7, 1))), + ('6_9_2_5_6', dict(targ=6, curr=9, updated=2, bat_size=5, min_srv=6, + batch=(10, 4))), + ('6_A_5_5_6', dict(targ=6, curr=10, updated=5, bat_size=5, min_srv=6, + batch=(7, 1))), + ('6_7_6_5_6', dict(targ=6, curr=7, updated=6, bat_size=5, min_srv=6, + batch=(6, 0))), ] def test_next_batch(self):