]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Support native naming in InstanceGroup
authorThomas Herve <th@rackspace.com>
Mon, 26 Aug 2013 12:46:49 +0000 (14:46 +0200)
committerThomas Herve <th@rackspace.com>
Mon, 26 Aug 2013 13:20:37 +0000 (15:20 +0200)
The branch adds support for the native neutron load balancer resource in
in InstanceGroup. It also raises an error if a non load balancer
resource is passed.

Implements: blueprint lbaas-resource
Change-Id: I9b6e7341e2d3c9f14be704c7fbce1e318efbc2d4

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

index 84ed6fd7716adb5c3c588c5f84723fbe087f990d..9ca41f59398dce2b186d18f8ec4e3d8d98bfb8c1 100644 (file)
@@ -236,11 +236,20 @@ class InstanceGroup(stack_resource.StackResource):
         if self.properties['LoadBalancerNames']:
             id_list = [inst.FnGetRefId() for inst in self.get_instances()]
             for lb in self.properties['LoadBalancerNames']:
-                self.stack[lb].json_snippet['Properties']['Instances'] = \
-                    id_list
+                lb_resource = self.stack[lb]
+                if 'Instances' in lb_resource.properties_schema:
+                    lb_resource.json_snippet['Properties']['Instances'] = (
+                        id_list)
+                elif 'members' in lb_resource.properties_schema:
+                    lb_resource.json_snippet['Properties']['members'] = (
+                        id_list)
+                else:
+                    raise exception.Error(
+                        "Unsupported resource '%s' in LoadBalancerNames" %
+                        (lb,))
                 resolved_snippet = self.stack.resolve_static_data(
-                    self.stack[lb].json_snippet)
-                self.stack[lb].update(resolved_snippet)
+                    lb_resource.json_snippet)
+                lb_resource.update(resolved_snippet)
 
     def FnGetRefId(self):
         return unicode(self.name)
index 7dfbbdf4b939b096c19f0986fee666ed241c2343..961e2aad5c7b4f0dfd9a63fcc85163d46e7af55a 100644 (file)
@@ -279,7 +279,7 @@ class LoadBalancer(resource.Resource):
     def handle_update(self, json_snippet, tmpl_diff, prop_diff):
         if 'members' in prop_diff:
             members = set(prop_diff['members'])
-            old_members = set(self.t['Properties']['members'])
+            old_members = set(self.t['Properties'].get('members', []))
             client = self.neutron()
             for member in old_members - members:
                 member_id = db_api.resource_data_get(self, member)
index 5bffbe5c35890cff8759ba4775bda0b8cc06ca5d..a56bb5816bad58e2e3cad9968bd6a036fe2b2e6d 100644 (file)
@@ -17,6 +17,8 @@ import copy
 
 import mox
 
+from testtools import skipIf
+
 from oslo.config import cfg
 
 from heat.common import template_format
@@ -24,15 +26,19 @@ from heat.common import exception
 from heat.engine.resources import autoscaling as asc
 from heat.engine.resources import loadbalancer
 from heat.engine.resources import instance
+from heat.engine.resources.neutron import loadbalancer as neutron_lb
 from heat.engine import parser
 from heat.engine import resource
 from heat.engine import scheduler
 from heat.engine.resource import Metadata
 from heat.openstack.common import timeutils
+from heat.openstack.common.importutils import try_import
 from heat.tests.common import HeatTestCase
 from heat.tests import fakes
 from heat.tests import utils
 
+neutronclient = try_import('neutronclient.v2_0.client')
+
 
 as_template = '''
 {
@@ -654,6 +660,59 @@ class AutoScalingTest(HeatTestCase):
         rsrc.delete()
         self.m.VerifyAll()
 
+    @skipIf(neutronclient is None, 'neutronclient unavailable')
+    def test_lb_reload_members(self):
+        t = template_format.parse(as_template)
+        t['Resources']['ElasticLoadBalancer'] = {
+            'Type': 'OS::Neutron::LoadBalancer',
+            'Properties': {
+                'protocol_port': 8080,
+                'pool_id': 'pool123'
+            }
+        }
+
+        expected = {
+            'Type': 'OS::Neutron::LoadBalancer',
+            'Properties': {
+                'protocol_port': 8080,
+                'pool_id': 'pool123',
+                'members': [u'WebServerGroup-0']}
+        }
+        self.m.StubOutWithMock(neutron_lb.LoadBalancer, 'update')
+        neutron_lb.LoadBalancer.update(expected).AndReturn(None)
+
+        now = timeutils.utcnow()
+        self._stub_meta_expected(now, 'ExactCapacity : 1')
+        self._stub_create(1)
+        self.m.ReplayAll()
+        stack = utils.parse_stack(t, params=self.params)
+        self.create_scaling_group(t, stack, 'WebServerGroup')
+
+        self.m.VerifyAll()
+
+    @skipIf(neutronclient is None, 'neutronclient unavailable')
+    def test_lb_reload_invalid_resource(self):
+        t = template_format.parse(as_template)
+        t['Resources']['ElasticLoadBalancer'] = {
+            'Type': 'AWS::EC2::Volume',
+            'Properties': {
+                'AvailabilityZone': 'nova'
+            }
+        }
+
+        self._stub_create(1)
+        self.m.ReplayAll()
+        stack = utils.parse_stack(t, params=self.params)
+        error = self.assertRaises(
+            exception.ResourceFailure,
+            self.create_scaling_group, t, stack, 'WebServerGroup')
+        self.assertEqual(
+            "Error: Unsupported resource 'ElasticLoadBalancer' in "
+            "LoadBalancerNames",
+            str(error))
+
+        self.m.VerifyAll()
+
     def test_scaling_group_adjust(self):
         t = template_format.parse(as_template)
         stack = utils.parse_stack(t, params=self.params)