Skip to content

Commit

Permalink
Delete SNAT left vn
Browse files Browse the repository at this point in the history
Handle delete of SNAT left vn from timer to event based.
Dereference the ports and instance ips before deleting the
snat left vn.

Also change api-server to ignore if iip does not have vn ref.

Change-Id: I88261271efe28db7c777c207c047bcd857e09f42
Closes-Bug: #1367097
  • Loading branch information
rudrarugge committed Aug 10, 2016
1 parent f2dc8e8 commit a860ac9
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 9 deletions.
2 changes: 2 additions & 0 deletions src/config/api-server/vnc_cfg_types.py
Expand Up @@ -473,6 +473,8 @@ def pre_dbe_update(cls, id, fq_name, obj_dict, db_conn,
return ok, result
db_iip_dict = result

if 'virtual_network_refs' not in db_iip_dict:
return True, ''
vn_uuid = db_iip_dict['virtual_network_refs'][0]['uuid']
vn_fq_name = db_iip_dict['virtual_network_refs'][0]['to']
if ((vn_fq_name == cfgm_common.IP_FABRIC_VN_FQ_NAME) or
Expand Down
6 changes: 6 additions & 0 deletions src/config/svc-monitor/svc_monitor/config_db.py
Expand Up @@ -673,6 +673,7 @@ class VirtualNetworkSM(DBBaseSM):
def __init__(self, uuid, obj_dict=None):
self.uuid = uuid
self.virtual_machine_interfaces = set()
self.instance_ips = set()
obj_dict = self.update(obj_dict)
self.add_to_parent(obj_dict)
# end __init__
Expand All @@ -683,6 +684,7 @@ def update(self, obj=None):
self.name = obj['fq_name'][-1]
self.fq_name = obj['fq_name']
self.update_multiple_refs('virtual_machine_interface', obj)
self.update_multiple_refs('instance_ip', obj)
return obj
# end update

Expand All @@ -692,6 +694,7 @@ def delete(cls, uuid):
return
obj = cls._dict[uuid]
obj.update_multiple_refs('virtual_machine_interface', {})
obj.update_multiple_refs('instance_ip', {})
obj.remove_from_parent()
del cls._dict[uuid]
# end delete
Expand Down Expand Up @@ -759,6 +762,7 @@ def __init__(self, uuid, obj_dict=None):
self.secondary_tracking_ip = None
self.service_health_check_ip = None
self.virtual_machine_interfaces = set()
self.virtual_networks = set()
self.update(obj_dict)
# end __init__

Expand All @@ -775,6 +779,7 @@ def update(self, obj=None):
self.family = obj.get('instance_ip_family', 'v4')
self.address = obj.get('instance_ip_address', None)
self.update_multiple_refs('virtual_machine_interface', obj)
self.update_multiple_refs('virtual_network', obj)
self.update_single_ref('service_instance', obj)
# end update

Expand All @@ -785,6 +790,7 @@ def delete(cls, uuid):
obj = cls._dict[uuid]
obj.update_single_ref('service_instance', {})
obj.update_multiple_refs('virtual_machine_interface', {})
obj.update_multiple_refs('virtual_network', {})
del cls._dict[uuid]
# end delete

Expand Down
44 changes: 35 additions & 9 deletions src/config/svc-monitor/svc_monitor/snat_agent.py
Expand Up @@ -183,6 +183,37 @@ def _add_snat_instance(self, router_obj):
self._vnc_lib.logical_router_update(vnc_rtr_obj)
# end add_snat_instance

def delete_snat_vn(self, si_obj):
vn_name = '%s_%s' % (svc_info.get_snat_left_vn_prefix(),
si_obj.name)
vn_fq_name = si_obj.fq_name[:-1] + [vn_name]
try:
vn_obj = self._vnc_lib.virtual_network_read(fq_name=vn_fq_name)
except NoIdError:
return

vn = VirtualNetworkSM.get(vn_obj.uuid)
if not vn:
return

for vmi_id in vn.virtual_machine_interfaces:
try:
self._vnc_lib.ref_update('virtual-machine-interface',
vmi_id, 'virtual-network', vn.uuid, None, 'DELETE')
except NoIdError:
pass

for iip_id in vn.instance_ips:
try:
self._vnc_lib.instance_ip_delete(id=iip_id)
except NoIdError:
pass

try:
self._vnc_lib.virtual_network_delete(id=vn.uuid)
except (RefsExistError, NoIdError):
pass

def delete_snat_instance(self, router_obj):
try:
vnc_rtr_obj = self._vnc_lib.logical_router_read(id=router_obj.uuid)
Expand Down Expand Up @@ -219,16 +250,11 @@ def delete_snat_instance(self, router_obj):
if not si_obj:
return

self._vnc_lib.service_instance_delete(id=si_uuid)

# Delete left network
vn_name = '%s_%s' % (svc_info.get_snat_left_vn_prefix(),
si_obj.name)
vn_fq_name = si_obj.fq_name[:-1] + [vn_name]
try:
self._vnc_lib.virtual_network_delete(fq_name=vn_fq_name)
except (RefsExistError, NoIdError):
pass
self.delete_snat_vn(si_obj)

# Delete service instance
self._vnc_lib.service_instance_delete(id=si_uuid)
# end delete_snat_instance

def cleanup_snat_instance(self, lr_id, si_id):
Expand Down

0 comments on commit a860ac9

Please sign in to comment.