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
kvm管理类
最新推荐文章于 2025-05-23 09:16:47 发布