Skip to content

Commit

Permalink
LBAAS config generation on controller
Browse files Browse the repository at this point in the history
Move generation of haproxy driver config to the controller so
that the agent code does not need to parse the loadbalancer
objects.

Change-Id: I01c6cfcacc574531c4bcb9bdab937f9fa12f023e
Partial-Bug: #1557222
  • Loading branch information
rrugge committed Mar 29, 2016
1 parent fd4f550 commit ee36b15
Show file tree
Hide file tree
Showing 9 changed files with 273 additions and 195 deletions.
1 change: 0 additions & 1 deletion src/config/svc-monitor/SConscript
Expand Up @@ -41,7 +41,6 @@ sources = [
'svc_monitor/services/loadbalancer/drivers/ha_proxy/__init__.py',
'svc_monitor/services/loadbalancer/drivers/ha_proxy/driver.py',
'svc_monitor/services/loadbalancer/drivers/ha_proxy/haproxy_config.py',
'svc_monitor/services/loadbalancer/drivers/ha_proxy/haproxy_template.txt',
'svc_monitor/snat_agent.py',
'svc_monitor/tests/__init__.py',
'svc_monitor/tests/test_common_utils.py',
Expand Down
5 changes: 5 additions & 0 deletions src/config/svc-monitor/svc_monitor/config_db.py
Expand Up @@ -490,6 +490,8 @@ def __init__(self, uuid, obj_dict=None):
self.virtual_machines = set()
self.logical_router = None
self.params = None
self.bindings = None
self.kvps = None
self.state = 'init'
self.launch_count = 0
self.back_off = -1
Expand Down Expand Up @@ -520,6 +522,9 @@ def update(self, obj=None):
self.proj_name = obj['fq_name'][-2]
self.check_vn_changes(obj)
self.params = obj.get('service_instance_properties', None)
self.bindings = obj.get('service_instance_bindings', None)
if self.bindings:
self.kvps = self.bindings.get('key_value_pair', None)
self.update_single_ref('service_template', obj)
self.update_single_ref('loadbalancer', obj)
self.update_single_ref('loadbalancer_pool', obj)
Expand Down
2 changes: 2 additions & 0 deletions src/config/svc-monitor/svc_monitor/loadbalancer_agent.py
Expand Up @@ -208,6 +208,7 @@ def virtual_ip_add(self, vip):
v = self.virtual_ip_get_reqdict(vip)
driver = self._get_driver_for_pool(v['pool_id'])
try:
driver.set_config_v1(vip.loadbalancer_pool)
if not vip.last_sent:
driver.create_vip(v)
elif v != vip.last_sent:
Expand All @@ -230,6 +231,7 @@ def loadbalancer_add(self, loadbalancer):
lb = self.loadbalancer_get_reqdict(loadbalancer)
driver = self._get_driver_for_loadbalancer(lb['id'], 'opencontrail')
try:
driver.set_config_v2(loadbalancer.uuid)
if not loadbalancer.last_sent:
driver.create_loadbalancer(lb)
elif lb != loadbalancer.last_sent:
Expand Down
Expand Up @@ -1327,3 +1327,9 @@ def update_health_monitor(self,
pool_id):
pass
# end update_health_monitor

def set_config_v1(self, pool_id):
pass

def set_config_v2(self, lb_id):
pass
Expand Up @@ -9,8 +9,10 @@
from vnc_api.vnc_api import ServiceTemplate, ServiceInstance, ServiceInstanceType
from vnc_api.vnc_api import ServiceScaleOutType, ServiceInstanceInterfaceType
from vnc_api.vnc_api import NoIdError, RefsExistError
from vnc_api.vnc_api import KeyValuePair, KeyValuePairs

from svc_monitor.config_db import *
import haproxy_config

LOADBALANCER_SERVICE_TEMPLATE = [
'default-domain',
Expand Down Expand Up @@ -383,3 +385,39 @@ def delete_pool_health_monitor(self, health_monitor, pool_id):

def update_health_monitor(self, id, health_monitor):
pass

def set_config_v1(self, pool_id):
pool = LoadbalancerPoolSM.get(pool_id)
if not pool:
return
conf = haproxy_config.get_config_v1(pool)
self.set_haproxy_config(pool.service_instance, pool.uuid, conf)

def set_config_v2(self, lb_id):
lb = LoadbalancerSM.get(lb_id)
if not lb:
return
conf = haproxy_config.get_config_v2(lb.uuid)
self.set_haproxy_config(pool.service_instance, lb.uuid, conf)

def set_haproxy_config(self, si_id, lb_uuid, conf):
si = ServiceInstanceSM.get(si_id)
if not si:
return

for kv in si.kvps:
if kv['key'] == 'haproxy_config':
if kv['value'] == conf:
return

si_obj = ServiceInstance()
si_obj.uuid = si.uuid
si_obj.fq_name = si.fq_name
kvp = KeyValuePair('haproxy_config', conf)
si_obj.add_service_instance_bindings(kvp)
kvp = KeyValuePair('lb_uuid', lb_uuid)
si_obj.add_service_instance_bindings(kvp)
try:
self._api.service_instance_update(si_obj)
except NoIdError:
return

0 comments on commit ee36b15

Please sign in to comment.