]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
autoscaling fix LoadBalancer reload static resolve
authorSteven Hardy <shardy@redhat.com>
Mon, 17 Jun 2013 14:54:51 +0000 (15:54 +0100)
committerSteven Hardy <shardy@redhat.com>
Tue, 18 Jun 2013 10:22:07 +0000 (11:22 +0100)
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

heat/engine/resources/autoscaling.py
heat/tests/test_autoscaling.py

index a582fd5a17a18d88eeb3b101f5919797335057e9..dd57620d4db45e8f4be72d8ebd8ed73526858b0f 100644 (file)
@@ -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)
index 86e4b6aa7e3acc3ad9b99c21448167a9a8770020..df7d4221a000c12ac9858fda8b697c12b40fbaaa 100644 (file)
@@ -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)