mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
Massive re-factor pulling out a VM Engine class to deal with polling libvirt, emitting signals & generally managing the application
This commit is contained in:
parent
b127277e3f
commit
a4545bb8e7
@ -54,11 +54,9 @@ class vmmAbout:
|
||||
return 1
|
||||
|
||||
class vmmConsole:
|
||||
def __init__(self, vmm, stats, conf, vmname):
|
||||
def __init__(self, engine, vmname):
|
||||
self.window = gtk.glade.XML(asset_dir + "/" + appname + ".glade", "vmm-console")
|
||||
self.vmm = vmm
|
||||
self.stats = stats
|
||||
self.conf = conf
|
||||
self.engine = engine
|
||||
self.vmname = vmname
|
||||
self.lastStatus = None
|
||||
|
||||
@ -93,7 +91,7 @@ class vmmConsole:
|
||||
"on_control_snapshot_clicked": self.control_vm_snapshot,
|
||||
})
|
||||
|
||||
self.stats.connect_to_signal("vm_updated", self.refresh_status)
|
||||
self.engine.connect_to_signal("vm_updated", self.refresh_status)
|
||||
self.refresh_status(vmname)
|
||||
|
||||
def show(self):
|
||||
@ -108,16 +106,16 @@ class vmmConsole:
|
||||
return 0
|
||||
|
||||
def control_vm_shutdown(self, src):
|
||||
if not(self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]):
|
||||
if not(self.engine.get_stats().run_status(self.vmname) in [ "shutdown", "shutoff" ]):
|
||||
self.vmm.shutdown()
|
||||
else:
|
||||
print "Shutdown requested, but machine is already shutting down / shutoff"
|
||||
|
||||
def control_vm_pause(self, src):
|
||||
if self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]:
|
||||
if self.engine.get_stats().run_status(self.vmname) in [ "shutdown", "shutoff" ]:
|
||||
print "Pause/resume requested, but machine is shutdown / shutoff"
|
||||
else:
|
||||
if self.stats.run_status(self.vmname) in [ "paused" ]:
|
||||
if self.engine.get_stats().run_status(self.vmname) in [ "paused" ]:
|
||||
if not src.get_active():
|
||||
self.vmm.resume()
|
||||
else:
|
||||
@ -139,7 +137,7 @@ class vmmConsole:
|
||||
if not(vmname == self.vmname):
|
||||
return
|
||||
|
||||
status = self.stats.run_status(vmname)
|
||||
status = self.engine.get_stats().run_status(vmname)
|
||||
|
||||
if self.lastStatus == status:
|
||||
return
|
||||
@ -168,11 +166,9 @@ class vmmConsole:
|
||||
|
||||
|
||||
class vmmDetails:
|
||||
def __init__(self, vmm, stats, conf, vmname):
|
||||
def __init__(self, engine, vmname):
|
||||
self.window = gtk.glade.XML(asset_dir + "/" + appname + ".glade", "vmm-details")
|
||||
self.vmm = vmm
|
||||
self.stats = stats
|
||||
self.conf = conf
|
||||
self.engine = engine
|
||||
self.vmname = vmname
|
||||
self.lastStatus = None
|
||||
|
||||
@ -244,7 +240,7 @@ class vmmDetails:
|
||||
self.network_traffic_canvas.show()
|
||||
self.window.get_widget("graph-table").attach(self.network_traffic_canvas, 1, 2, 3, 4)
|
||||
|
||||
conf.on_stats_history_length_changed(self.change_graph_ranges)
|
||||
self.engine.get_config().on_stats_history_length_changed(self.change_graph_ranges)
|
||||
|
||||
self.window.signal_autoconnect({
|
||||
"on_close_details_clicked": self.close,
|
||||
@ -258,7 +254,7 @@ class vmmDetails:
|
||||
"on_control_snapshot_clicked": self.control_vm_snapshot,
|
||||
})
|
||||
|
||||
self.stats.connect_to_signal("vm_updated", self.refresh_overview)
|
||||
self.engine.connect_to_signal("vm_updated", self.refresh_overview)
|
||||
self.change_graph_ranges()
|
||||
self.refresh_overview(vmname)
|
||||
self.hw_selected()
|
||||
@ -287,16 +283,16 @@ class vmmDetails:
|
||||
return 0
|
||||
|
||||
def control_vm_shutdown(self, src):
|
||||
if not(self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]):
|
||||
if not(self.engine.get_stats().run_status(self.vmname) in [ "shutdown", "shutoff" ]):
|
||||
self.vmm.shutdown()
|
||||
else:
|
||||
print "Shutdown requested, but machine is already shutting down / shutoff"
|
||||
|
||||
def control_vm_pause(self, src):
|
||||
if self.stats.run_status(self.vmname) in [ "shutdown", "shutoff" ]:
|
||||
if self.engine.get_stats().run_status(self.vmname) in [ "shutdown", "shutoff" ]:
|
||||
print "Pause/resume requested, but machine is shutdown / shutoff"
|
||||
else:
|
||||
if self.stats.run_status(self.vmname) in [ "paused" ]:
|
||||
if self.engine.get_stats().run_status(self.vmname) in [ "paused" ]:
|
||||
if not src.get_active():
|
||||
self.vmm.resume()
|
||||
else:
|
||||
@ -363,16 +359,16 @@ class vmmDetails:
|
||||
if not(vmname == self.vmname):
|
||||
return
|
||||
|
||||
status = self.stats.run_status(vmname)
|
||||
status = self.engine.get_stats().run_status(vmname)
|
||||
self.update_widget_states(status)
|
||||
|
||||
self.window.get_widget("overview-status-text").set_text(status)
|
||||
self.window.get_widget("overview-status-icon").set_from_pixbuf(self.stats.run_status_icon(vmname))
|
||||
self.window.get_widget("overview-cpu-usage-text").set_text("%d %%" % self.stats.cpu_time_percentage(vmname))
|
||||
self.window.get_widget("overview-memory-usage-text").set_text("%d MB of %d MB" % (self.stats.current_memory(vmname)/1024, self.stats.host_memory_size()/1024))
|
||||
self.window.get_widget("overview-status-icon").set_from_pixbuf(self.engine.get_stats().run_status_icon(vmname))
|
||||
self.window.get_widget("overview-cpu-usage-text").set_text("%d %%" % self.engine.get_stats().cpu_time_percentage(vmname))
|
||||
self.window.get_widget("overview-memory-usage-text").set_text("%d MB of %d MB" % (self.engine.get_stats().current_memory(vmname)/1024, self.engine.get_stats().host_memory_size()/1024))
|
||||
|
||||
history_len = self.conf.get_stats_history_length()
|
||||
cpu_vector = self.stats.cpu_time_vector(vmname)
|
||||
history_len = self.engine.get_config().get_stats_history_length()
|
||||
cpu_vector = self.engine.get_stats().cpu_time_vector(vmname)
|
||||
cpu_vector.reverse()
|
||||
if self.cpu_usage_line == None:
|
||||
self.cpu_usage_line = self.cpu_usage_graph.plot(cpu_vector)
|
||||
@ -386,8 +382,8 @@ class vmmDetails:
|
||||
self.cpu_usage_graph.set_xticklabels([])
|
||||
self.cpu_usage_canvas.draw()
|
||||
|
||||
history_len = self.conf.get_stats_history_length()
|
||||
memory_vector = self.stats.current_memory_vector(vmname)
|
||||
history_len = self.engine.get_config().get_stats_history_length()
|
||||
memory_vector = self.engine.get_stats().current_memory_vector(vmname)
|
||||
memory_vector.reverse()
|
||||
if self.memory_usage_line == None:
|
||||
self.memory_usage_line = self.memory_usage_graph.plot(memory_vector)
|
||||
@ -401,11 +397,11 @@ class vmmDetails:
|
||||
self.memory_usage_graph.set_xticklabels([])
|
||||
self.memory_usage_canvas.draw()
|
||||
|
||||
history_len = self.conf.get_stats_history_length()
|
||||
history_len = self.engine.get_config().get_stats_history_length()
|
||||
#if self.network_traffic_line == None:
|
||||
#self.network_traffic_line = self.network_traffic_graph.plot(self.stats.network_traffic_vector(vmname))
|
||||
#self.network_traffic_line = self.network_traffic_graph.plot(self.engine.get_stats().network_traffic_vector(vmname))
|
||||
#else:
|
||||
#self.network_traffic_line[0].set_ydata(self.stats.network_traffic_vector(vmname))
|
||||
#self.network_traffic_line[0].set_ydata(self.engine.get_stats().network_traffic_vector(vmname))
|
||||
self.network_traffic_graph.set_xlim(0, history_len)
|
||||
self.network_traffic_graph.set_ylim(0, 100)
|
||||
self.network_traffic_graph.set_yticklabels(["0","","","","","100"])
|
||||
@ -415,13 +411,13 @@ class vmmDetails:
|
||||
|
||||
|
||||
class vmmPreferences:
|
||||
def __init__(self, conf):
|
||||
def __init__(self, engine):
|
||||
self.window = gtk.glade.XML(asset_dir + "/" + appname + ".glade", "vmm-preferences")
|
||||
self.conf = conf
|
||||
self.engine = engine
|
||||
self.window.get_widget("vmm-preferences").hide()
|
||||
|
||||
self.conf.on_stats_update_interval_changed(self.refresh_update_interval)
|
||||
self.conf.on_stats_history_length_changed(self.refresh_history_length)
|
||||
self.engine.get_config().on_stats_update_interval_changed(self.refresh_update_interval)
|
||||
self.engine.get_config().on_stats_history_length_changed(self.refresh_history_length)
|
||||
|
||||
self.refresh_update_interval()
|
||||
self.refresh_history_length()
|
||||
@ -442,51 +438,39 @@ class vmmPreferences:
|
||||
self.window.get_widget("vmm-preferences").show_all()
|
||||
|
||||
def refresh_update_interval(self, ignore1=None,ignore2=None,ignore3=None,ignore4=None):
|
||||
self.window.get_widget("stats-update-interval").set_value(self.conf.get_stats_update_interval())
|
||||
self.window.get_widget("stats-update-interval").set_value(self.engine.get_config().get_stats_update_interval())
|
||||
|
||||
def refresh_history_length(self, ignore1=None,ignore2=None,ignore3=None,ignore4=None):
|
||||
self.window.get_widget("stats-history-length").set_value(self.conf.get_stats_history_length())
|
||||
self.window.get_widget("stats-history-length").set_value(self.engine.get_config().get_stats_history_length())
|
||||
|
||||
def change_update_interval(self, src):
|
||||
self.conf.set_stats_update_interval(src.get_value_as_int())
|
||||
self.engine.get_config().set_stats_update_interval(src.get_value_as_int())
|
||||
|
||||
def change_history_length(self, src):
|
||||
self.conf.set_stats_history_length(src.get_value_as_int())
|
||||
self.engine.get_config().set_stats_history_length(src.get_value_as_int())
|
||||
|
||||
|
||||
class vmmManager:
|
||||
def __init__(self):
|
||||
def __init__(self, engine):
|
||||
self.window = gtk.glade.XML(asset_dir + "/" + appname + ".glade", "vmm-manager")
|
||||
self.conf = vmmConfig()
|
||||
self.vmm = libvirt.openReadOnly(None)
|
||||
#self.vmm = libvirt.open(None)
|
||||
print self.vmm.getInfo()
|
||||
|
||||
self.stats = vmmStats(self.vmm, self.conf)
|
||||
self.engine = engine
|
||||
self.prepare_vmlist()
|
||||
|
||||
self.about = None
|
||||
self.preferences = None
|
||||
self.details = {}
|
||||
self.consoles = {}
|
||||
self.engine.connect_to_signal("vm_added", self.vm_added)
|
||||
self.engine.connect_to_signal("vm_removed", self.vm_removed)
|
||||
self.engine.connect_to_signal("vm_updated", self.vm_updated)
|
||||
|
||||
# Setup update timers
|
||||
self.conf.on_stats_update_interval_changed(self.change_timer_interval)
|
||||
self.engine.get_config().on_vmlist_status_visible_changed(self.toggle_status_visible_widget)
|
||||
self.engine.get_config().on_vmlist_cpu_usage_visible_changed(self.toggle_cpu_usage_visible_widget)
|
||||
self.engine.get_config().on_vmlist_memory_usage_visible_changed(self.toggle_memory_usage_visible_widget)
|
||||
self.engine.get_config().on_vmlist_disk_usage_visible_changed(self.toggle_disk_usage_visible_widget)
|
||||
self.engine.get_config().on_vmlist_network_traffic_visible_changed(self.toggle_network_traffic_visible_widget)
|
||||
|
||||
self.stats.connect_to_signal("vm_added", self.vm_added)
|
||||
self.stats.connect_to_signal("vm_removed", self.vm_removed)
|
||||
|
||||
self.conf.on_vmlist_status_visible_changed(self.toggle_status_visible_widget)
|
||||
self.conf.on_vmlist_cpu_usage_visible_changed(self.toggle_cpu_usage_visible_widget)
|
||||
self.conf.on_vmlist_memory_usage_visible_changed(self.toggle_memory_usage_visible_widget)
|
||||
self.conf.on_vmlist_disk_usage_visible_changed(self.toggle_disk_usage_visible_widget)
|
||||
self.conf.on_vmlist_network_traffic_visible_changed(self.toggle_network_traffic_visible_widget)
|
||||
|
||||
self.window.get_widget("menu_view_status").set_active(self.conf.is_vmlist_status_visible())
|
||||
self.window.get_widget("menu_view_cpu_usage").set_active(self.conf.is_vmlist_cpu_usage_visible())
|
||||
self.window.get_widget("menu_view_memory_usage").set_active(self.conf.is_vmlist_memory_usage_visible())
|
||||
self.window.get_widget("menu_view_disk_usage").set_active(self.conf.is_vmlist_disk_usage_visible())
|
||||
self.window.get_widget("menu_view_network_traffic").set_active(self.conf.is_vmlist_network_traffic_visible())
|
||||
self.window.get_widget("menu_view_status").set_active(self.engine.get_config().is_vmlist_status_visible())
|
||||
self.window.get_widget("menu_view_cpu_usage").set_active(self.engine.get_config().is_vmlist_cpu_usage_visible())
|
||||
self.window.get_widget("menu_view_memory_usage").set_active(self.engine.get_config().is_vmlist_memory_usage_visible())
|
||||
self.window.get_widget("menu_view_disk_usage").set_active(self.engine.get_config().is_vmlist_disk_usage_visible())
|
||||
self.window.get_widget("menu_view_network_traffic").set_active(self.engine.get_config().is_vmlist_network_traffic_visible())
|
||||
|
||||
self.window.get_widget("menu_file_new").set_sensitive(False)
|
||||
self.window.get_widget("vm-new").set_sensitive(False)
|
||||
@ -514,19 +498,14 @@ class vmmManager:
|
||||
self.vm_selected(None)
|
||||
self.window.get_widget("vm-list").get_selection().connect("changed", self.vm_selected)
|
||||
|
||||
self.stats.tick()
|
||||
self.schedule_timer()
|
||||
|
||||
def show(self):
|
||||
self.window.get_widget("vmm-manager").show_all()
|
||||
|
||||
|
||||
def exit_app(self, ignore=None,ignore2=None):
|
||||
gtk.main_quit()
|
||||
|
||||
def schedule_timer(self):
|
||||
interval = self.conf.get_stats_update_interval() * 1000
|
||||
print "Scheduling at " + str(interval)
|
||||
self.timer_started = time() * 1000
|
||||
self.timer = gobject.timeout_add(interval, self.refresh_stats)
|
||||
|
||||
|
||||
def vm_added(self, name):
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
@ -555,6 +534,15 @@ class vmmManager:
|
||||
print "Remove " + name
|
||||
break
|
||||
|
||||
def vm_updated(self, name):
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
model = vmlist.get_model()
|
||||
|
||||
for row in range(model.iter_n_children(None)):
|
||||
iter = model.iter_nth_child(None, row)
|
||||
if model.get_value(iter, 0) == name:
|
||||
model.row_changed(str(row), iter)
|
||||
|
||||
def current_vm(self):
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
selection = vmlist.get_selection()
|
||||
@ -564,24 +552,11 @@ class vmmManager:
|
||||
return None
|
||||
|
||||
def show_vm_details(self,ignore):
|
||||
vmname = self.current_vm()
|
||||
if not(self.details.has_key(vmname)):
|
||||
self.details[vmname] = vmmDetails(self.vmm, self.stats, self.conf, vmname)
|
||||
|
||||
self.details[vmname].show()
|
||||
self.engine.show_details(self.current_vm())
|
||||
|
||||
def open_vm_console(self,ignore):
|
||||
vmname = self.current_vm()
|
||||
if not(self.consoles.has_key(vmname)):
|
||||
self.consoles[vmname] = vmmConsole(self.vmm, self.stats, self.conf, vmname)
|
||||
self.engine.show_console(self.current_vm())
|
||||
|
||||
self.consoles[vmname].show()
|
||||
|
||||
def change_timer_interval(self,ignore1,ignore2,ignore3,ignore4):
|
||||
print "Removing timer"
|
||||
gobject.source_remove(self.timer)
|
||||
self.refresh_stats()
|
||||
self.schedule_timer()
|
||||
|
||||
def vm_selected(self, selection):
|
||||
if selection == None or selection.count_selected_rows() == 0:
|
||||
@ -599,27 +574,11 @@ class vmmManager:
|
||||
self.window.get_widget("menu_edit_delete").set_sensitive(False)
|
||||
self.window.get_widget("menu_edit_details").set_sensitive(True)
|
||||
|
||||
def show_about(self, ignore=None):
|
||||
if self.about == None:
|
||||
self.about = vmmAbout()
|
||||
self.about.show()
|
||||
|
||||
def show_preferences(self, ignore=None):
|
||||
if self.preferences == None:
|
||||
self.preferences = vmmPreferences(self.conf)
|
||||
self.preferences.show()
|
||||
|
||||
def refresh_stats(self):
|
||||
self.stats.tick()
|
||||
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
model = vmlist.get_model()
|
||||
|
||||
for row in range(model.iter_n_children(None)):
|
||||
model.row_changed(str(row), model.iter_nth_child(None, row))
|
||||
|
||||
return 1
|
||||
def show_about(self, src):
|
||||
self.engine.show_about()
|
||||
|
||||
def show_preferences(self, src):
|
||||
self.engine.show_preferences()
|
||||
|
||||
def prepare_vmlist(self):
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
@ -652,7 +611,7 @@ class vmmManager:
|
||||
statusCol.pack_start(status_txt, True)
|
||||
statusCol.set_cell_data_func(status_txt, self.status_text, None)
|
||||
statusCol.set_cell_data_func(status_icon, self.status_icon, None)
|
||||
statusCol.set_visible(self.conf.is_vmlist_status_visible())
|
||||
statusCol.set_visible(self.engine.get_config().is_vmlist_status_visible())
|
||||
|
||||
|
||||
|
||||
@ -663,7 +622,7 @@ class vmmManager:
|
||||
cpuUsageCol.pack_start(cpuUsage_img, False)
|
||||
cpuUsageCol.set_cell_data_func(cpuUsage_txt, self.cpu_usage_text, None)
|
||||
cpuUsageCol.set_cell_data_func(cpuUsage_img, self.cpu_usage_img, None)
|
||||
cpuUsageCol.set_visible(self.conf.is_vmlist_cpu_usage_visible())
|
||||
cpuUsageCol.set_visible(self.engine.get_config().is_vmlist_cpu_usage_visible())
|
||||
cpuUsageCol.set_sort_column_id(VMLIST_SORT_CPU_USAGE)
|
||||
|
||||
memoryUsage_txt = gtk.CellRendererText()
|
||||
@ -672,18 +631,18 @@ class vmmManager:
|
||||
memoryUsageCol.pack_start(memoryUsage_img, True)
|
||||
memoryUsageCol.set_cell_data_func(memoryUsage_txt, self.memory_usage_text, None)
|
||||
memoryUsageCol.set_cell_data_func(memoryUsage_img, self.memory_usage_img, None)
|
||||
memoryUsageCol.set_visible(self.conf.is_vmlist_memory_usage_visible())
|
||||
memoryUsageCol.set_visible(self.engine.get_config().is_vmlist_memory_usage_visible())
|
||||
memoryUsageCol.set_sort_column_id(VMLIST_SORT_MEMORY_USAGE)
|
||||
|
||||
diskUsage_txt = gtk.CellRendererText()
|
||||
diskUsageCol.pack_start(diskUsage_txt, True)
|
||||
diskUsageCol.set_cell_data_func(diskUsage_txt, self.disk_usage_text, None)
|
||||
diskUsageCol.set_visible(self.conf.is_vmlist_disk_usage_visible())
|
||||
diskUsageCol.set_visible(self.engine.get_config().is_vmlist_disk_usage_visible())
|
||||
|
||||
networkTraffic_txt = gtk.CellRendererText()
|
||||
networkTrafficCol.pack_start(networkTraffic_txt, True)
|
||||
networkTrafficCol.set_cell_data_func(networkTraffic_txt, self.network_usage_text, None)
|
||||
networkTrafficCol.set_visible(self.conf.is_vmlist_network_traffic_visible())
|
||||
networkTrafficCol.set_visible(self.engine.get_config().is_vmlist_network_traffic_visible())
|
||||
|
||||
model.set_sort_func(VMLIST_SORT_NAME, self.vmlist_name_sorter)
|
||||
model.set_sort_func(VMLIST_SORT_CPU_USAGE, self.vmlist_cpu_usage_sorter)
|
||||
@ -705,83 +664,83 @@ class vmmManager:
|
||||
return self.sort_op(model.get_value(iter1, 0), model.get_value(iter2, 0))
|
||||
|
||||
def vmlist_cpu_usage_sorter(self, model, iter1, iter2):
|
||||
return self.sort_op(self.stats.cpu_time(model.get_value(iter1, 0)), self.stats.cpu_time(model.get_value(iter2, 0)))
|
||||
return self.sort_op(self.engine.get_stats().cpu_time(model.get_value(iter1, 0)), self.engine.get_stats().cpu_time(model.get_value(iter2, 0)))
|
||||
|
||||
def vmlist_memory_usage_sorter(self, model, iter1, iter2):
|
||||
return self.sort_op(self.stats.current_memory(model.get_value(iter1, 0)), self.stats.current_memory(model.get_value(iter2, 0)))
|
||||
return self.sort_op(self.engine.get_stats().current_memory(model.get_value(iter1, 0)), self.engine.get_stats().current_memory(model.get_value(iter2, 0)))
|
||||
|
||||
def toggle_status_visible_conf(self, menu):
|
||||
self.conf.set_vmlist_status_visible(menu.get_active())
|
||||
self.engine.get_config().set_vmlist_status_visible(menu.get_active())
|
||||
|
||||
def toggle_status_visible_widget(self, ignore1, ignore2, ignore3, ignore4):
|
||||
menu = self.window.get_widget("menu_view_status")
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
col = vmlist.get_column(1)
|
||||
col.set_visible(self.conf.is_vmlist_status_visible())
|
||||
col.set_visible(self.engine.get_config().is_vmlist_status_visible())
|
||||
|
||||
def toggle_cpu_usage_visible_conf(self, menu):
|
||||
self.conf.set_vmlist_cpu_usage_visible(menu.get_active())
|
||||
self.engine.get_config().set_vmlist_cpu_usage_visible(menu.get_active())
|
||||
|
||||
def toggle_cpu_usage_visible_widget(self, ignore1, ignore2, ignore3, ignore4):
|
||||
menu = self.window.get_widget("menu_view_cpu_usage")
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
col = vmlist.get_column(2)
|
||||
col.set_visible(self.conf.is_vmlist_cpu_usage_visible())
|
||||
col.set_visible(self.engine.get_config().is_vmlist_cpu_usage_visible())
|
||||
|
||||
def toggle_memory_usage_visible_conf(self, menu):
|
||||
self.conf.set_vmlist_memory_usage_visible(menu.get_active())
|
||||
self.engine.get_config().set_vmlist_memory_usage_visible(menu.get_active())
|
||||
|
||||
def toggle_memory_usage_visible_widget(self, ignore1, ignore2, ignore3, ignore4):
|
||||
menu = self.window.get_widget("menu_view_memory_usage")
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
col = vmlist.get_column(3)
|
||||
col.set_visible(self.conf.is_vmlist_memory_usage_visible())
|
||||
col.set_visible(self.engine.get_config().is_vmlist_memory_usage_visible())
|
||||
|
||||
def toggle_disk_usage_visible_conf(self, menu):
|
||||
self.conf.set_vmlist_disk_usage_visible(menu.get_active())
|
||||
self.engine.get_config().set_vmlist_disk_usage_visible(menu.get_active())
|
||||
|
||||
def toggle_disk_usage_visible_widget(self, ignore1, ignore2, ignore3, ignore4):
|
||||
menu = self.window.get_widget("menu_view_disk_usage")
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
col = vmlist.get_column(4)
|
||||
col.set_visible(self.conf.is_vmlist_disk_usage_visible())
|
||||
col.set_visible(self.engine.get_config().is_vmlist_disk_usage_visible())
|
||||
|
||||
def toggle_network_traffic_visible_conf(self, menu):
|
||||
self.conf.set_vmlist_network_traffic_visible(menu.get_active())
|
||||
self.engine.get_config().set_vmlist_network_traffic_visible(menu.get_active())
|
||||
|
||||
def toggle_network_traffic_visible_widget(self, ignore1, ignore2, ignore3, ignore4):
|
||||
menu = self.window.get_widget("menu_view_network_traffic")
|
||||
vmlist = self.window.get_widget("vm-list")
|
||||
col = vmlist.get_column(5)
|
||||
col.set_visible(self.conf.is_vmlist_network_traffic_visible())
|
||||
col.set_visible(self.engine.get_config().is_vmlist_network_traffic_visible())
|
||||
|
||||
|
||||
def status_text(self, column, cell, model, iter, data):
|
||||
name = model.get_value(iter, 0)
|
||||
cell.set_property('text', self.stats.run_status(name))
|
||||
cell.set_property('text', self.engine.get_stats().run_status(name))
|
||||
|
||||
def status_icon(self, column, cell, model, iter, data):
|
||||
name = model.get_value(iter, 0)
|
||||
cell.set_property('pixbuf', self.stats.run_status_icon(name))
|
||||
cell.set_property('pixbuf', self.engine.get_stats().run_status_icon(name))
|
||||
|
||||
def cpu_usage_text(self, column, cell, model, iter, data):
|
||||
name = model.get_value(iter, 0)
|
||||
cell.set_property('text', "%2.2f %%" % self.stats.cpu_time_percentage(name))
|
||||
cell.set_property('text', "%2.2f %%" % self.engine.get_stats().cpu_time_percentage(name))
|
||||
|
||||
def cpu_usage_img(self, column, cell, model, iter, data):
|
||||
name = model.get_value(iter, 0)
|
||||
cell.set_property('text', '')
|
||||
cell.set_property('value', self.stats.cpu_time_percentage(name))
|
||||
cell.set_property('value', self.engine.get_stats().cpu_time_percentage(name))
|
||||
|
||||
def memory_usage_text(self, column, cell, model, iter, data):
|
||||
name = model.get_value(iter, 0)
|
||||
current = self.stats.current_memory(name)
|
||||
currentPercent = self.stats.current_memory_percentage(name)
|
||||
current = self.engine.get_stats().current_memory(name)
|
||||
currentPercent = self.engine.get_stats().current_memory_percentage(name)
|
||||
cell.set_property('text', "%s (%2.2f%%)" % (self.pretty_mem(current) , currentPercent))
|
||||
|
||||
def memory_usage_img(self, column, cell, model, iter, data):
|
||||
name = model.get_value(iter, 0)
|
||||
currentPercent = self.stats.current_memory_percentage(name)
|
||||
currentPercent = self.engine.get_stats().current_memory_percentage(name)
|
||||
cell.set_property('text', '')
|
||||
cell.set_property('value', currentPercent)
|
||||
|
||||
@ -887,12 +846,10 @@ class vmmConfig:
|
||||
|
||||
|
||||
class vmmStats:
|
||||
def __init__(self, vmm, conf):
|
||||
self.vmm = vmm
|
||||
self.vms = {}
|
||||
self.hostinfo = vmm.getInfo()
|
||||
self.conf = conf
|
||||
self.callbacks = { "vm_added": [], "vm_removed": [], "vm_updated": [] }
|
||||
def __init__(self, engine, hostinfo):
|
||||
self.engine = engine
|
||||
self.hostinfo = hostinfo
|
||||
self.record = {}
|
||||
|
||||
self.status_icons = {
|
||||
"blocked": gtk.gdk.pixbuf_new_from_file(asset_dir + "/pixmaps/state_blocked.png"),
|
||||
@ -904,6 +861,188 @@ class vmmStats:
|
||||
"idle": gtk.gdk.pixbuf_new_from_file(asset_dir + "/pixmaps/state_idle.png"),
|
||||
}
|
||||
|
||||
self.engine.connect_to_signal("vm_added", self.vm_added)
|
||||
|
||||
|
||||
def vm_added(self, vmname):
|
||||
self.record[vmname] = []
|
||||
|
||||
def vm_removed(self, vmname):
|
||||
del self.record[vmname]
|
||||
|
||||
def update(self, vmname, vm):
|
||||
now = time()
|
||||
|
||||
info = vm.info()
|
||||
|
||||
expected = self.engine.get_config().get_stats_history_length()
|
||||
current = len(self.record[vmname])
|
||||
if current > expected:
|
||||
del self.record[vmname][expected:current]
|
||||
print "Lengh " + str(len(self.record[vmname]))
|
||||
|
||||
prevCpuTime = 0
|
||||
prevTimestamp = 0
|
||||
if len(self.record[vmname]) > 0:
|
||||
prevTimestamp = self.record[vmname][0]["timestamp"]
|
||||
prevCpuTime = self.record[vmname][0]["cpuTimeAbs"]
|
||||
|
||||
pcentCpuTime = (info[4]-prevCpuTime) * 100 / ((now - prevTimestamp)*1000*1000*1000)
|
||||
pcentCpuTime = pcentCpuTime / self.host_active_processor_count()
|
||||
|
||||
pcentCurrMem = info[2] * 100 / self.host_memory_size()
|
||||
pcentMaxMem = info[1] * 100 / self.host_memory_size()
|
||||
|
||||
newStats = { "timestamp": now,
|
||||
"status": info[0],
|
||||
"cpuTime": (info[4]-prevCpuTime),
|
||||
"cpuTimeAbs": info[4],
|
||||
"cpuTimePercent": pcentCpuTime,
|
||||
"currMem": info[2],
|
||||
"currMemPercent": pcentCurrMem,
|
||||
"maxMem": info[1],
|
||||
"maxMemPercent": pcentMaxMem,
|
||||
}
|
||||
|
||||
self.record[vmname].insert(0, newStats)
|
||||
|
||||
|
||||
def host_memory_size(self):
|
||||
return self.hostinfo[1]*1024
|
||||
|
||||
def host_active_processor_count(self):
|
||||
return self.hostinfo[2]
|
||||
|
||||
def host_maximum_processor_count(self):
|
||||
return self.hostinfo[4] * self.hostinfo[5] * self.hostinfo[6] * self.hostinfo[7]
|
||||
|
||||
def current_memory(self, vmname):
|
||||
if len(self.record[vmname]) == 0:
|
||||
return 0
|
||||
return self.record[vmname][0]["currMem"]
|
||||
|
||||
def current_memory_percentage(self, vmname):
|
||||
if len(self.record[vmname]) == 0:
|
||||
return 0
|
||||
return self.record[vmname][0]["currMemPercent"]
|
||||
|
||||
def maximum_memory(self, vmname):
|
||||
if len(self.record[vmname]) == 0:
|
||||
return 0
|
||||
return self.record[vmname][0]["maxMem"]
|
||||
|
||||
def maximum_memory_percentage(self, vmname):
|
||||
if len(self.record[vmname]) == 0:
|
||||
return 0
|
||||
return self.record[vmname][0]["maxMemPercent"]
|
||||
|
||||
def cpu_time(self, vmname):
|
||||
if len(self.record[vmname]) == 0:
|
||||
return 0
|
||||
return self.record[vmname][0]["cpuTime"]
|
||||
|
||||
def cpu_time_percentage(self, vmname):
|
||||
if len(self.record[vmname]) == 0:
|
||||
return 0
|
||||
return self.record[vmname][0]["cpuTimePercent"]
|
||||
|
||||
def cpu_time_vector(self, vmname):
|
||||
vector = []
|
||||
stats = self.record[vmname]
|
||||
for i in range(self.engine.get_config().get_stats_history_length()+1):
|
||||
if i < len(stats):
|
||||
vector.append(stats[i]["cpuTimePercent"])
|
||||
else:
|
||||
vector.append(0)
|
||||
return vector
|
||||
|
||||
def current_memory_vector(self, vmname):
|
||||
vector = []
|
||||
stats = self.record[vmname]
|
||||
for i in range(self.engine.get_config().get_stats_history_length()+1):
|
||||
if i < len(stats):
|
||||
vector.append(stats[i]["currMemPercent"])
|
||||
else:
|
||||
vector.append(0)
|
||||
return vector
|
||||
|
||||
def network_traffic_vector(self, vmname):
|
||||
vector = []
|
||||
stats = self.record[vmname]
|
||||
for i in range(self.engine.get_config().get_stats_history_length()+1):
|
||||
vector.append(0)
|
||||
return vector
|
||||
|
||||
|
||||
def run_status(self, vmname):
|
||||
if len(self.record[vmname]) == 0:
|
||||
return "Shutoff"
|
||||
status = self.record[vmname][0]["status"]
|
||||
if status == libvirt.VIR_DOMAIN_NOSTATE:
|
||||
return "Idle"
|
||||
elif status == libvirt.VIR_DOMAIN_RUNNING:
|
||||
return "Running"
|
||||
elif status == libvirt.VIR_DOMAIN_BLOCKED:
|
||||
return "Blocked"
|
||||
elif status == libvirt.VIR_DOMAIN_PAUSED:
|
||||
return "Paused"
|
||||
elif status == libvirt.VIR_DOMAIN_SHUTDOWN:
|
||||
return "Shutdown"
|
||||
elif status == libvirt.VIR_DOMAIN_SHUTOFF:
|
||||
return "Shutoff"
|
||||
elif status == libvirt.VIR_DOMAIN_CRASHED:
|
||||
return "Crashed"
|
||||
else:
|
||||
raise "Unknown status code"
|
||||
|
||||
def run_status_icon(self, name):
|
||||
status = self.run_status(name)
|
||||
return self.status_icons[status.lower()]
|
||||
|
||||
class vmmEngine:
|
||||
def __init__(self):
|
||||
self.config = None
|
||||
self.vmm = libvirt.openReadOnly(None)
|
||||
#self.vmm = libvirt.open(None)
|
||||
self.windowManager = None
|
||||
self.windowPreferences = None
|
||||
self.windowAbout = None
|
||||
self.windowDetails = {}
|
||||
self.windowConsole = {}
|
||||
self.vms = {}
|
||||
|
||||
self.timer = None
|
||||
self.last_timeout = 0
|
||||
|
||||
self.callbacks = { "vm_added": [], "vm_removed": [], "vm_updated": [] }
|
||||
|
||||
self.config = vmmConfig()
|
||||
self.stats = vmmStats(self, self.vmm.getInfo())
|
||||
self.config.on_stats_update_interval_changed(self.reschedule_timer)
|
||||
|
||||
self.schedule_timer()
|
||||
self.windowManager = vmmManager(self)
|
||||
self.tick()
|
||||
|
||||
def reschedule_timer(self, ignore1,ignore2,ignore3,ignore4):
|
||||
self.schedule_timer()
|
||||
|
||||
def schedule_timer(self):
|
||||
interval = self.get_config().get_stats_update_interval() * 1000
|
||||
now = time() * 1000
|
||||
print "Scheule at " + str(interval)
|
||||
if self.timer != None:
|
||||
gobject.source_remove(self.timer)
|
||||
self.timer = None
|
||||
|
||||
self.timer = gobject.timeout_add(interval, self.tick)
|
||||
|
||||
def change_timer_interval(self,ignore1,ignore2,ignore3,ignore4):
|
||||
print "Removing timer"
|
||||
gobject.source_remove(self.timer)
|
||||
self.refresh_stats()
|
||||
self.schedule_timer()
|
||||
|
||||
|
||||
def connect_to_signal(self, name, callback):
|
||||
if not(self.callbacks.has_key(name)):
|
||||
@ -929,12 +1068,44 @@ class vmmStats:
|
||||
for cb in self.callbacks["vm_updated"]:
|
||||
cb(name)
|
||||
|
||||
def get_config(self):
|
||||
return self.config
|
||||
|
||||
def get_stats(self):
|
||||
return self.stats
|
||||
|
||||
def show_about(self):
|
||||
if self.windowAbout == None:
|
||||
self.windowAbout = vmmAbout()
|
||||
self.windowAbout.show()
|
||||
|
||||
def show_preferences(self):
|
||||
if self.windowPreferences == None:
|
||||
self.windowPreferences = vmmPreferences(self)
|
||||
self.windowPreferences.show()
|
||||
|
||||
def show_manager(self):
|
||||
self.windowManager.show()
|
||||
|
||||
def show_details(self, vmname):
|
||||
if not(self.windowDetails.has_key(vmname)):
|
||||
self.windowDetails[vmname] = vmmDetails(self, vmname)
|
||||
|
||||
self.windowDetails[vmname].show()
|
||||
|
||||
def show_console(self, vmname):
|
||||
if not(self.windowConsole.has_key(vmname)):
|
||||
self.windowConsole[vmname] = vmmConsole(self, vmname)
|
||||
|
||||
self.windowConsole[vmname].show()
|
||||
|
||||
|
||||
def tick(self):
|
||||
print "Tick"
|
||||
doms = self.vmm.listDomainsID()
|
||||
newVms = {}
|
||||
if doms != None:
|
||||
for id in self.vmm.listDomainsID():
|
||||
for id in doms:
|
||||
vm = self.vmm.lookupByID(id)
|
||||
newVms[vm.name()] = vm
|
||||
|
||||
@ -945,130 +1116,21 @@ class vmmStats:
|
||||
|
||||
for name in newVms.keys():
|
||||
if not(self.vms.has_key(name)):
|
||||
self.vms[name] = { "handle": newVms[name],
|
||||
"stats": [] }
|
||||
self.vms[name] = newVms[name]
|
||||
self.notify_vm_added(name)
|
||||
|
||||
now = time()
|
||||
|
||||
totalCpuTime = 0
|
||||
for name in self.vms.keys():
|
||||
info = self.vms[name]["handle"].info()
|
||||
|
||||
if len(self.vms[name]["stats"]) > self.conf.get_stats_history_length():
|
||||
end = len(self.vms[name]["stats"])
|
||||
del self.vms[name]["stats"][end-1:end]
|
||||
print "Lengh " + str(len(self.vms[name]["stats"]))
|
||||
|
||||
prevCpuTime = 0
|
||||
prevTimestamp = 0
|
||||
if len(self.vms[name]["stats"]) > 0:
|
||||
prevTimestamp = self.vms[name]["stats"][0]["timestamp"]
|
||||
prevCpuTime = self.vms[name]["stats"][0]["cpuTimeAbs"]
|
||||
|
||||
pcentCpuTime = (info[4]-prevCpuTime) * 100 / ((now - prevTimestamp)*1000*1000*1000)
|
||||
pcentCpuTime = pcentCpuTime / self.host_active_processor_count()
|
||||
|
||||
pcentCurrMem = info[2] * 100 / self.host_memory_size()
|
||||
pcentMaxMem = info[1] * 100 / self.host_memory_size()
|
||||
|
||||
newStats = { "timestamp": now,
|
||||
"status": info[0],
|
||||
"cpuTime": (info[4]-prevCpuTime),
|
||||
"cpuTimeAbs": info[4],
|
||||
"cpuTimePercent": pcentCpuTime,
|
||||
"currMem": info[2],
|
||||
"currMemPercent": pcentCurrMem,
|
||||
"maxMem": info[1],
|
||||
"maxMemPercent": pcentMaxMem,
|
||||
}
|
||||
totalCpuTime = totalCpuTime + newStats["cpuTime"]
|
||||
self.vms[name]["stats"].insert(0, newStats)
|
||||
|
||||
self.stats.update(name, self.vms[name])
|
||||
self.notify_vm_updated(name)
|
||||
|
||||
def host_memory_size(self):
|
||||
return self.hostinfo[1]*1024
|
||||
return 1
|
||||
|
||||
def host_active_processor_count(self):
|
||||
return self.hostinfo[2]
|
||||
|
||||
def host_maximum_processor_count(self):
|
||||
return self.hostinfo[4] * self.hostinfo[5] * self.hostinfo[6] * self.hostinfo[7]
|
||||
|
||||
def current_memory(self, name):
|
||||
return self.vms[name]["stats"][0]["currMem"]
|
||||
|
||||
def current_memory_percentage(self, name):
|
||||
return self.vms[name]["stats"][0]["currMemPercent"]
|
||||
|
||||
def maximum_memory(self, name):
|
||||
return self.vms[name]["stats"][0]["maxMem"]
|
||||
|
||||
def maximum_memory_percentage(self, name):
|
||||
return self.vms[name]["stats"][0]["maxMemPercent"]
|
||||
|
||||
def cpu_time(self, name):
|
||||
return self.vms[name]["stats"][0]["cpuTime"]
|
||||
|
||||
def cpu_time_percentage(self, name):
|
||||
return self.vms[name]["stats"][0]["cpuTimePercent"]
|
||||
|
||||
def cpu_time_vector(self, name):
|
||||
vector = []
|
||||
stats = self.vms[name]["stats"]
|
||||
for i in range(self.conf.get_stats_history_length()+1):
|
||||
if i < len(stats):
|
||||
vector.append(stats[i]["cpuTimePercent"])
|
||||
else:
|
||||
vector.append(0)
|
||||
return vector
|
||||
|
||||
def current_memory_vector(self, name):
|
||||
vector = []
|
||||
stats = self.vms[name]["stats"]
|
||||
for i in range(self.conf.get_stats_history_length()+1):
|
||||
if i < len(stats):
|
||||
vector.append(stats[i]["currMemPercent"])
|
||||
else:
|
||||
vector.append(0)
|
||||
return vector
|
||||
|
||||
def network_traffic_vector(self, name):
|
||||
vector = []
|
||||
stats = self.vms[name]["stats"]
|
||||
for i in range(self.conf.get_stats_history_length()+1):
|
||||
vector.append(0)
|
||||
return vector
|
||||
|
||||
|
||||
def run_status(self, name):
|
||||
status = self.vms[name]["stats"][0]["status"]
|
||||
if status == libvirt.VIR_DOMAIN_NOSTATE:
|
||||
return "Idle"
|
||||
elif status == libvirt.VIR_DOMAIN_RUNNING:
|
||||
return "Running"
|
||||
elif status == libvirt.VIR_DOMAIN_BLOCKED:
|
||||
return "Blocked"
|
||||
elif status == libvirt.VIR_DOMAIN_PAUSED:
|
||||
return "Paused"
|
||||
elif status == libvirt.VIR_DOMAIN_SHUTDOWN:
|
||||
return "Shutdown"
|
||||
elif status == libvirt.VIR_DOMAIN_SHUTOFF:
|
||||
return "Shutoff"
|
||||
elif status == libvirt.VIR_DOMAIN_CRASHED:
|
||||
return "Crashed"
|
||||
else:
|
||||
raise "Unknown status code"
|
||||
|
||||
def run_status_icon(self, name):
|
||||
status = self.run_status(name)
|
||||
return self.status_icons[status.lower()]
|
||||
|
||||
|
||||
# Run me!
|
||||
def main():
|
||||
window = vmmManager()
|
||||
engine = vmmEngine()
|
||||
engine.show_manager()
|
||||
gtk.main()
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
Loading…
Reference in New Issue
Block a user