From a860ac981828bdc82904a24d61bdfd78699242d8 Mon Sep 17 00:00:00 2001 From: Rudra Rugge Date: Wed, 10 Aug 2016 11:30:09 -0700 Subject: [PATCH] Delete SNAT left vn 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 --- src/config/api-server/vnc_cfg_types.py | 2 + .../svc-monitor/svc_monitor/config_db.py | 6 +++ .../svc-monitor/svc_monitor/snat_agent.py | 44 +++++++++++++++---- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/config/api-server/vnc_cfg_types.py b/src/config/api-server/vnc_cfg_types.py index 59a7160948d..b6fe54e4a67 100644 --- a/src/config/api-server/vnc_cfg_types.py +++ b/src/config/api-server/vnc_cfg_types.py @@ -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 diff --git a/src/config/svc-monitor/svc_monitor/config_db.py b/src/config/svc-monitor/svc_monitor/config_db.py index b4326e96d76..36ed95af834 100644 --- a/src/config/svc-monitor/svc_monitor/config_db.py +++ b/src/config/svc-monitor/svc_monitor/config_db.py @@ -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__ @@ -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 @@ -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 @@ -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__ @@ -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 @@ -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 diff --git a/src/config/svc-monitor/svc_monitor/snat_agent.py b/src/config/svc-monitor/svc_monitor/snat_agent.py index 18d1ae437a1..c4ad117e5ff 100644 --- a/src/config/svc-monitor/svc_monitor/snat_agent.py +++ b/src/config/svc-monitor/svc_monitor/snat_agent.py @@ -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) @@ -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):