Skip to content

Commit

Permalink
Merge "Service monitor changes for port-tuple"
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Dec 4, 2015
2 parents 3c6d1c8 + c02768c commit 58d5d6d
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 36 deletions.
9 changes: 8 additions & 1 deletion src/config/svc-monitor/svc_monitor/config_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ def __init__(self, uuid, obj_dict=None):
self.instance_ips = set()
self.floating_ips = set()
self.interface_route_table = None
self.service_health_check = None
self.security_group = None
self.service_instance = None
self.instance_id = None
Expand All @@ -370,6 +371,7 @@ def update(self, obj=None):
self.update_single_ref('virtual_machine', obj)
self.update_single_ref('logical_interface', obj)
self.update_single_ref('interface_route_table', obj)
self.update_single_ref('service_health_check', obj)
self.update_single_ref('physical_interface',obj)
self.update_single_ref('security_group', obj)
self.update_single_ref('port_tuple', obj)
Expand All @@ -393,6 +395,7 @@ def delete(cls, uuid):
obj.update_single_ref('virtual_machine', {})
obj.update_single_ref('logical_interface', {})
obj.update_single_ref('interface_route_table', {})
obj.update_single_ref('service_health_check', {})
obj.update_single_ref('security_group', {})
obj.update_single_ref('port_tuple', {})
obj.remove_from_parent()
Expand All @@ -411,6 +414,7 @@ def __init__(self, uuid, obj_dict=None):
self.loadbalancer_pool = None
self.interface_route_tables = set()
self.service_health_checks = set()
self.instance_ips = set()
self.virtual_machines = set()
self.virtual_machine_interfaces = set()
self.params = None
Expand Down Expand Up @@ -448,6 +452,7 @@ def update(self, obj=None):
self.update_single_ref('loadbalancer_pool', obj)
self.update_multiple_refs('interface_route_table', obj)
self.update_multiple_refs('service_health_check', obj)
self.update_multiple_refs('instance_ip', obj)
self.update_multiple_refs('virtual_machine', obj)
self.update_multiple_refs('virtual_machine_interface', obj)
self.id_perms = obj.get('id_perms', None)
Expand Down Expand Up @@ -492,6 +497,7 @@ def delete(cls, uuid):
obj.update_single_ref('loadbalancer_pool', {})
obj.update_multiple_refs('interface_route_table', {})
obj.update_multiple_refs('service_health_check', {})
obj.update_multiple_refs('instance_ip', {})
obj.update_multiple_refs('virtual_machine_interface',{})
obj.update_multiple_refs('virtual_machine', {})
obj.remove_from_parent()
Expand Down Expand Up @@ -1009,7 +1015,7 @@ class PortTupleSM(DBBaseSM):
def __init__(self, uuid, obj_dict=None):
self.uuid = uuid
self.virtual_machine_interfaces = set()
obj = self.update(obj_dict)
obj_dict = self.update(obj_dict)
self.add_to_parent(obj_dict)
# end __init__

Expand All @@ -1019,6 +1025,7 @@ def update(self, obj=None):
self.parent_uuid = obj['parent_uuid']
self.update_multiple_refs('virtual_machine_interface', obj)
self.name = obj['fq_name'][-1]
return obj
# end update

@classmethod
Expand Down
88 changes: 53 additions & 35 deletions src/config/svc-monitor/svc_monitor/port_tuple.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,53 +31,70 @@ def __init__(self, svc_mon, vnc_lib, cassandra, config_section, logger):
def handle_service_type(self):
return 'port-tuple'

def _allocate_iip_for_family(self, vn_obj, iip_family, si, port):
def _allocate_iip_for_family(self, iip_family, si, port, vmi):
create_iip = True
update_vmi = False
iip_name = si.uuid + '-' + port['type'] + '-' + iip_family
iip_obj = InstanceIp(name=iip_name, instance_ip_family=iip_family)
iip_obj.add_virtual_network(vn_obj)
iip_obj.set_service_instance_ip(True)
iip_obj.set_instance_ip_secondary(True)
for iip in InstanceIpSM.values():
if iip.name == iip_name:
iip_obj.uuid = iip.uuid
return iip_obj

if not iip_obj.uuid:
for iip_id in si.instance_ips:
iip = InstanceIpSM.get(iip_id)
if iip and iip.name == iip_name:
create_iip = False
iip_id = iip.uuid
if iip.uuid not in vmi.instance_ips:
update_vmi = True
break

if create_iip:
iip_obj = InstanceIp(name=iip_name, instance_ip_family=iip_family)
vn_obj = self._vnc_lib.virtual_network_read(id=vmi.virtual_network)
iip_obj.add_virtual_network(vn_obj)
iip_obj.set_service_instance_ip(True)
iip_obj.set_instance_ip_secondary(True)
try:
self._vnc_lib.instance_ip_create(iip_obj)
except RefsExistError:
self._vnc_lib.instance_ip_update(iip_obj)
except HttpError:
return None
except Exception as e:
return

