summaryrefslogtreecommitdiff
path: root/heat/engine/resources
diff options
context:
space:
mode:
Diffstat (limited to 'heat/engine/resources')
-rw-r--r--heat/engine/resources/loadbalancer.py14
-rw-r--r--heat/engine/resources/neutron/loadbalancer.py19
2 files changed, 26 insertions, 7 deletions
diff --git a/heat/engine/resources/loadbalancer.py b/heat/engine/resources/loadbalancer.py
index be0658bb0..f265265ff 100644
--- a/heat/engine/resources/loadbalancer.py
+++ b/heat/engine/resources/loadbalancer.py
@@ -422,7 +422,7 @@ class LoadBalancer(stack_resource.StackResource):
servers = []
n = 1
nova_cp = self.client_plugin('nova')
- for i in instances:
+ for i in instances or []:
ip = nova_cp.server_to_ipaddress(i) or '0.0.0.0'
LOG.debug('haproxy server:%s' % ip)
servers.append('%sserver server%d %s:%s %s' % (spaces, n,
@@ -481,7 +481,17 @@ class LoadBalancer(stack_resource.StackResource):
save it to the db.
rely on the cfn-hup to reconfigure HAProxy
'''
- if self.INSTANCES in prop_diff:
+ new_props = json_snippet.properties(self.properties_schema,
+ self.context)
+
+ # Valid use cases are:
+ # - Membership controlled by members property in template
+ # - Empty members property in template; membership controlled by
+ # "updates" triggered from autoscaling group.
+ # Mixing the two will lead to undefined behaviour.
+ if (self.INSTANCES in prop_diff and
+ (self.properties[self.INSTANCES] is not None or
+ new_props[self.INSTANCES] is not None)):
templ = self.get_parsed_template()
cfg = self._haproxy_config(templ, prop_diff[self.INSTANCES])
diff --git a/heat/engine/resources/neutron/loadbalancer.py b/heat/engine/resources/neutron/loadbalancer.py
index 243c70a4b..c2ca435a3 100644
--- a/heat/engine/resources/neutron/loadbalancer.py
+++ b/heat/engine/resources/neutron/loadbalancer.py
@@ -638,7 +638,6 @@ class LoadBalancer(resource.Resource):
MEMBERS: properties.Schema(
properties.Schema.LIST,
_('The list of Nova server IDs load balanced.'),
- default=[],
update_allowed=True
),
}
@@ -650,7 +649,7 @@ class LoadBalancer(resource.Resource):
client = self.neutron()
protocol_port = self.properties[self.PROTOCOL_PORT]
- for member in self.properties.get(self.MEMBERS):
+ for member in self.properties[self.MEMBERS] or []:
address = self.client_plugin('nova').server_to_ipaddress(member)
lb_member = client.create_member({
'member': {
@@ -660,8 +659,18 @@ class LoadBalancer(resource.Resource):
self.data_set(member, lb_member['id'])
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
- if self.MEMBERS in prop_diff:
- members = set(prop_diff[self.MEMBERS])
+ new_props = json_snippet.properties(self.properties_schema,
+ self.context)
+
+ # Valid use cases are:
+ # - Membership controlled by members property in template
+ # - Empty members property in template; membership controlled by
+ # "updates" triggered from autoscaling group.
+ # Mixing the two will lead to undefined behaviour.
+ if (self.MEMBERS in prop_diff and
+ (self.properties[self.MEMBERS] is not None or
+ new_props[self.MEMBERS] is not None)):
+ members = set(new_props[self.MEMBERS] or [])
rd_members = self.data()
old_members = set(rd_members.keys())
client = self.neutron()
@@ -686,7 +695,7 @@ class LoadBalancer(resource.Resource):
def handle_delete(self):
client = self.neutron()
- for member in self.properties.get(self.MEMBERS):
+ for member in self.properties[self.MEMBERS] or []:
member_id = self.data().get(member)
try:
client.delete_member(member_id)