def init_conn_state(self): #Basic details uri = self.conn.get_uri() host = self.conn.get_hostname() drv = self.conn.get_driver() memory = self.conn.pretty_host_memory_size() proc = self.conn.host_active_processor_count() arch = self.conn.host_architecture() auto = self.conn.get_autoconnect() self.widget("overview-uri").set_text(uri) self.widget("overview-hostname").set_text(host) self.widget("overview-hypervisor").set_text(drv) self.widget("overview-memory").set_text(memory) self.widget("overview-cpus").set_text(str(proc)) self.widget("overview-arch").set_text(arch) self.widget("config-autoconnect").set_active(auto) #Performance self.cpu_usage_graph = Sparkline() self.cpu_usage_graph.show() self.widget("performance-table").attach(self.cpu_usage_graph, 1, 2, 0, 1) self.memory_usage_graph = Sparkline() self.memory_usage_graph.show() self.widget("performance-table").attach(self.memory_usage_graph, 1, 2, 1, 2)
class vmmHost(vmmGObjectUI): def __init__(self, conn): vmmGObjectUI.__init__(self, "vmm-host.ui", "vmm-host") self.conn = conn self.title = conn.get_short_hostname() + " " + self.topwin.get_title() self.topwin.set_title(self.title) self.ICON_RUNNING = "state_running" self.ICON_SHUTOFF = "state_shutoff" self.addnet = None self.addpool = None self.addvol = None self.addinterface = None self.volmenu = None self._in_refresh = False self.cpu_usage_graph = None self.memory_usage_graph = None self.init_conn_state() # Set up signals self.widget("net-list").get_selection().connect("changed", self.net_selected) self.widget("vol-list").get_selection().connect("changed", self.vol_selected) self.widget("interface-list").get_selection().connect("changed", self.interface_selected) self.init_net_state() self.init_storage_state() self.init_interface_state() self.conn.connect("net-added", self.repopulate_networks) self.conn.connect("net-removed", self.repopulate_networks) self.conn.connect("net-started", self.refresh_network) self.conn.connect("net-stopped", self.refresh_network) self.conn.connect("pool-added", self.repopulate_storage_pools) self.conn.connect("pool-removed", self.repopulate_storage_pools) self.conn.connect("pool-started", self.refresh_storage_pool) self.conn.connect("pool-stopped", self.refresh_storage_pool) self.conn.connect("interface-added", self.repopulate_interfaces) self.conn.connect("interface-removed", self.repopulate_interfaces) self.conn.connect("interface-started", self.refresh_interface) self.conn.connect("interface-stopped", self.refresh_interface) self.conn.connect("state-changed", self.conn_state_changed) self.window.connect_signals({ "on_menu_file_view_manager_activate" : self.view_manager, "on_menu_file_quit_activate" : self.exit_app, "on_menu_file_close_activate": self.close, "on_vmm_host_delete_event": self.close, "on_menu_restore_saved_activate": self.restore_domain, "on_menu_help_contents_activate": self.show_help, "on_net_add_clicked": self.add_network, "on_net_delete_clicked": self.delete_network, "on_net_stop_clicked": self.stop_network, "on_net_start_clicked": self.start_network, "on_net_autostart_toggled": self.net_autostart_changed, "on_net_apply_clicked": self.net_apply, "on_pool_add_clicked" : self.add_pool, "on_vol_add_clicked" : self.add_vol, "on_pool_stop_clicked": self.stop_pool, "on_pool_start_clicked": self.start_pool, "on_pool_delete_clicked": self.delete_pool, "on_pool_refresh_clicked": self.pool_refresh, "on_pool_autostart_toggled": self.pool_autostart_changed, "on_vol_delete_clicked": self.delete_vol, "on_vol_list_button_press_event": self.popup_vol_menu, "on_pool_apply_clicked": self.pool_apply, "on_interface_add_clicked" : self.add_interface, "on_interface_start_clicked" : self.start_interface, "on_interface_stop_clicked" : self.stop_interface, "on_interface_delete_clicked" : self.delete_interface, "on_interface_startmode_changed": self.interface_startmode_changed, "on_interface_apply_clicked" : self.interface_apply, "on_config_autoconnect_toggled": self.toggle_autoconnect, }) # XXX: Help docs useless/out of date self.widget("help_menuitem").hide() finish_img = gtk.image_new_from_stock(gtk.STOCK_DELETE, gtk.ICON_SIZE_BUTTON) self.widget("vol-delete").set_image(finish_img) finish_img = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_BUTTON) self.widget("vol-add").set_image(finish_img) self.conn.connect("resources-sampled", self.refresh_resources) self.reset_state() def init_net_state(self): self.widget("network-pages").set_show_tabs(False) # [ unique, label, icon name, icon size, is_active ] netListModel = gtk.ListStore(str, str, str, int, bool) self.widget("net-list").set_model(netListModel) netCol = gtk.TreeViewColumn("Networks") netCol.set_spacing(6) net_txt = gtk.CellRendererText() net_img = gtk.CellRendererPixbuf() netCol.pack_start(net_img, False) netCol.pack_start(net_txt, True) netCol.add_attribute(net_txt, 'text', 1) netCol.add_attribute(net_txt, 'sensitive', 4) netCol.add_attribute(net_img, 'icon-name', 2) netCol.add_attribute(net_img, 'stock-size', 3) self.widget("net-list").append_column(netCol) netListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) self.populate_networks(netListModel) #Edit->Connection Details->Storage def init_storage_state(self): self.widget("storage-pages").set_show_tabs(False) self.volmenu = gtk.Menu() volCopyPath = gtk.ImageMenuItem(_("Copy Volume Path")) volCopyImage = gtk.Image() volCopyImage.set_from_stock(gtk.STOCK_COPY, gtk.ICON_SIZE_MENU) volCopyPath.set_image(volCopyImage) volCopyPath.show() volCopyPath.connect("activate", self.copy_vol_path) self.volmenu.add(volCopyPath) volListModel = gtk.ListStore(str, str, str, str, str) self.widget("vol-list").set_model(volListModel) volCol = gtk.TreeViewColumn("Volumes") vol_txt1 = gtk.CellRendererText() volCol.pack_start(vol_txt1, True) volCol.add_attribute(vol_txt1, 'text', 1) volCol.set_sort_column_id(1) self.widget("vol-list").append_column(volCol) volSizeCol = gtk.TreeViewColumn("Size") vol_txt2 = gtk.CellRendererText() volSizeCol.pack_start(vol_txt2, False) volSizeCol.add_attribute(vol_txt2, 'text', 2) volSizeCol.set_sort_column_id(2) self.widget("vol-list").append_column(volSizeCol) volFormatCol = gtk.TreeViewColumn("Format") vol_txt3 = gtk.CellRendererText() volFormatCol.pack_start(vol_txt3, False) volFormatCol.add_attribute(vol_txt3, 'text', 3) volFormatCol.set_sort_column_id(3) self.widget("vol-list").append_column(volFormatCol) volUseCol = gtk.TreeViewColumn("Used By") vol_txt4 = gtk.CellRendererText() volUseCol.pack_start(vol_txt4, False) volUseCol.add_attribute(vol_txt4, 'text', 4) volUseCol.set_sort_column_id(4) self.widget("vol-list").append_column(volUseCol) volListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) init_pool_list(self.widget("pool-list"), self.pool_selected) populate_storage_pools(self.widget("pool-list"), self.conn) #Edit->Connection Details->Network Interfaces def init_interface_state(self): self.widget("interface-pages").set_show_tabs(False) # [ unique, label, icon name, icon size, is_active ] interfaceListModel = gtk.ListStore(str, str, str, int, bool) self.widget("interface-list").set_model(interfaceListModel) interfaceCol = gtk.TreeViewColumn("Interfaces") interfaceCol.set_spacing(6) interface_txt = gtk.CellRendererText() interface_img = gtk.CellRendererPixbuf() interfaceCol.pack_start(interface_img, False) interfaceCol.pack_start(interface_txt, True) interfaceCol.add_attribute(interface_txt, 'text', 1) interfaceCol.add_attribute(interface_txt, 'sensitive', 4) interfaceCol.add_attribute(interface_img, 'icon-name', 2) interfaceCol.add_attribute(interface_img, 'stock-size', 3) self.widget("interface-list").append_column(interfaceCol) interfaceListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) # Starmode combo uihelpers.build_startmode_combo(self.widget("interface-startmode")) # [ name, type ] childListModel = gtk.ListStore(str, str) childList = self.widget("interface-child-list") childList.set_model(childListModel) childNameCol = gtk.TreeViewColumn("Name") child_txt1 = gtk.CellRendererText() childNameCol.pack_start(child_txt1, True) childNameCol.add_attribute(child_txt1, 'text', 0) childNameCol.set_sort_column_id(0) childList.append_column(childNameCol) childTypeCol = gtk.TreeViewColumn("Interface Type") child_txt2 = gtk.CellRendererText() childTypeCol.pack_start(child_txt2, True) childTypeCol.add_attribute(child_txt2, 'text', 1) childTypeCol.set_sort_column_id(1) childList.append_column(childTypeCol) childListModel.set_sort_column_id(0, gtk.SORT_ASCENDING) self.populate_interfaces(interfaceListModel) #Edit->Connection Details def init_conn_state(self): #Basic details uri = self.conn.get_uri() host = self.conn.get_hostname() drv = self.conn.get_driver() memory = self.conn.pretty_host_memory_size() proc = self.conn.host_active_processor_count() arch = self.conn.host_architecture() auto = self.conn.get_autoconnect() self.widget("overview-uri").set_text(uri) self.widget("overview-hostname").set_text(host) self.widget("overview-hypervisor").set_text(drv) self.widget("overview-memory").set_text(memory) self.widget("overview-cpus").set_text(str(proc)) self.widget("overview-arch").set_text(arch) self.widget("config-autoconnect").set_active(auto) #Performance self.cpu_usage_graph = Sparkline() self.cpu_usage_graph.show() self.widget("performance-table").attach(self.cpu_usage_graph, 1, 2, 0, 1) self.memory_usage_graph = Sparkline() self.memory_usage_graph.show() self.widget("performance-table").attach(self.memory_usage_graph, 1, 2, 1, 2) def show(self): logging.debug("Showing host details: %s", self.conn) vis = self.is_visible() self.topwin.present() if vis: return self.emit("host-opened") def is_visible(self): return bool(self.topwin.flags() & gtk.VISIBLE) def close(self, ignore1=None, ignore2=None): logging.debug("Closing host details: %s", self.conn) if not self.is_visible(): return self.topwin.hide() self.emit("host-closed") return 1 def _cleanup(self): self.conn = None if self.addnet: self.addnet.cleanup() self.addnet = None if self.addpool: self.addpool.cleanup() self.addpool = None if self.addvol: self.addvol.cleanup() self.addvol = None if self.addinterface: self.addinterface.cleanup() self.addinterface = None self.volmenu.destroy() self.volmenu = None self.cpu_usage_graph.destroy() self.cpu_usage_graph = None self.memory_usage_graph.destroy() self.memory_usage_graph = None def show_help(self, src_ignore): self.emit("action-show-help", "virt-manager-host-window") def view_manager(self, src_ignore): self.emit("action-view-manager") def restore_domain(self, src_ignore): self.emit("action-restore-domain", self.conn.get_uri()) def exit_app(self, src_ignore): self.emit("action-exit-app") def reset_state(self): self.refresh_resources() self.conn_state_changed() # Update autostart value auto = self.conn.get_autoconnect() self.widget("config-autoconnect").set_active(auto) def refresh_resources(self, ignore=None): vm_memory = self.conn.pretty_stats_memory() host_memory = self.conn.pretty_host_memory_size() cpu_vector = self.conn.host_cpu_time_vector() memory_vector = self.conn.stats_memory_vector() cpu_vector.reverse() memory_vector.reverse() self.widget("performance-cpu").set_text("%d %%" % self.conn.host_cpu_time_percentage()) self.widget("performance-memory").set_text( _("%(currentmem)s of %(maxmem)s") % {'currentmem': vm_memory, 'maxmem': host_memory}) self.cpu_usage_graph.set_property("data_array", cpu_vector) self.memory_usage_graph.set_property("data_array", memory_vector) def conn_state_changed(self, ignore1=None): state = (self.conn.get_state() == vmmConnection.STATE_ACTIVE) self.widget("menu_file_restore_saved").set_sensitive(state) self.widget("net-add").set_sensitive(state) self.widget("pool-add").set_sensitive(state) # Set error pages if not state: self.set_net_error_page(_("Connection not active.")) self.set_storage_error_page(_("Connection not active.")) self.set_interface_error_page(_("Connection not active.")) return if not self.conn.network_capable: self.set_net_error_page( _("Libvirt connection does not support virtual network " "management.")) if not self.conn.is_storage_capable(): self.set_storage_error_page( _("Libvirt connection does not support storage management.")) if not self.conn.interface_capable: self.set_interface_error_page( _("Libvirt connection does not support interface management.")) def toggle_autoconnect(self, src): self.conn.set_autoconnect(src.get_active()) # ------------------------- # Virtual Network functions # ------------------------- def delete_network(self, src_ignore): net = self.current_network() if net is None: return result = self.err.yes_no(_("Are you sure you want to permanently " "delete the network %s?") % net.get_name()) if not result: return logging.debug("Deleting network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow(net.delete, [], self, _("Error deleting network '%s'") % net.get_name()) def start_network(self, src_ignore): net = self.current_network() if net is None: return logging.debug("Starting network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow(net.start, [], self, _("Error starting network '%s'") % net.get_name()) def stop_network(self, src_ignore): net = self.current_network() if net is None: return logging.debug("Stopping network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow(net.stop, [], self, _("Error stopping network '%s'") % net.get_name()) def add_network(self, src_ignore): logging.debug("Launching 'Add Network'") try: if self.addnet is None: self.addnet = vmmCreateNetwork(self.conn) self.addnet.show(self.topwin) except Exception, e: self.err.show_err(_("Error launching network wizard: %s") % str(e))
class vmmHost(vmmGObjectUI): def __init__(self, conn): vmmGObjectUI.__init__(self, "vmm-host.ui", "vmm-host") self.conn = conn self.title = conn.get_short_hostname() + " " + self.topwin.get_title() self.topwin.set_title(self.title) self.ICON_RUNNING = "state_running" self.ICON_SHUTOFF = "state_shutoff" self.addnet = None self.addpool = None self.addvol = None self.addinterface = None self.volmenu = None self._in_refresh = False self.cpu_usage_graph = None self.memory_usage_graph = None self.init_conn_state() # Set up signals self.widget("net-list").get_selection().connect( "changed", self.net_selected) self.widget("vol-list").get_selection().connect( "changed", self.vol_selected) self.widget("interface-list").get_selection().connect( "changed", self.interface_selected) self.init_net_state() self.init_storage_state() self.init_interface_state() self.conn.connect("net-added", self.repopulate_networks) self.conn.connect("net-removed", self.repopulate_networks) self.conn.connect("net-started", self.refresh_network) self.conn.connect("net-stopped", self.refresh_network) self.conn.connect("pool-added", self.repopulate_storage_pools) self.conn.connect("pool-removed", self.repopulate_storage_pools) self.conn.connect("pool-started", self.refresh_storage_pool) self.conn.connect("pool-stopped", self.refresh_storage_pool) self.conn.connect("interface-added", self.repopulate_interfaces) self.conn.connect("interface-removed", self.repopulate_interfaces) self.conn.connect("interface-started", self.refresh_interface) self.conn.connect("interface-stopped", self.refresh_interface) self.conn.connect("state-changed", self.conn_state_changed) self.window.connect_signals({ "on_menu_file_view_manager_activate": self.view_manager, "on_menu_file_quit_activate": self.exit_app, "on_menu_file_close_activate": self.close, "on_vmm_host_delete_event": self.close, "on_menu_restore_saved_activate": self.restore_domain, "on_menu_help_contents_activate": self.show_help, "on_net_add_clicked": self.add_network, "on_net_delete_clicked": self.delete_network, "on_net_stop_clicked": self.stop_network, "on_net_start_clicked": self.start_network, "on_net_autostart_toggled": self.net_autostart_changed, "on_net_apply_clicked": self.net_apply, "on_pool_add_clicked": self.add_pool, "on_vol_add_clicked": self.add_vol, "on_pool_stop_clicked": self.stop_pool, "on_pool_start_clicked": self.start_pool, "on_pool_delete_clicked": self.delete_pool, "on_pool_refresh_clicked": self.pool_refresh, "on_pool_autostart_toggled": self.pool_autostart_changed, "on_vol_delete_clicked": self.delete_vol, "on_vol_list_button_press_event": self.popup_vol_menu, "on_pool_apply_clicked": self.pool_apply, "on_interface_add_clicked": self.add_interface, "on_interface_start_clicked": self.start_interface, "on_interface_stop_clicked": self.stop_interface, "on_interface_delete_clicked": self.delete_interface, "on_interface_startmode_changed": self.interface_startmode_changed, "on_interface_apply_clicked": self.interface_apply, "on_config_autoconnect_toggled": self.toggle_autoconnect, }) # XXX: Help docs useless/out of date self.widget("help_menuitem").hide() finish_img = gtk.image_new_from_stock(gtk.STOCK_DELETE, gtk.ICON_SIZE_BUTTON) self.widget("vol-delete").set_image(finish_img) finish_img = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_BUTTON) self.widget("vol-add").set_image(finish_img) self.conn.connect("resources-sampled", self.refresh_resources) self.reset_state() def init_net_state(self): self.widget("network-pages").set_show_tabs(False) # [ unique, label, icon name, icon size, is_active ] netListModel = gtk.ListStore(str, str, str, int, bool) self.widget("net-list").set_model(netListModel) netCol = gtk.TreeViewColumn("Networks") netCol.set_spacing(6) net_txt = gtk.CellRendererText() net_img = gtk.CellRendererPixbuf() netCol.pack_start(net_img, False) netCol.pack_start(net_txt, True) netCol.add_attribute(net_txt, 'text', 1) netCol.add_attribute(net_txt, 'sensitive', 4) netCol.add_attribute(net_img, 'icon-name', 2) netCol.add_attribute(net_img, 'stock-size', 3) self.widget("net-list").append_column(netCol) netListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) self.populate_networks(netListModel) #Edit->Connection Details->Storage def init_storage_state(self): self.widget("storage-pages").set_show_tabs(False) self.volmenu = gtk.Menu() volCopyPath = gtk.ImageMenuItem(_("Copy Volume Path")) volCopyImage = gtk.Image() volCopyImage.set_from_stock(gtk.STOCK_COPY, gtk.ICON_SIZE_MENU) volCopyPath.set_image(volCopyImage) volCopyPath.show() volCopyPath.connect("activate", self.copy_vol_path) self.volmenu.add(volCopyPath) volListModel = gtk.ListStore(str, str, str, str, str) self.widget("vol-list").set_model(volListModel) volCol = gtk.TreeViewColumn("Volumes") vol_txt1 = gtk.CellRendererText() volCol.pack_start(vol_txt1, True) volCol.add_attribute(vol_txt1, 'text', 1) volCol.set_sort_column_id(1) self.widget("vol-list").append_column(volCol) volSizeCol = gtk.TreeViewColumn("Size") vol_txt2 = gtk.CellRendererText() volSizeCol.pack_start(vol_txt2, False) volSizeCol.add_attribute(vol_txt2, 'text', 2) volSizeCol.set_sort_column_id(2) self.widget("vol-list").append_column(volSizeCol) volFormatCol = gtk.TreeViewColumn("Format") vol_txt3 = gtk.CellRendererText() volFormatCol.pack_start(vol_txt3, False) volFormatCol.add_attribute(vol_txt3, 'text', 3) volFormatCol.set_sort_column_id(3) self.widget("vol-list").append_column(volFormatCol) volUseCol = gtk.TreeViewColumn("Used By") vol_txt4 = gtk.CellRendererText() volUseCol.pack_start(vol_txt4, False) volUseCol.add_attribute(vol_txt4, 'text', 4) volUseCol.set_sort_column_id(4) self.widget("vol-list").append_column(volUseCol) volListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) init_pool_list(self.widget("pool-list"), self.pool_selected) populate_storage_pools(self.widget("pool-list"), self.conn) #Edit->Connection Details->Network Interfaces def init_interface_state(self): self.widget("interface-pages").set_show_tabs(False) # [ unique, label, icon name, icon size, is_active ] interfaceListModel = gtk.ListStore(str, str, str, int, bool) self.widget("interface-list").set_model(interfaceListModel) interfaceCol = gtk.TreeViewColumn("Interfaces") interfaceCol.set_spacing(6) interface_txt = gtk.CellRendererText() interface_img = gtk.CellRendererPixbuf() interfaceCol.pack_start(interface_img, False) interfaceCol.pack_start(interface_txt, True) interfaceCol.add_attribute(interface_txt, 'text', 1) interfaceCol.add_attribute(interface_txt, 'sensitive', 4) interfaceCol.add_attribute(interface_img, 'icon-name', 2) interfaceCol.add_attribute(interface_img, 'stock-size', 3) self.widget("interface-list").append_column(interfaceCol) interfaceListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) # Starmode combo uihelpers.build_startmode_combo(self.widget("interface-startmode")) # [ name, type ] childListModel = gtk.ListStore(str, str) childList = self.widget("interface-child-list") childList.set_model(childListModel) childNameCol = gtk.TreeViewColumn("Name") child_txt1 = gtk.CellRendererText() childNameCol.pack_start(child_txt1, True) childNameCol.add_attribute(child_txt1, 'text', 0) childNameCol.set_sort_column_id(0) childList.append_column(childNameCol) childTypeCol = gtk.TreeViewColumn("Interface Type") child_txt2 = gtk.CellRendererText() childTypeCol.pack_start(child_txt2, True) childTypeCol.add_attribute(child_txt2, 'text', 1) childTypeCol.set_sort_column_id(1) childList.append_column(childTypeCol) childListModel.set_sort_column_id(0, gtk.SORT_ASCENDING) self.populate_interfaces(interfaceListModel) #Edit->Connection Details def init_conn_state(self): #Basic details uri = self.conn.get_uri() host = self.conn.get_hostname() drv = self.conn.get_driver() memory = self.conn.pretty_host_memory_size() proc = self.conn.host_active_processor_count() arch = self.conn.host_architecture() auto = self.conn.get_autoconnect() self.widget("overview-uri").set_text(uri) self.widget("overview-hostname").set_text(host) self.widget("overview-hypervisor").set_text(drv) self.widget("overview-memory").set_text(memory) self.widget("overview-cpus").set_text(str(proc)) self.widget("overview-arch").set_text(arch) self.widget("config-autoconnect").set_active(auto) #Performance self.cpu_usage_graph = Sparkline() self.cpu_usage_graph.show() self.widget("performance-table").attach(self.cpu_usage_graph, 1, 2, 0, 1) self.memory_usage_graph = Sparkline() self.memory_usage_graph.show() self.widget("performance-table").attach(self.memory_usage_graph, 1, 2, 1, 2) def show(self): logging.debug("Showing host details: %s", self.conn) vis = self.is_visible() self.topwin.present() if vis: return self.emit("host-opened") def is_visible(self): return bool(self.topwin.flags() & gtk.VISIBLE) def close(self, ignore1=None, ignore2=None): logging.debug("Closing host details: %s", self.conn) if not self.is_visible(): return self.topwin.hide() self.emit("host-closed") return 1 def _cleanup(self): self.conn = None if self.addnet: self.addnet.cleanup() self.addnet = None if self.addpool: self.addpool.cleanup() self.addpool = None if self.addvol: self.addvol.cleanup() self.addvol = None if self.addinterface: self.addinterface.cleanup() self.addinterface = None self.volmenu.destroy() self.volmenu = None self.cpu_usage_graph.destroy() self.cpu_usage_graph = None self.memory_usage_graph.destroy() self.memory_usage_graph = None def show_help(self, src_ignore): self.emit("action-show-help", "virt-manager-host-window") def view_manager(self, src_ignore): self.emit("action-view-manager") def restore_domain(self, src_ignore): self.emit("action-restore-domain", self.conn.get_uri()) def exit_app(self, src_ignore): self.emit("action-exit-app") def reset_state(self): self.refresh_resources() self.conn_state_changed() # Update autostart value auto = self.conn.get_autoconnect() self.widget("config-autoconnect").set_active(auto) def refresh_resources(self, ignore=None): vm_memory = self.conn.pretty_stats_memory() host_memory = self.conn.pretty_host_memory_size() cpu_vector = self.conn.host_cpu_time_vector() memory_vector = self.conn.stats_memory_vector() cpu_vector.reverse() memory_vector.reverse() self.widget("performance-cpu").set_text( "%d %%" % self.conn.host_cpu_time_percentage()) self.widget("performance-memory").set_text( _("%(currentmem)s of %(maxmem)s") % { 'currentmem': vm_memory, 'maxmem': host_memory }) self.cpu_usage_graph.set_property("data_array", cpu_vector) self.memory_usage_graph.set_property("data_array", memory_vector) def conn_state_changed(self, ignore1=None): state = (self.conn.get_state() == vmmConnection.STATE_ACTIVE) self.widget("menu_file_restore_saved").set_sensitive(state) self.widget("net-add").set_sensitive(state) self.widget("pool-add").set_sensitive(state) # Set error pages if not state: self.set_net_error_page(_("Connection not active.")) self.set_storage_error_page(_("Connection not active.")) self.set_interface_error_page(_("Connection not active.")) return if not self.conn.network_capable: self.set_net_error_page( _("Libvirt connection does not support virtual network " "management.")) if not self.conn.is_storage_capable(): self.set_storage_error_page( _("Libvirt connection does not support storage management.")) if not self.conn.interface_capable: self.set_interface_error_page( _("Libvirt connection does not support interface management.")) def toggle_autoconnect(self, src): self.conn.set_autoconnect(src.get_active()) # ------------------------- # Virtual Network functions # ------------------------- def delete_network(self, src_ignore): net = self.current_network() if net is None: return result = self.err.yes_no( _("Are you sure you want to permanently " "delete the network %s?") % net.get_name()) if not result: return logging.debug("Deleting network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow( net.delete, [], self, _("Error deleting network '%s'") % net.get_name()) def start_network(self, src_ignore): net = self.current_network() if net is None: return logging.debug("Starting network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow( net.start, [], self, _("Error starting network '%s'") % net.get_name()) def stop_network(self, src_ignore): net = self.current_network() if net is None: return logging.debug("Stopping network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow( net.stop, [], self, _("Error stopping network '%s'") % net.get_name()) def add_network(self, src_ignore): logging.debug("Launching 'Add Network'") try: if self.addnet is None: self.addnet = vmmCreateNetwork(self.conn) self.addnet.show(self.topwin) except Exception, e: self.err.show_err(_("Error launching network wizard: %s") % str(e))
class vmmHost(vmmGObjectUI): __gsignals__ = { "action-exit-app": (GObject.SignalFlags.RUN_FIRST, None, []), "action-view-manager": (GObject.SignalFlags.RUN_FIRST, None, []), "action-restore-domain": (GObject.SignalFlags.RUN_FIRST, None, [str]), "host-closed": (GObject.SignalFlags.RUN_FIRST, None, []), "host-opened": (GObject.SignalFlags.RUN_FIRST, None, []), } def __init__(self, conn): vmmGObjectUI.__init__(self, "host.ui", "vmm-host") self.conn = conn self.title = conn.get_short_hostname() + " " + self.topwin.get_title() self.topwin.set_title(self.title) self.ICON_RUNNING = "state_running" self.ICON_SHUTOFF = "state_shutoff" self.addnet = None self.addpool = None self.addvol = None self.addinterface = None self.volmenu = None self._in_refresh = False self.active_edits = [] self.cpu_usage_graph = None self.memory_usage_graph = None self.init_conn_state() self.init_net_state() self.init_storage_state() self.init_interface_state() self.builder.connect_signals({ "on_menu_file_view_manager_activate" : self.view_manager, "on_menu_file_quit_activate" : self.exit_app, "on_menu_file_close_activate": self.close, "on_vmm_host_delete_event": self.close, "on_host_page_switch": self.page_changed, "on_menu_restore_saved_activate": self.restore_domain, "on_net_add_clicked": self.add_network, "on_net_delete_clicked": self.delete_network, "on_net_stop_clicked": self.stop_network, "on_net_start_clicked": self.start_network, "on_net_apply_clicked": self.net_apply, "on_net_list_changed": self.net_selected, "on_net_autostart_toggled": self.net_autostart_changed, "on_net_name_changed": (lambda *x: self.enable_net_apply(x, EDIT_NET_NAME)), "on_pool_add_clicked" : self.add_pool, "on_vol_add_clicked" : self.add_vol, "on_pool_stop_clicked": self.stop_pool, "on_pool_start_clicked": self.start_pool, "on_pool_delete_clicked": self.delete_pool, "on_pool_refresh_clicked": self.pool_refresh, "on_pool_autostart_toggled": self.pool_autostart_changed, "on_vol_delete_clicked": self.delete_vol, "on_vol_list_button_press_event": self.popup_vol_menu, "on_pool_apply_clicked": self.pool_apply, "on_vol_list_changed": self.vol_selected, "on_pool_name_changed": (lambda *x: self.enable_pool_apply(x, EDIT_POOL_NAME)), "on_interface_add_clicked" : self.add_interface, "on_interface_start_clicked" : self.start_interface, "on_interface_stop_clicked" : self.stop_interface, "on_interface_delete_clicked" : self.delete_interface, "on_interface_startmode_changed": self.interface_startmode_changed, "on_interface_apply_clicked" : self.interface_apply, "on_interface_list_changed": self.interface_selected, "on_config_autoconnect_toggled": self.toggle_autoconnect, }) self.repopulate_networks() self.repopulate_storage_pools() self.repopulate_interfaces() self.conn.connect("net-added", self.repopulate_networks) self.conn.connect("net-removed", self.repopulate_networks) self.conn.connect("net-started", self.refresh_network) self.conn.connect("net-stopped", self.refresh_network) self.conn.connect("pool-added", self.repopulate_storage_pools) self.conn.connect("pool-removed", self.repopulate_storage_pools) self.conn.connect("pool-started", self.refresh_storage_pool) self.conn.connect("pool-stopped", self.refresh_storage_pool) self.conn.connect("interface-added", self.repopulate_interfaces) self.conn.connect("interface-removed", self.repopulate_interfaces) self.conn.connect("interface-started", self.refresh_interface) self.conn.connect("interface-stopped", self.refresh_interface) self.conn.connect("state-changed", self.conn_state_changed) self.conn.connect("resources-sampled", self.refresh_resources) self.reset_state() def init_net_state(self): self.widget("network-pages").set_show_tabs(False) # [ unique, label, icon name, icon size, is_active ] netListModel = Gtk.ListStore(str, str, str, int, bool) self.widget("net-list").set_model(netListModel) netCol = Gtk.TreeViewColumn("Networks") netCol.set_spacing(6) net_txt = Gtk.CellRendererText() net_img = Gtk.CellRendererPixbuf() netCol.pack_start(net_img, False) netCol.pack_start(net_txt, True) netCol.add_attribute(net_txt, 'text', 1) netCol.add_attribute(net_txt, 'sensitive', 4) netCol.add_attribute(net_img, 'icon-name', 2) netCol.add_attribute(net_img, 'stock-size', 3) self.widget("net-list").append_column(netCol) netListModel.set_sort_column_id(1, Gtk.SortType.ASCENDING) def init_storage_state(self): self.widget("storage-pages").set_show_tabs(False) self.volmenu = Gtk.Menu() volCopyPath = Gtk.ImageMenuItem(_("Copy Volume Path")) volCopyImage = Gtk.Image() volCopyImage.set_from_stock(Gtk.STOCK_COPY, Gtk.IconSize.MENU) volCopyPath.set_image(volCopyImage) volCopyPath.show() volCopyPath.connect("activate", self.copy_vol_path) self.volmenu.add(volCopyPath) volListModel = Gtk.ListStore(str, str, str, str, str) self.widget("vol-list").set_model(volListModel) volCol = Gtk.TreeViewColumn("Volumes") vol_txt1 = Gtk.CellRendererText() volCol.pack_start(vol_txt1, True) volCol.add_attribute(vol_txt1, 'text', 1) volCol.set_sort_column_id(1) self.widget("vol-list").append_column(volCol) volSizeCol = Gtk.TreeViewColumn("Size") vol_txt2 = Gtk.CellRendererText() volSizeCol.pack_start(vol_txt2, False) volSizeCol.add_attribute(vol_txt2, 'text', 2) volSizeCol.set_sort_column_id(2) self.widget("vol-list").append_column(volSizeCol) volFormatCol = Gtk.TreeViewColumn("Format") vol_txt3 = Gtk.CellRendererText() volFormatCol.pack_start(vol_txt3, False) volFormatCol.add_attribute(vol_txt3, 'text', 3) volFormatCol.set_sort_column_id(3) self.widget("vol-list").append_column(volFormatCol) volUseCol = Gtk.TreeViewColumn("Used By") vol_txt4 = Gtk.CellRendererText() volUseCol.pack_start(vol_txt4, False) volUseCol.add_attribute(vol_txt4, 'text', 4) volUseCol.set_sort_column_id(4) self.widget("vol-list").append_column(volUseCol) volListModel.set_sort_column_id(1, Gtk.SortType.ASCENDING) init_pool_list(self.widget("pool-list"), self.pool_selected) def init_interface_state(self): self.widget("interface-pages").set_show_tabs(False) # [ unique, label, icon name, icon size, is_active ] interfaceListModel = Gtk.ListStore(str, str, str, int, bool) self.widget("interface-list").set_model(interfaceListModel) interfaceCol = Gtk.TreeViewColumn("Interfaces") interfaceCol.set_spacing(6) interface_txt = Gtk.CellRendererText() interface_img = Gtk.CellRendererPixbuf() interfaceCol.pack_start(interface_img, False) interfaceCol.pack_start(interface_txt, True) interfaceCol.add_attribute(interface_txt, 'text', 1) interfaceCol.add_attribute(interface_txt, 'sensitive', 4) interfaceCol.add_attribute(interface_img, 'icon-name', 2) interfaceCol.add_attribute(interface_img, 'stock-size', 3) self.widget("interface-list").append_column(interfaceCol) interfaceListModel.set_sort_column_id(1, Gtk.SortType.ASCENDING) # Starmode combo vmmCreateInterface.build_interface_startmode_combo( self.widget("interface-startmode")) # [ name, type ] childListModel = Gtk.ListStore(str, str) childList = self.widget("interface-child-list") childList.set_model(childListModel) childNameCol = Gtk.TreeViewColumn("Name") child_txt1 = Gtk.CellRendererText() childNameCol.pack_start(child_txt1, True) childNameCol.add_attribute(child_txt1, 'text', 0) childNameCol.set_sort_column_id(0) childList.append_column(childNameCol) childTypeCol = Gtk.TreeViewColumn("Interface Type") child_txt2 = Gtk.CellRendererText() childTypeCol.pack_start(child_txt2, True) childTypeCol.add_attribute(child_txt2, 'text', 1) childTypeCol.set_sort_column_id(1) childList.append_column(childTypeCol) childListModel.set_sort_column_id(0, Gtk.SortType.ASCENDING) def init_conn_state(self): uri = self.conn.get_uri() host = self.conn.get_hostname() drv = self.conn.get_driver() memory = self.conn.pretty_host_memory_size() proc = self.conn.host_active_processor_count() arch = self.conn.host_architecture() auto = self.conn.get_autoconnect() self.widget("overview-uri").set_text(uri) self.widget("overview-hostname").set_text(host) self.widget("overview-hypervisor").set_text(drv) self.widget("overview-memory").set_text(memory) self.widget("overview-cpus").set_text(str(proc)) self.widget("overview-arch").set_text(arch) self.widget("config-autoconnect").set_active(auto) self.cpu_usage_graph = Sparkline() self.cpu_usage_graph.show() self.widget("performance-cpu-align").add(self.cpu_usage_graph) self.memory_usage_graph = Sparkline() self.memory_usage_graph.show() self.widget("performance-memory-align").add(self.memory_usage_graph) def show(self): logging.debug("Showing host details: %s", self.conn) vis = self.is_visible() self.topwin.present() if vis: return self.emit("host-opened") def is_visible(self): return self.topwin.get_visible() def close(self, ignore1=None, ignore2=None): logging.debug("Closing host details: %s", self.conn) if not self.is_visible(): return self.topwin.hide() self.emit("host-closed") return 1 def _cleanup(self): self.conn = None if self.addnet: self.addnet.cleanup() self.addnet = None if self.addpool: self.addpool.cleanup() self.addpool = None if self.addvol: self.addvol.cleanup() self.addvol = None if self.addinterface: self.addinterface.cleanup() self.addinterface = None self.volmenu.destroy() self.volmenu = None self.cpu_usage_graph.destroy() self.cpu_usage_graph = None self.memory_usage_graph.destroy() self.memory_usage_graph = None def view_manager(self, src_ignore): self.emit("action-view-manager") def restore_domain(self, src_ignore): self.emit("action-restore-domain", self.conn.get_uri()) def exit_app(self, src_ignore): self.emit("action-exit-app") def reset_state(self): self.refresh_resources() self.conn_state_changed() # Update autostart value auto = self.conn.get_autoconnect() self.widget("config-autoconnect").set_active(auto) def page_changed(self, src, child, pagenum): ignore = src ignore = child if pagenum == 1: self.conn.schedule_priority_tick(pollnet=True) elif pagenum == 2: self.conn.schedule_priority_tick(pollpool=True) elif pagenum == 3: self.conn.schedule_priority_tick(polliface=True) def refresh_resources(self, ignore=None): vm_memory = self.conn.pretty_stats_memory() host_memory = self.conn.pretty_host_memory_size() cpu_vector = self.conn.host_cpu_time_vector() memory_vector = self.conn.stats_memory_vector() cpu_vector.reverse() memory_vector.reverse() self.widget("performance-cpu").set_text("%d %%" % self.conn.host_cpu_time_percentage()) self.widget("performance-memory").set_text( _("%(currentmem)s of %(maxmem)s") % {'currentmem': vm_memory, 'maxmem': host_memory}) self.cpu_usage_graph.set_property("data_array", cpu_vector) self.memory_usage_graph.set_property("data_array", memory_vector) def conn_state_changed(self, ignore1=None): conn_active = (self.conn.get_state() == vmmConnection.STATE_ACTIVE) self.widget("menu_file_restore_saved").set_sensitive(conn_active) self.widget("net-add").set_sensitive(conn_active and self.conn.is_network_capable()) self.widget("pool-add").set_sensitive(conn_active and self.conn.is_storage_capable()) self.widget("interface-add").set_sensitive(conn_active and self.conn.is_interface_capable()) if not conn_active: self.set_net_error_page(_("Connection not active.")) self.set_storage_error_page(_("Connection not active.")) self.set_interface_error_page(_("Connection not active.")) self.repopulate_networks() self.repopulate_storage_pools() self.repopulate_interfaces() return if not self.conn.is_network_capable(): self.set_net_error_page( _("Libvirt connection does not support virtual network " "management.")) if not self.conn.is_storage_capable(): self.set_storage_error_page( _("Libvirt connection does not support storage management.")) if not self.conn.is_interface_capable(): self.set_interface_error_page( _("Libvirt connection does not support interface management.")) def toggle_autoconnect(self, src): self.conn.set_autoconnect(src.get_active()) # ------------------------- # Virtual Network functions # ------------------------- def delete_network(self, src_ignore): net = self.current_network() if net is None: return result = self.err.yes_no(_("Are you sure you want to permanently " "delete the network %s?") % net.get_name()) if not result: return logging.debug("Deleting network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow(net.delete, [], self, _("Error deleting network '%s'") % net.get_name()) def start_network(self, src_ignore): net = self.current_network() if net is None: return logging.debug("Starting network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow(net.start, [], self, _("Error starting network '%s'") % net.get_name()) def stop_network(self, src_ignore): net = self.current_network() if net is None: return logging.debug("Stopping network '%s'", net.get_name()) vmmAsyncJob.simple_async_noshow(net.stop, [], self, _("Error stopping network '%s'") % net.get_name()) def add_network(self, src_ignore): logging.debug("Launching 'Add Network'") try: if self.addnet is None: self.addnet = vmmCreateNetwork(self.conn) self.addnet.show(self.topwin) except Exception, e: self.err.show_err(_("Error launching network wizard: %s") % str(e))