iip_id = iip_obj.uuid
tag = ServiceInterfaceTag(interface_type=port['type'])
self._vnc_lib.ref_update('service-instance', si.uuid,
'instance-ip', iip_id, None, 'ADD', tag)
ServiceInstanceSM.locate(si.uuid)
InstanceIpSM.locate(iip_id)

if create_iip or update_vmi:
self._vnc_lib.ref_update('instance-ip', iip_id,
'virtual-machine-interface', vmi.uuid, None, 'ADD')
VirtualMachineInterfaceSM.locate(vmi.uuid)
InstanceIpSM.locate(iip_id)

tag = ServiceInterfaceTag(interface_type=port['type'])
self._vnc_lib.ref_update('service-instance', si.uuid,
'instance-ip', iip_obj.uuid, None, 'ADD', tag)
InstanceIpSM.locate(iip_obj.uuid)
return iip_obj
return

def _allocate_shared_iip(self, si, port, vmi, vmi_obj):
vn_obj = self._vnc_lib.virtual_network_read(id=vmi.virtual_network)
iip_obj = self._allocate_iip_for_family(vn_obj, 'v4', si, port)
self._vnc_lib.ref_update('instance-ip', iip_obj.uuid,
'virtual-machine-interface', vmi_obj.uuid, None, 'ADD')
self._allocate_iip_for_family('v4', si, port, vmi)
self._allocate_iip_for_family('v6', si, port, vmi)
return

def set_port_service_health_check(self, port, vmi_obj):
if port['service-health-check']:
self._vnc_lib.ref_update('virtual-machine-interface', vmi_obj.uuid,
def set_port_service_health_check(self, port, vmi):
if port['service-health-check'] and not vmi.service_health_check:
self._vnc_lib.ref_update('virtual-machine-interface', vmi.uuid,
'service-health-check', port['service-health-check'], None, 'ADD')
VirtualMachineInterfaceSM.locate(vmi.uuid)

def set_port_static_routes(self, port, vmi_obj):
if port['interface-route-table']:
self._vnc_lib.ref_update('virtual-machine-interface', vmi_obj.uuid,
def set_port_static_routes(self, port, vmi):
if port['interface-route-table'] and not vmi.interface_route_table:
self._vnc_lib.ref_update('virtual-machine-interface', vmi.uuid,
'interface-route-table', port['interface-route-table'], None, 'ADD')
VirtualMachineInterfaceSM.locate(vmi.uuid)

def set_port_allowed_address_pairs(self, port, vmi_obj):
if port['allowed-address-pairs']:
vmi_obj.set_virtual_machine_interface_allowed_address_pairs(
port['allowed-address-pairs'])
self._vnc_lib.virtual_machine_interface_update(vmi_obj)
VirtualMachineInterfaceSM.locate(vmi_obj.uuid)

def set_port_service_chain_ip(self, si, port, vmi, vmi_obj):
if port['shared-ip']:
Expand Down Expand Up @@ -111,14 +128,15 @@ def get_port_config(self, st, si):
port['interface-route-table'] = None
for irt_id in si.interface_route_tables:
irt = InterfaceRouteTableSM.get(irt_id)
if irt.service_interface_tag == port['type']:
port['interface-route-table'] = irt_id
if irt and irt.service_interface_tag == port['type']:
port['interface-route-table'] = irt.uuid
break
port['service-health-check'] = None
for health_id in si.service_health_checks:
health = ServiceHealthCheckSM.get(health_id)
if health.service_interface_tag == port['type']:
port['service-health-check'] = health_id

if health and health.service_interface_tag == port['type']:
port['service-health-check'] = health.uuid
break
port_config[st_if.get('service_interface_type')] = port

return port_config
Expand Down Expand Up @@ -150,8 +168,8 @@ def update_port_tuple(self, pt_id):

self.set_port_service_chain_ip(si, port, vmi, vmi_obj)
self.set_port_allowed_address_pairs(port, vmi_obj)
self.set_port_service_health_check(port, vmi_obj)
self.set_port_static_routes(port, vmi_obj)
self.set_port_service_health_check(port, vmi)
self.set_port_static_routes(port, vmi)

def update_port_tuples(self):
for si in ServiceInstanceSM.values():
Expand Down
4 changes: 4 additions & 0 deletions src/config/svc-monitor/svc_monitor/svc_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,8 @@ def _vnc_subscribe_actions(self, oper_info):
'virtual_machine', []):
vm = VirtualMachineSM.get(vm_id)
self.port_delete_or_si_link(vm, vmi)
if vmi.port_tuple:
self.port_tuple_agent.update_port_tuple(vmi.port_tuple)
else:
for irt_id in dependency_tracker.resources.get(
'interface_route_table', []):
Expand Down Expand Up @@ -579,6 +581,8 @@ def port_delete_or_si_link(self, vm, vmi):
if not vmi.if_type:
return

if len(vmi.name.split('__')) < 4:
return
si_fq_name = vmi.name.split('__')[0:3]
index = int(vmi.name.split('__')[3]) - 1
for si in ServiceInstanceSM.values():
Expand Down

0 comments on commit 58d5d6d

Please sign in to comment.