From d22b2ddefd2740852664a65da986f4174fd66ead Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Fri, 5 Jul 2013 19:56:10 +0100 Subject: [PATCH] engine : Allow loadbalancer resource to work with no key Fixes bug #1137526 Change-Id: Ieff9c0b52633d45ac5164d966a362e50d5f499df --- heat/engine/resources/loadbalancer.py | 9 ++++- heat/tests/test_loadbalancer.py | 53 +++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/heat/engine/resources/loadbalancer.py b/heat/engine/resources/loadbalancer.py index a13308f2..a30dc1e4 100644 --- a/heat/engine/resources/loadbalancer.py +++ b/heat/engine/resources/loadbalancer.py @@ -341,8 +341,13 @@ class LoadBalancer(stack_resource.StackResource): cfg = self._haproxy_config(templ, self.properties['Instances']) files['/etc/haproxy/haproxy.cfg']['content'] = cfg - # total hack - probably need an admin key here. - param = self.stack.resolve_static_data({'KeyName': {'Ref': 'KeyName'}}) + # If the owning stack defines KeyName, we use that key for the nested + # template, otherwise use no key + try: + param = {'KeyName': self.stack.parameters['KeyName']} + except KeyError: + del templ['Resources']['LB_instance']['Properties']['KeyName'] + param = {} return self.create_with_template(templ, param) diff --git a/heat/tests/test_loadbalancer.py b/heat/tests/test_loadbalancer.py index d8bd1d3e..9e2bb037 100644 --- a/heat/tests/test_loadbalancer.py +++ b/heat/tests/test_loadbalancer.py @@ -72,6 +72,35 @@ lb_template = ''' } ''' +lb_template_nokey = ''' +{ + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "LB Template", + "Resources": { + "WikiServerOne": { + "Type": "AWS::EC2::Instance", + "Properties": { + "ImageId": "F17-x86_64-gold", + "InstanceType" : "m1.large", + "UserData" : "some data" + } + }, + "LoadBalancer" : { + "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", + "Properties" : { + "AvailabilityZones" : ["nova"], + "Instances" : [{"Ref": "WikiServerOne"}], + "Listeners" : [ { + "LoadBalancerPort" : "80", + "InstancePort" : "80", + "Protocol" : "HTTP" + }] + } + } + } +} +''' + class LoadBalancerTest(HeatTestCase): def setUp(self): @@ -97,7 +126,7 @@ class LoadBalancerTest(HeatTestCase): self.assertEqual((rsrc.CREATE, rsrc.COMPLETE), rsrc.state) return rsrc - def test_loadbalancer(self): + def _create_stubs(self, key_name='test', stub_meta=True): self.m.StubOutWithMock(user.User, 'keystone') user.User.keystone().AndReturn(self.fkc) @@ -113,16 +142,21 @@ class LoadBalancerTest(HeatTestCase): clients.OpenStackClients.nova( "compute").MultipleTimes().AndReturn(self.fc) self.fc.servers.create( - flavor=2, image=745, key_name='test', + flavor=2, image=745, key_name=key_name, meta=None, nics=None, name=server_name, scheduler_hints=None, userdata=mox.IgnoreArg(), security_groups=None, availability_zone=None).AndReturn( self.fc.servers.list()[1]) - Metadata.__set__(mox.IgnoreArg(), - mox.IgnoreArg()).AndReturn(None) + if stub_meta: + Metadata.__set__(mox.IgnoreArg(), + mox.IgnoreArg()).AndReturn(None) self.m.StubOutWithMock(wc.WaitConditionHandle, 'get_status') wc.WaitConditionHandle.get_status().AndReturn(['SUCCESS']) + + def test_loadbalancer(self): + self._create_stubs() + self.m.ReplayAll() t = template_format.parse(lb_template) @@ -177,6 +211,17 @@ class LoadBalancerTest(HeatTestCase): self.m.VerifyAll() + def test_loadbalancer_nokey(self): + self._create_stubs(key_name=None, stub_meta=False) + self.m.ReplayAll() + + t = template_format.parse(lb_template_nokey) + s = parse_stack(t) + s.store() + + rsrc = self.create_loadbalancer(t, s, 'LoadBalancer') + self.m.VerifyAll() + def assertRegexpMatches(self, text, expected_regexp, msg=None): """Fail the test unless the text matches the regular expression.""" if isinstance(expected_regexp, basestring): -- 2.45.2