From: Thomas Herve Date: Mon, 26 Aug 2013 12:46:49 +0000 (+0200) Subject: Support native naming in InstanceGroup X-Git-Tag: 2014.1~126^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=4a790e347e1c598a479bd5d591df9a65392c1c60;p=openstack-build%2Fheat-build.git Support native naming in InstanceGroup 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 --- diff --git a/heat/engine/resources/autoscaling.py b/heat/engine/resources/autoscaling.py index 84ed6fd7..9ca41f59 100644 --- a/heat/engine/resources/autoscaling.py +++ b/heat/engine/resources/autoscaling.py @@ -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) diff --git a/heat/engine/resources/neutron/loadbalancer.py b/heat/engine/resources/neutron/loadbalancer.py index 7dfbbdf4..961e2aad 100644 --- a/heat/engine/resources/neutron/loadbalancer.py +++ b/heat/engine/resources/neutron/loadbalancer.py @@ -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) diff --git a/heat/tests/test_autoscaling.py b/heat/tests/test_autoscaling.py index 5bffbe5c..a56bb581 100644 --- a/heat/tests/test_autoscaling.py +++ b/heat/tests/test_autoscaling.py @@ -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)