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)
|