def _cleanup_si(self, si_fq_str): si_info = self.db.service_instance_get(si_fq_str) if not si_info: return cleaned_up = True state = {} state['state'] = 'deleting' self.db.service_instance_insert(si_fq_str, state) proj_name = self._get_proj_name_from_si_fq_str(si_fq_str) for idx in range(0, int(si_info.get('max-instances', '0'))): prefix = self.db.get_vm_db_prefix(idx) vm_key = prefix + 'uuid' if vm_key in si_info.keys(): if not self._delete_svc_instance( si_info[vm_key], proj_name, si_fq_str=si_fq_str, virt_type=si_info['instance_type']): cleaned_up = False if cleaned_up: vn_name = 'snat-si-left_%s' % si_fq_str.split(':')[-1] if vn_name in si_info.keys(): if not self._delete_shared_vn(si_info[vn_name], proj_name): cleaned_up = False if cleaned_up: for vn_name in svc_info.get_shared_vn_list(): if vn_name in si_info.keys(): self._delete_shared_vn(si_info[vn_name], proj_name) self.db.service_instance_remove(si_fq_str)
def timer_callback(monitor): # delete vms without si vm_delete_list = [] for vm in VirtualMachineSM.values(): si = ServiceInstanceSM.get(vm.service_instance) if not si and vm.virtualization_type: vm_delete_list.append(vm) for vm in vm_delete_list: monitor._delete_service_instance(vm) # check status of service si_id_list = list(ServiceInstanceSM._dict.keys()) for si_id in si_id_list: si = ServiceInstanceSM.get(si_id) if not si or not si.launch_count: continue if not monitor._check_service_running(si): monitor._relaunch_service_instance(si) if si.max_instances != len(si.virtual_machines): monitor._relaunch_service_instance(si) # check vns to be deleted for project in ProjectSM.values(): if project.service_instances: continue vn_id_list = list(project.virtual_networks) for vn_id in vn_id_list: vn = VirtualNetworkSM.get(vn_id) if not vn or vn.virtual_machine_interfaces: 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 timer_callback(monitor): # delete vms without si vm_delete_list = [] for vm in VirtualMachineSM.values(): si = ServiceInstanceSM.get(vm.service_instance) if not si and vm.virtualization_type: vm_delete_list.append(vm) for vm in vm_delete_list: monitor._delete_service_instance(vm) # check status of service si_id_list = copy.deepcopy(ServiceInstanceSM) for si_id in si_id_list: si = ServiceInstanceSM.get(si_id) if not si: continue if not monitor._check_service_running(si): monitor._relaunch_service_instance(si) if si.max_instances != len(si.virtual_machines): monitor._relaunch_service_instance(si) # check vns to be deleted for project in ProjectSM.values(): if project.service_instances: continue for vn_id in project.virtual_networks: vn = VirtualNetworkSM.get(vn_id) if not vn or vn.virtual_machine_interfaces: 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 _delmsg_project_service_instance(self, idents): proj_fq_str = idents['project'] si_fq_str = idents['service-instance'] proj_obj = self._vnc_lib.project_read(fq_name_str=proj_fq_str) # Service instance SNAT NetNS have a dedicated left network (non # shared vn) vn_name = 'svc_snat_%s' % si_fq_str.split(':')[2] vn_fq_name = proj_obj.get_fq_name() + [vn_name] try: vn_uuid = self._vnc_lib.fq_name_to_id('virtual-network', vn_fq_name) self.db.cleanup_table_insert( vn_uuid, {'proj_name': proj_obj.name, 'type': 'vn'}) except NoIdError: pass if proj_obj.get_service_instances() is not None: return # no SIs left hence delete shared VNs for vn_name in svc_info.get_shared_vn_list(): vn_fq_name = proj_obj.get_fq_name() + [vn_name] try: vn_uuid = self._vnc_lib.fq_name_to_id( 'virtual-network', vn_fq_name) self.db.cleanup_table_insert( vn_uuid, {'proj_name': proj_obj.name, 'type': 'vn'}) except Exception: pass
def _delmsg_project_service_instance(self, idents): proj_fq_str = idents['project'] si_fq_str = idents['service-instance'] proj_obj = self._vnc_lib.project_read(fq_name_str=proj_fq_str) # Service instance SNAT NetNS have a dedicated left network (non # shared vn) vn_name = 'svc_snat_%s' % si_fq_str.split(':')[2] vn_fq_name = proj_obj.get_fq_name() + [vn_name] try: vn_uuid = self._vnc_lib.fq_name_to_id('virtual-network', vn_fq_name) self.db.cleanup_table_insert(vn_uuid, { 'proj_name': proj_obj.name, 'type': 'vn' }) except NoIdError: pass if proj_obj.get_service_instances() is not None: return # no SIs left hence delete shared VNs for vn_name in svc_info.get_shared_vn_list(): vn_fq_name = proj_obj.get_fq_name() + [vn_name] try: vn_uuid = self._vnc_lib.fq_name_to_id('virtual-network', vn_fq_name) self.db.cleanup_table_insert(vn_uuid, { 'proj_name': proj_obj.name, 'type': 'vn' }) except Exception: pass
def timer_callback(monitor): # delete vms without si vm_delete_list = [] for vm in VirtualMachineSM.values(): si = ServiceInstanceSM.get(vm.service_instance) if not si: vm_delete_list.append(vm) for vm in vm_delete_list: monitor._delete_service_instance(vm) # check status of service for si_id in ServiceInstanceSM: si = ServiceInstanceSM.get(si_id) if not monitor._check_service_running(si): monitor._relaunch_service_instance(si) if si.max_instances > len(si.virtual_machines): monitor._relaunch_service_instance(si) # check vns to be deleted for vn in VirtualNetworkSM.values(): if vn.virtual_machine_interfaces: continue elif 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 timer_callback(monitor): # delete orphan shared iips iip_delete_list = [] for iip in InstanceIpSM.values(): if not iip.instance_ip_secondary or not iip.service_instance_ip: continue if iip.service_instance: continue if len(iip.virtual_machine_interfaces): continue iip_delete_list.append(iip) for iip in iip_delete_list: monitor.port_tuple_agent.delete_shared_iip(iip.uuid) # delete vms without si vm_delete_list = [] for vm in VirtualMachineSM.values(): si = ServiceInstanceSM.get(vm.service_instance) if not si and vm.virtualization_type: vm_delete_list.append(vm) for vm in vm_delete_list: monitor.delete_service_instance(vm) # delete vmis with si but no vms vmi_delete_list = [] for vmi in VirtualMachineInterfaceSM.values(): si = ServiceInstanceSM.get(vmi.service_instance) if si and not vmi.virtual_machine: vmi_delete_list.append(vmi.uuid) if len(vmi_delete_list): monitor.vm_manager.cleanup_svc_vm_ports(vmi_delete_list) # check vrouter agent status monitor.vrouter_scheduler.vrouters_running() # check status of service si_list = list(ServiceInstanceSM.values()) for si in si_list: if skip_check_service(si): continue if not monitor._check_service_running(si): monitor._relaunch_service_instance(si) if si.max_instances != len(si.virtual_machines): monitor._relaunch_service_instance(si) # check vns to be deleted for project in ProjectSM.values(): if project.service_instances: continue vn_id_list = list(project.virtual_networks) for vn_id in vn_id_list: vn = VirtualNetworkSM.get(vn_id) if not vn or vn.virtual_machine_interfaces: 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 clean_resources(self, proj_fq_str, si_fq_str): proj_obj = self._vnc_lib.project_read(fq_name_str=proj_fq_str) # If project still contains SI, do not delete shared virtual networks if proj_obj.get_service_instances() is not None: return # No SIs left hence delete shared VNs for vn_name in svc_info.get_shared_vn_list(): self._delete_svc_vn(proj_obj.get_fq_name() + [vn_name])
def _delmsg_virtual_machine_interface_virtual_network(self, idents): vmi_fq_str = idents['virtual-machine-interface'] vn_fq_str = idents['virtual-network'] vn_fq_name = vn_fq_str.split(':') for vn_name in svc_info.get_shared_vn_list(): if vn_name != vn_fq_name[2]: continue try: vn_id = self._vnc_lib.fq_name_to_id( 'virtual-network', vn_fq_name) except NoIdError: continue self._delete_shared_vn(vn_id, vn_fq_name[1])
def _delmsg_virtual_machine_interface_virtual_network(self, idents): vmi_fq_str = idents['virtual-machine-interface'] vn_fq_str = idents['virtual-network'] vn_fq_name = vn_fq_str.split(':') for vn_name in svc_info.get_shared_vn_list(): if vn_name != vn_fq_name[2]: continue try: vn_id = self._vnc_lib.fq_name_to_id('virtual-network', vn_fq_name) except NoIdError: continue self._delete_shared_vn(vn_id, vn_fq_name[1])