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)
import mox
+from testtools import skipIf
+
from oslo.config import cfg
from heat.common import template_format
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 = '''
{
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)