diff --git a/src/config/api-server/vnc_cfg_types.py b/src/config/api-server/vnc_cfg_types.py index a678c416a9c..41ed1b08041 100644 --- a/src/config/api-server/vnc_cfg_types.py +++ b/src/config/api-server/vnc_cfg_types.py @@ -389,6 +389,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 faa4b74f709..2ab5cb9070f 100644 --- a/src/config/svc-monitor/svc_monitor/config_db.py +++ b/src/config/svc-monitor/svc_monitor/config_db.py @@ -662,6 +662,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__ @@ -672,6 +673,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 @@ -681,6 +683,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 @@ -747,6 +750,7 @@ def __init__(self, uuid, obj_dict=None): self.instance_ip_secondary = None self.secondary_tracking_ip = None self.virtual_machine_interfaces = set() + self.virtual_networks = set() self.update(obj_dict) # end __init__ @@ -762,6 +766,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 @@ -772,6 +777,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 71b67e3f1fd..f8e5101e183 100644 --- a/src/config/svc-monitor/svc_monitor/snat_agent.py +++ b/src/config/svc-monitor/svc_monitor/snat_agent.py @@ -223,6 +223,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) @@ -266,9 +297,14 @@ def delete_snat_instance(self, router_obj): except vnc_exc.NoIdError: pass + if not si_obj: + return + + # Delete left network + self.delete_snat_vn(si_obj) + # Delete service instance - if si_obj: - self._vnc_lib.service_instance_delete(id=si_uuid) + self._vnc_lib.service_instance_delete(id=si_uuid) # end delete_snat_instance def cleanup_snat_instance(self, lr_id, si_id): diff --git a/src/config/svc-monitor/svc_monitor/svc_monitor.py b/src/config/svc-monitor/svc_monitor/svc_monitor.py index 19b0febe070..84444a6b901 100644 --- a/src/config/svc-monitor/svc_monitor/svc_monitor.py +++ b/src/config/svc-monitor/svc_monitor/svc_monitor.py @@ -582,8 +582,6 @@ def timer_callback(monitor): continue if vn.name in svc_info.get_shared_vn_list(): monitor._delete_shared_vn(vn.uuid) - elif vn.name.startswith(svc_info.get_snat_left_vn_prefix()): - monitor._delete_shared_vn(vn.uuid) def launch_timer(monitor):