Skip to content

Commit a8c0b11

Browse files
author
Eoghan Glynn
committed
Use all available headroom for autoscaling
Fixes bug 1254796 Previously, potential headroom for autoscaling group growth or shrinkage would remain unused unless the adjustment exactly hit the max or min size respectively. Now, we truncate the adjustment to the upper or lower bound in the case of an over-shoot. Change-Id: I760be999039f7038dab77cb8b77a0f683ef56db3
1 parent f33297d commit a8c0b11

File tree

2 files changed

+40
-23
lines changed

2 files changed

+40
-23
lines changed

heat/engine/resources/autoscaling.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -420,12 +420,23 @@ def adjust(self, adjustment, adjustment_type='ChangeInCapacity'):
420420
else math.ceil(delta))
421421
new_capacity = capacity + rounded
422422

423-
if new_capacity > int(self.properties['MaxSize']):
424-
logger.warn('can not exceed %s' % self.properties['MaxSize'])
425-
return
426-
if new_capacity < int(self.properties['MinSize']):
427-
logger.warn('can not be less than %s' % self.properties['MinSize'])
428-
return
423+
upper = int(self.properties['MaxSize'])
424+
lower = int(self.properties['MinSize'])
425+
426+
if new_capacity > upper:
427+
if upper > capacity:
428+
logger.info(_('truncating growth to %s') % upper)
429+
new_capacity = upper
430+
else:
431+
logger.warn(_('can not exceed %s') % upper)
432+
return
433+
if new_capacity < lower:
434+
if lower < capacity:
435+
logger.info(_('truncating shrinkage to %s') % lower)
436+
new_capacity = lower
437+
else:
438+
logger.warn(_('can not be less than %s') % lower)
439+
return
429440

430441
if new_capacity == capacity:
431442
logger.debug('no change in capacity %d' % capacity)

heat/tests/test_autoscaling.py

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ def test_scaling_group_scale_up_failure(self):
801801

802802
self.m.VerifyAll()
803803

804-
def test_scaling_group_nochange(self):
804+
def test_scaling_group_truncate_adjustment(self):
805805
t = template_format.parse(as_template)
806806
stack = utils.parse_stack(t, params=self.params)
807807

@@ -819,33 +819,39 @@ def test_scaling_group_nochange(self):
819819
rsrc.get_instance_names())
820820

821821
# raise above the max
822+
self._stub_lb_reload(5)
823+
self._stub_meta_expected(now, 'ChangeInCapacity : 4')
824+
self._stub_create(3)
825+
self.m.ReplayAll()
822826
rsrc.adjust(4)
823-
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
824-
rsrc.get_instance_names())
827+
self._verify_instance_names(rsrc, 5)
825828

826829
# lower below the min
827-
rsrc.adjust(-2)
828-
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
829-
rsrc.get_instance_names())
830+
self._stub_lb_reload(1)
831+
self._stub_validate()
832+
self._stub_meta_expected(now, 'ChangeInCapacity : -5')
833+
self.m.ReplayAll()
834+
rsrc.adjust(-5)
835+
self._verify_instance_names(rsrc, 1)
830836

831837
# no change
832838
rsrc.adjust(0)
833-
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
834-
rsrc.get_instance_names())
839+
self._verify_instance_names(rsrc, 1)
840+
835841
rsrc.delete()
836842
self.m.VerifyAll()
837843

844+
def _verify_instance_names(self, group, bound):
845+
instance_names = group.get_instance_names()
846+
self.assertEqual(len(instance_names), bound)
847+
for i in xrange(bound):
848+
self.assertEqual('WebServerGroup-%d' % i, instance_names[i])
849+
838850
def _do_test_scaling_group_percent(self, decrease, lowest,
839851
increase, create, highest):
840852
t = template_format.parse(as_template)
841853
stack = utils.parse_stack(t, params=self.params)
842854

843-
def _verify_instance_names(bound):
844-
instance_names = rsrc.get_instance_names()
845-
self.assertEqual(len(instance_names), bound)
846-
for i in xrange(bound):
847-
self.assertEqual('WebServerGroup-%d' % i, instance_names[i])
848-
849855
# Create initial group, 2 instances
850856
properties = t['Resources']['WebServerGroup']['Properties']
851857
properties['DesiredCapacity'] = '2'
@@ -856,7 +862,7 @@ def _verify_instance_names(bound):
856862
self.m.ReplayAll()
857863
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
858864
stack.resources['WebServerGroup'] = rsrc
859-
_verify_instance_names(2)
865+
self._verify_instance_names(rsrc, 2)
860866

861867
# reduce by decrease %
862868
self._stub_lb_reload(lowest)
@@ -865,7 +871,7 @@ def _verify_instance_names(bound):
865871
self._stub_validate()
866872
self.m.ReplayAll()
867873
rsrc.adjust(decrease, 'PercentChangeInCapacity')
868-
_verify_instance_names(lowest)
874+
self._verify_instance_names(rsrc, lowest)
869875

870876
# raise by increase %
871877
self._stub_lb_reload(highest)
@@ -874,7 +880,7 @@ def _verify_instance_names(bound):
874880
self._stub_create(create)
875881
self.m.ReplayAll()
876882
rsrc.adjust(increase, 'PercentChangeInCapacity')
877-
_verify_instance_names(highest)
883+
self._verify_instance_names(rsrc, highest)
878884

879885
rsrc.delete()
880886

0 commit comments

Comments
 (0)