]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
engine : Allow loadbalancer resource to work with no key
authorSteven Hardy <shardy@redhat.com>
Fri, 5 Jul 2013 18:56:10 +0000 (19:56 +0100)
committerSteve Baker <sbaker@redhat.com>
Fri, 12 Jul 2013 03:26:41 +0000 (15:26 +1200)
Fixes bug #1137526

Change-Id: Ieff9c0b52633d45ac5164d966a362e50d5f499df

heat/engine/resources/loadbalancer.py
heat/tests/test_loadbalancer.py

index a13308f256e217c87a03411b5ead6cde4f38e4d1..a30dc1e40a945968732d1c02a211da48d5a80c66 100644 (file)
@@ -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)
 
index d8bd1d3e789685377715d67490acf9dd1af8073c..9e2bb037534d15a9c515d9e14e582482d3a2e9fc 100644 (file)
@@ -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):