From: Steven Hardy Date: Mon, 17 Jun 2013 14:54:51 +0000 (+0100) Subject: autoscaling fix LoadBalancer reload static resolve X-Git-Tag: 2014.1~474 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=a780bef9c396ffa6cd0a6e433bac5447a320c9fb;p=openstack-build%2Fheat-build.git autoscaling fix LoadBalancer reload static resolve Since https://review.openstack.org/#/c/31083/ we're using the Resource.update() method to update the LoadBalancer, which requires the resource snippet to be statically resolved (as is done in parser.Stack for stack updates) Fixes bug #1191705 Change-Id: Id2017a912472ddb48245682c5b6392cbcb9e4c60 --- diff --git a/heat/engine/resources/autoscaling.py b/heat/engine/resources/autoscaling.py index a582fd5a..dd57620d 100644 --- a/heat/engine/resources/autoscaling.py +++ b/heat/engine/resources/autoscaling.py @@ -210,7 +210,9 @@ class InstanceGroup(resource.Resource): for lb in self.properties['LoadBalancerNames']: self.stack[lb].json_snippet['Properties']['Instances'] = \ inst_list - self.stack[lb].update(self.stack[lb].json_snippet) + resolved_snippet = self.stack.resolve_static_data( + self.stack[lb].json_snippet) + self.stack[lb].update(resolved_snippet) def FnGetRefId(self): return unicode(self.name) diff --git a/heat/tests/test_autoscaling.py b/heat/tests/test_autoscaling.py index 86e4b6aa..df7d4221 100644 --- a/heat/tests/test_autoscaling.py +++ b/heat/tests/test_autoscaling.py @@ -21,6 +21,7 @@ from heat.common import template_format from heat.engine.resources import autoscaling as asc from heat.engine.resources import loadbalancer from heat.engine.resources import instance +from heat.engine import parser from heat.engine import resource from heat.engine import scheduler from heat.engine.resource import Metadata @@ -312,6 +313,41 @@ class AutoScalingTest(HeatTestCase): rsrc.delete() self.m.VerifyAll() + def test_lb_reload_static_resolve(self): + t = template_format.parse(as_template) + properties = t['Resources']['ElasticLoadBalancer']['Properties'] + properties['AvailabilityZones'] = {'Fn::GetAZs': ''} + + self.m.StubOutWithMock(parser.Stack, 'get_availability_zones') + parser.Stack.get_availability_zones().MultipleTimes().AndReturn( + ['abc', 'xyz']) + + # Check that the Fn::GetAZs is correctly resolved + expected = {u'Type': u'AWS::ElasticLoadBalancing::LoadBalancer', + u'Properties': {'Instances': ['WebServerGroup-0'], + u'Listeners': [{u'InstancePort': u'80', + u'LoadBalancerPort': u'80', + u'Protocol': u'HTTP'}], + u'AvailabilityZones': ['abc', 'xyz']}} + self.m.StubOutWithMock(loadbalancer.LoadBalancer, 'update') + loadbalancer.LoadBalancer.update(expected).AndReturn(None) + + now = timeutils.utcnow() + self._stub_meta_expected(now, 'ExactCapacity : 1') + self._stub_create(1) + self.m.ReplayAll() + stack = parse_stack(t) + rsrc = self.create_scaling_group(t, stack, 'WebServerGroup') + + self.assertEqual('WebServerGroup', rsrc.FnGetRefId()) + self.assertEqual('WebServerGroup-0', rsrc.resource_id) + update_snippet = copy.deepcopy(rsrc.parsed_template()) + update_snippet['Properties']['Cooldown'] = '61' + self.assertEqual(None, rsrc.update(update_snippet)) + + rsrc.delete() + self.m.VerifyAll() + def test_scaling_group_adjust(self): t = template_format.parse(as_template) stack = parse_stack(t)