import tkinter as tk
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import libvirt
import os
import paramiko
root = tk.Tk()
host_id=1
def create():
def updata():
global host_id
host_id=r.get()
def definekvm():
virt_name = e_virt_name.get()
num_cpu = e_num_cpu.get()
meo_size = e_meo_size.get()
disk_size = e_disk_size.get()
path1='/home/manxu/Desktop/CentOS-7-x86_64-DVD-2003.iso'
path2='/home/mpiuser/CentOS-7-x86_64-DVD-2009.iso'
if host_id==1:
iso_path=path1
conn=libvirt.open('qemu:///system')
instruction = 'cd /usr/local/img && qemu-img create -f qcow2 {}.qcow2 {}G'.format(virt_name, disk_size)
os.system(instruction)
else:
iso_path=path2
conn = libvirt.open('qemu+ssh://root@node2/system')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
command='cd /usr/local/img'+';'+'qemu-img create -f qcow2 {}.qcow2 {}G'.format(virt_name,disk_size)
ssh.connect('192.168.0.14', '22', 'root')
ssh.exec_command(command)
qcow_path='/usr/local/img/{}.qcow2'.format(virt_name)
domain_list1 = conn.listDomainsID()
domain_list2=conn.listDefinedDomains()
xmldesc = '''
<domain type='kvm'>
<name>{}</name>
<memory unit='KiB'>{}</memory>
<currentMemory unit='KiB'>{}</currentMemory>
<vcpu placement='static'>{}</vcpu>
<os>
<type arch='x86_64' machine='rhel6.5.0'>hvm</type>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='{}'/>
<target dev='hda' bus='ide'/>
</disk>
<disk type='file' device='cdrom'>
<source file='{}'/>
<target dev='hdc' bus='ide'/>
</disk>
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='bridge'>
<virtualport type='openvswitch'/>
<source bridge='br0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<graphics type='vnc' port='{}' autoport='no' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<input type='mouse' bus='ps2'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</memballoon>
</devices>
</domain>
'''.format(virt_name,int(meo_size)*1024*1024,int(meo_size)*1024*1024,int(num_cpu),qcow_path,iso_path,5900+len(domain_list1)+len(domain_list2))
conn.defineXML(xmldesc)
if host_id==1:
information=[virt_name,'closed','host1']
else:
information=[virt_name,'closed','host2']
tree.insert('',END,values=information)
conn.close()
child_window=tk.Toplevel()
child_window.geometry('300x520')
child_window.title('创建虚拟机')
r = tk.IntVar()
r.set(1)
label1 = tk.Label(child_window, text='选择创建的主机:', font=20)
label1.pack(anchor="w",pady=10)
radio1 = tk.Radiobutton(child_window, text="host1", value=1, variable=r,command=updata,font=12)
radio1.pack(anchor="w")
radio2 = tk.Radiobutton(child_window, text="host2", value=2, variable=r,command=updata,font=12)
radio2.pack(anchor="w")
label2=tk.Label(child_window,text='虚拟机名称:',font=20)
label2.pack(anchor="w",pady=20)
e_virt_name=tk.Entry(child_window,width=15,font=20)
e_virt_name.pack(anchor="w")
label3 = tk.Label(child_window, text='CPU个数:', font=20)
label3.pack(anchor="w", pady=20)
e_num_cpu = tk.Entry(child_window, width=15, font=20)
e_num_cpu.pack(anchor="w")
label4 = tk.Label(child_window, text='内存空间(GB):', font=20)
label4.pack(anchor="w", pady=20)
e_meo_size = tk.Entry(child_window, width=15, font=20)
e_meo_size.pack(anchor="w")
label5 = tk.Label(child_window, text='磁盘空间(GB):', font=20)
label5.pack(anchor="w", pady=20)
e_disk_size = tk.Entry(child_window, width=15, font=20)
e_disk_size.pack(anchor="w")
button = tk.Button(child_window, text='信息输入完毕', font=16,command=definekvm)
button.pack(anchor="w", pady=20)
child_window.mainloop()
def onClick(event):
button2.config(state=tk.DISABLED)
button3.config(state=tk.DISABLED)
button4.config(state=tk.DISABLED)
global item
item=tree.selection()[0]
virt_name=tree.item(item)['values'][0]
mach_states=tree.item(item)['values'][1]
host_name=tree.item(item)['values'][2]
if mach_states=='closed':
button2.config(state=tk.NORMAL)
if mach_states=='open':
button3.config(state=tk.NORMAL)
button4.config(state=tk.NORMAL)
def open_virt():
virt_name = tree.item(item)['values'][0]
host_name = tree.item(item)['values'][2]
if host_name=='host1':
conn = libvirt.open('qemu:///system')
else:
conn = libvirt.open('qemu+ssh://root@node2/system')
dom = conn.lookupByName(virt_name)
dom.create()
value=[virt_name,'open',host_name]
tree.item(item,values=value)
conn.close()
def delete_virt():
virt_name = tree.item(item)['values'][0]
host_name = tree.item(item)['values'][2]
if host_name=='host1':
conn = libvirt.open('qemu:///system')
else:
conn = libvirt.open('qemu+ssh://root@node2/system')
dom = conn.lookupByName(virt_name)
dom.destroy()
tree.delete(item)
conn.close()
def close_virt():
virt_name = tree.item(item)['values'][0]
host_name = tree.item(item)['values'][2]
if host_name=='host1':
conn = libvirt.open('qemu:///system')
else:
conn = libvirt.open('qemu+ssh://root@node2/system')
dom = conn.lookupByName(virt_name)
dom.shutdown()
value=[virt_name,'closed',host_name]
tree.item(item,values=value)
conn.close()
def update_state():
x = tree.get_children()
for item in x:
tree.delete(item)
conn1 = libvirt.open('qemu:///system')
vms_list = []
domain_list = conn1.listDomainsID()
for id in domain_list:
vms_list.append(conn1.lookupByID(id).name())
for item_ in vms_list:
value = [item_, 'open', 'host1']
tree.insert('', END, values=value)
vms_list = []
for id in conn1.listDefinedDomains():
vms_list.append(id)
for item_ in vms_list:
value = [item_, 'closed', 'host1']
tree.insert('', END, values=value)
conn1.close()
conn2 = libvirt.open('qemu+ssh://root@node2/system')
vms_list = []
domain_list = conn2.listDomainsID()
for id in domain_list:
vms_list.append(conn2.lookupByID(id).name())
for item_ in vms_list:
value = [item_, 'open', 'host2']
tree.insert('', END, values=value)
vms_list = []
for id in conn2.listDefinedDomains():
vms_list.append(id)
for item_ in vms_list:
value = [item_, 'closed', 'host2']
tree.insert('', END, values=value)
conn2.close()
root.geometry('600x400')
root.title('虚拟机管理系统')
button1=tk.Button(root,text='创建虚拟机',font=('Arial', 16),command=create)
button1.place(relx=0.04,rely=0.08)
button5=tk.Button(root,text='更新状态',font=('Arial', 16),command=update_state)
button5.place(relx=0.34,rely=0.08)
yscroll = Scrollbar(root, orient=VERTICAL)
tree = ttk.Treeview(root,height=10,show='headings', yscrollcommand=yscroll.set)
tree.place(relx=0.04,rely=0.25)
tree["columns"] = ("虚拟机名称", "虚拟机状态",'虚拟机来源')
tree.column("虚拟机名称", width=200)
tree.column("虚拟机状态", width=200)
tree.column("虚拟机来源", width=150)
tree.heading("虚拟机名称", text="虚拟机名称")
tree.heading("虚拟机状态", text="虚拟机状态")
tree.heading("虚拟机来源", text="虚拟机来源")
yscroll.pack(side=RIGHT, fill=Y)
yscroll.config(command=tree.yview)
button2=tk.Button(root,text='开启虚拟机',font=('Arial', 16),command=open_virt)
button2.place(relx=0.04,rely=0.85)
button2.config(state=tk.DISABLED)
button3=tk.Button(root,text='关闭虚拟机',font=('Arial', 16),command=close_virt)
button3.place(relx=0.34,rely=0.85)
button3.config(state=tk.DISABLED)
button4=tk.Button(root,text='删除虚拟机',font=('Arial', 16),command=delete_virt)
button4.place(relx=0.64,rely=0.85)
button4.config(state=tk.DISABLED)
conn1 = libvirt.open('qemu:///system')
vms_list = []
domain_list = conn1.listDomainsID()
for id in domain_list:
vms_list.append(conn1.lookupByID(id).name())
for item_ in vms_list:
value=[item_,'open','host1']
tree.insert('', END, values=value)
vms_list = []
for id in conn1.listDefinedDomains():
vms_list.append(id)
for item_ in vms_list:
value=[item_,'closed','host1']
tree.insert('', END, values=value)
conn1.close()
conn2 = libvirt.open('qemu+ssh://root@node2/system')
vms_list = []
domain_list = conn2.listDomainsID()
for id in domain_list:
vms_list.append(conn2.lookupByID(id).name())
for item_ in vms_list:
value=[item_,'open','host2']
tree.insert('', END, values=value)
vms_list = []
for id in conn2.listDefinedDomains():
vms_list.append(id)
for item_ in vms_list:
value=[item_,'closed','host2']
tree.insert('', END, values=value)
conn2.close()
tree.bind("<ButtonRelease-1>", onClick)
root.mainloop()
KVM虚拟机管理系统(基于python libvirt实现)
于 2022-05-13 15:31:36 首次发布