kvm管理类

import libvirt
import paramiko


class VMManager:
    def __init__(self):
        self.conn1 = libvirt.open("qemu+tcp://192.168.169.2/system")
        self.conn2 = libvirt.open("qemu+tcp://192.168.169.3/system")

    def getVMM(self):
        if self.conn1.getFreeMemory() > self.conn2.getFreeMemory():
            return self.conn1
        return self.conn2

    def getVMAddr(self, name):
        domInConn1 = self.conn1.listAllDomains()
        domName = [dom.name() for dom in domInConn1]
        if name in domName:
            return self.conn1.getURI()

        domInConn2 = self.conn2.listAllDomains()
        domName = [dom.name() for dom in domInConn2]
        if name in domName:
            return self.conn2.getURI()
        return None

    def initVM(self, name):
        if self.getVMAddr(name) is not None:
            return None
        conn = self.getVMM()

        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        hostname = conn.getURI().split("/")[2]

        print(hostname)
        password = "111"
        if hostname == "192.168.169.3":
            password = "123"
        ssh.connect(hostname=hostname, username="root", password=password)
        nameOfVMImge = name + ".qcow2"
        ssh.exec_command("cd /usr/local/vm_img && qemu-img create -f qcow2 " + nameOfVMImge + " 20G")
        imgAddr = "/usr/local/vm_img/" + nameOfVMImge
        fSetup = open("/etc/libvirt/XMLFile/setup.xml")
        setupXML = fSetup.read().format(name, "cdrom", imgAddr)
        dom = conn.defineXML(setupXML)
        dom.create()
        return dom

    def createVM(self, name):
        addr = self.getVMAddr(name)
        print(addr)
        if addr is None:
            return None
        conn = libvirt.open(addr)
        self.shutoff(name)
        self.unDefine(name)
        imgAddr = "/usr/local/vm_img/" + name + ".qcow2"
        fSetup = open("/etc/libvirt/XMLFile/setup.xml")
        setupXML = fSetup.read().format(name, "hd", imgAddr)
        dom = conn.defineXML(setupXML)
        return dom

    def getDom(self, name):
        try:
            dom = self.conn1.lookupByName(name)
        except Exception as e:
            print(e)
            dom = self.conn2.lookupByName(name)
        return dom

    def start(self, name):
        dom = self.getDom(name)
        dom.create()

    def resume(self, name):
        dom = self.getDom(name)
        dom.resume()

    def suspend(self, name):
        dom = self.getDom(name)
        dom.suspend()

    def shutoff(self, name):
        dom = self.getDom(name)
        dom.destroy()

    def unDefine(self, name):

        addr = self.getVMAddr(name)
        conn = libvirt.open(addr)

        dom = self.getDom(name)
        dom.undefine()
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        hostname = addr.split("/")[2]
        print(hostname)
        password = "111"
        if hostname == "192.168.169.3":
            password = "123"
        ssh.connect(hostname=hostname, username="root", password=password)
        ssh.exec_command("cd /usr/local/vm_img && rm -r " + name + ".qcow2")

    @staticmethod
    def getState(state):
        if state == 1:
            return "running"
        elif state == 3:
            return "paused"
        else:
            return "shutoff"

    def listDom(self):

        domInConn1 = self.conn1.listAllDomains()
        domInConn2 = self.conn2.listAllDomains()
        ip_list = ["192.168.169.2" for dom in domInConn1]
        ip_list += ["192.168.169.3" for dom in domInConn2]

        name_list = []
        state_list = []
        for dom in domInConn1:
            name_list.append(dom.name())
            state_list.append(self.getState(dom.info()[0]))
        for dom in domInConn2:
            name_list.append(dom.name())
            state_list.append(self.getState(dom.info()[0]))

        zipped = zip(ip_list, name_list, state_list)
        zipped_sort = sorted(zipped, key=lambda x: x[1])
        result = zip(*zipped_sort)
        ip_list, name_list, state_list = [list(a) for a in result]
        return ip_list, name_list, state_list
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值