compute服务重启时清除多余的ovs桥

来源:互联网 发布:东风标致3008数据 编辑:程序博客网 时间:2024/05/22 04:33
/libvirt/driver.py

def init_host(self, host):
        libvirt.registerErrorHandler(libvirt_error_handler, None)
        libvirt.virEventRegisterDefaultImpl()
        if not self.has_min_version(MIN_LIBVIRT_VERSION):
            major = MIN_LIBVIRT_VERSION[0]
            minor = MIN_LIBVIRT_VERSION[1]
            micro = MIN_LIBVIRT_VERSION[2]
            LOG.error(_('Nova requires libvirt version '
                        '%(major)i.%(minor)i.%(micro)i or greater.'),
                      {'major': major, 'minor': minor, 'micro': micro})
        self._init_ovs_bridge()
        self._init_events()

def _init_ovs_bridge(self):
        try:
            instance_names = self.list_instances()
        except:
            LOG.exception(_("Get libvirt instance list failed!"))
        all_used_interfaces = []
        interfaces = []
        all_exist_qbrs = []
        for name in instance_names:
            try:
                domain = self._lookup_by_name(name)
                xml = domain.XMLDesc(0)
                interfaces = self.get_interfaces(xml)
            except:
                LOG.exception(_("Get libvirt instance' interfaces failed!"))
            all_used_interfaces += interfaces
        try:
            all_exist_qbrs = self.vif_driver.get_ovs_bridges()
        except:
            LOG.exception(_("Get ovs bridges failed!"))
        all_exist_qbrs = [qbr[3:] for qbr in all_exist_qbrs]
        all_used_interfaces = [interface[3:] for interface in all_used_interfaces]
        redundancy_qbr = [val for val in all_exist_qbrs if val not in all_used_interfaces]
        LOG.info(_("The qbr list %s will be deleted",redundancy_qbr))
        try:
            self.vif_driver.delete_ovs_bridges(redundancy_qbr)
        except:
            LOG.exception(_("Delete ovs redundancy bridge failed!"))


/libvirt/vif.py

def get_ovs_bridges(self):
 cmd = 'ovs-vsctl show | grep qbr | grep -v Port | grep -v Interface | sed \'s/"/ /g\' | awk \'{print $2}\''
 out, err = subprocess.Popen(cmd, shell = True, stdout = subprocess.PIPE).communicate()
        return out.splitlines()
   
    def delete_ovs_bridges(self,vifs):
        for vif in vifs:
            br_name = 'qbr' + vif
            utils.execute('ovs-vsctl','--if-exists', 'del-br', br_name, run_as_root=True)
            qvi_port = 'qvi' + vif
            utils.execute('ovs-vsctl','--if-exists', 'del-port', qvi_port, run_as_root=True)
            qvn_port = 'qvn' + vif
            utils.execute('ovs-vsctl','--if-exists', 'del-port', qvn_port, run_as_root=True)
            qvo_port = 'qvo' + vif
            utils.execute('ovs-vsctl','--if-exists', 'del-port', qvo_port, run_as_root=True)
0 0
原创粉丝点击