Skip to content

Commit

Permalink
protocol support for native(ecmp) loadbalancer
Browse files Browse the repository at this point in the history
TCP, UDP protocol support is added for native(ecmp)
loadbalancer

Change-Id: I2e20fc6fff48216120e48dec8e7243ee04e74700
Partial-bug: 1629128
  • Loading branch information
ymariappan committed Dec 4, 2016
1 parent def1dfb commit f16eb54
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 8 deletions.
2 changes: 2 additions & 0 deletions src/config/svc-monitor/svc_monitor/config_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ def __init__(self, uuid, obj_dict=None):
self.lb_instance_ips = []
self.lb_floating_ips = []
self.listener_port = 0
self.listener_protocol = None
self.service_health_check = None
self.update(obj_dict)
# end __init__
Expand Down Expand Up @@ -181,6 +182,7 @@ def add(self):
if self.loadbalancer_listener:
ll_obj = LoadbalancerListenerSM.get(self.loadbalancer_listener)
self.listener_port = ll_obj.params['protocol_port']
self.listener_protocol = ll_obj.params['protocol']
self.loadbalancer_id = ll_obj.loadbalancer
self.provider = LoadbalancerSM.get(self.loadbalancer_id).provider
self.loadbalancer_version = "v2"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def _delete_vmi_ref(self, vmi, iip_id=None, fip_id=None):
self._api.floating_ip_update(fip)
return fip

def _add_port_map(self, fip, src_port, dst_port):
def _add_port_map(self, fip, protocol, src_port, dst_port):
portmap_entry = False
portmappings = fip.get_floating_ip_port_mappings()
portmap_list = []
Expand All @@ -62,6 +62,7 @@ def _add_port_map(self, fip, src_port, dst_port):
break
if portmap_entry == False:
portmap = PortMap()
portmap.set_protocol(protocol)
portmap.set_src_port(src_port)
portmap.set_dst_port(dst_port)
portmappings.add_port_mappings(portmap)
Expand Down Expand Up @@ -128,6 +129,10 @@ def _update_pool_member_props(self, lb, lb_props):
listener = LoadbalancerListenerSM.get(ll_id)
if not listener:
continue
if listener.params['protocol'] == 'UDP':
protocol = 'UDP'
else:
protocol = 'TCP'
src_port = listener.params['protocol_port']
pool = LoadbalancerPoolSM.get(listener.loadbalancer_pool)
if pool:
Expand All @@ -145,7 +150,7 @@ def _update_pool_member_props(self, lb, lb_props):
self._delete_port_map(fip, src_port)
for iip_id in lb_props['new_instance_ips'] or []:
fip = self._add_vmi_ref(vmi, iip_id=iip_id)
self._add_port_map(fip, src_port, dst_port)
self._add_port_map(fip, protocol, src_port, dst_port)
if iip_id not in pool.lb_instance_ips:
pool.lb_instance_ips.append(iip_id)
pool.lb_fips.append(fip)
Expand All @@ -154,7 +159,7 @@ def _update_pool_member_props(self, lb, lb_props):
self._delete_port_map(fip, src_port)
for fip_id in lb_props['new_floating_ips'] or []:
fip = self._add_vmi_ref(vmi, fip_id=fip_id)
self._add_port_map(fip, src_port, dst_port)
self._add_port_map(fip, protocol, src_port, dst_port)
if fip_id not in pool.lb_floating_ips:
pool.lb_floating_ips.append(fip_id)
pool.lb_fips.append(fip)
Expand Down Expand Up @@ -235,6 +240,7 @@ def _update_loadbalancer_props(self, lb_id):
lb.floating_ips = new_floating_ips

driver_data = {}
driver_data['vmi'] = vmi.uuid
driver_data['lb_instance_ips'] = lb.instance_ips
driver_data['lb_floating_ips'] = lb.floating_ips

Expand All @@ -257,16 +263,21 @@ def _clear_loadbalancer_props(self, lb_id):
self._api.floating_ip_update(fip)
self._api.floating_ip_delete(id=fip.uuid)

vmi = self._api.virtual_machine_interface_read(id=driver_data['vmi'])
lb.floating_ips = driver_data['lb_floating_ips']
for fip_id in lb.floating_ips or []:
fip = self._get_floating_ip(fip_id=fip_id)
if fip:
fip.set_virtual_machine_interface_list([])
fip.set_floating_ip_port_mappings([])
fip.floating_ip_port_mappings_enable = False
self._api.floating_ip_update(fip)
self._api.floating_ip_delete(id=fip.uuid)
fip = self._add_vmi_ref(vmi, fip_id=fip_id)

del lb.instance_ips[:]
del lb.floating_ips[:]

self.db.loadbalancer_remove(lb_id, ['vmi'])
self.db.loadbalancer_remove(lb_id, ['lb_instance_ips'])
self.db.loadbalancer_remove(lb_id, ['lb_floating_ips'])

Expand All @@ -285,25 +296,31 @@ def _update_listener_props(self, old_listener, listener):
if not old_listener:
return

if old_listener.props['protocol_port'] == listener.props['protocol_port']:
if old_listener.props['protocol_port'] == listener.props['protocol_port'] and \
old_listener.props['protocol'] == listener.props['protocol']:
return

if listener.params['protocol'] == 'UDP':
protocol = 'UDP'
else:
protocol = 'TCP'

for iip_id in lb_instance_ips or []:
fip = self._get_floating_ip(iip_id=iip_id)
if fip:
src_port = old_listener.props['protocol_port']
portmap = self._delete_port_map(fip, src_port)
src_port = listener['protocol_port']
dst_port = portmap.dst_port
self._add_port_map(fip, src_port, dst_port)
self._add_port_map(fip, protocol, src_port, dst_port)
for fip_id in lb_floating_ips or []:
fip = self._get_floating_ip(fip_id=fip_id)
if fip:
src_port = old_listener.props['protocol_port']
portmap = self._delete_port_map(fip, src_port)
src_port = listener['protocol_port']
dst_port = portmap.dst_port
self._add_port_map(fip, src_port, dst_port)
self._add_port_map(fip, protocol, src_port, dst_port)

def _clear_listener_props(self, listener_id):
listener = LoadbalancerListenerSM.get(listener_id)
Expand Down Expand Up @@ -377,10 +394,14 @@ def _update_member_props(self, member_id):
vmi = self._api.virtual_machine_interface_read(id=member.vmi)
except NoIdError:
return

protocol = pool.listener_protocol
src_port = pool.listener_port
dst_port = member.params['protocol_port']
for fip in pool.lb_fips or []:
fip.add_virtual_machine_interface(vmi)
self._api.floating_ip_update(fip)
self._add_port_map(fip, pool.listener_port, member.params['protocol_port'])
self._add_port_map(fip, protocol, src_port, dst_port)
if pool.service_health_check:
self._add_service_health_check_ref(pool.service_health_check, member.vmi)
member.service_health_check = service_health_check
Expand Down

0 comments on commit f16eb54

Please sign in to comment.