diff --git a/src/virtManager/host.py b/src/virtManager/host.py index daa6e330a..7e3d08660 100644 --- a/src/virtManager/host.py +++ b/src/virtManager/host.py @@ -64,11 +64,6 @@ class vmmHost(gobject.GObject): netListModel = gtk.ListStore(str, str, str) self.window.get_widget("net-list").set_model(netListModel) - self.populate_networks(netListModel) - - poolListModel = gtk.ListStore(str, str, float) - self.window.get_widget("pool-list").set_model(poolListModel) - self.populate_storage_pools(poolListModel) volListModel = gtk.ListStore(str, str, str, str, str) self.window.get_widget("vol-list").set_model(volListModel) @@ -83,7 +78,6 @@ class vmmHost(gobject.GObject): self.volmenu.add(volCopyPath) self.window.get_widget("net-list").get_selection().connect("changed", self.net_selected) - self.window.get_widget("pool-list").get_selection().connect("changed", self.pool_selected) self.window.get_widget("vol-list").get_selection().connect("changed", self.vol_selected) netCol = gtk.TreeViewColumn("Networks") @@ -96,16 +90,6 @@ class vmmHost(gobject.GObject): self.window.get_widget("net-list").append_column(netCol) netListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) - poolCol = gtk.TreeViewColumn("Pools") - pool_txt = gtk.CellRendererText() - pool_prg = gtk.CellRendererProgress() - poolCol.pack_start(pool_txt, True) - poolCol.pack_start(pool_prg, False) - poolCol.add_attribute(pool_txt, 'text', 1) - poolCol.add_attribute(pool_prg, 'value', 2) - self.window.get_widget("pool-list").append_column(poolCol) - poolListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) - volCol = gtk.TreeViewColumn("Volumes") vol_txt1 = gtk.CellRendererText() volCol.pack_start(vol_txt1, True) @@ -137,6 +121,13 @@ class vmmHost(gobject.GObject): volListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.populate_networks(netListModel) + init_pool_list(self.window.get_widget("pool-list"), + self.pool_selected) + populate_storage_pools(self.window.get_widget("pool-list"), + self.conn) + + self.cpu_usage_graph = sparkline.Sparkline() self.cpu_usage_graph.show() self.window.get_widget("performance-table").attach(self.cpu_usage_graph, 1, 2, 0, 1) @@ -186,6 +177,7 @@ class vmmHost(gobject.GObject): self.conn.connect("resources-sampled", self.refresh_resources) self.reset_state() + def show(self): # Update autostart value self.window.get_widget("config-autoconnect").set_active(self.conn.get_autoconnect()) @@ -211,8 +203,6 @@ class vmmHost(gobject.GObject): def reset_state(self): self.refresh_resources() - self.reset_pool_state() - self.reset_net_state() self.conn_state_changed() def refresh_resources(self, ignore=None): @@ -326,6 +316,7 @@ class vmmHost(gobject.GObject): selected[0].get_value(selected[1], 0) == None: self.reset_net_state() return + net = self.conn.get_net(selected[0].get_value(selected[1], 0)) active = net.is_active() @@ -397,11 +388,17 @@ class vmmHost(gobject.GObject): self.populate_networks(self.window.get_widget("net-list").get_model()) def populate_networks(self, model): + net_list = self.window.get_widget("net-list") model.clear() for uuid in self.conn.list_net_uuids(): net = self.conn.get_net(uuid) model.append([uuid, net.get_name(), gtk.STOCK_NETWORK]) + _iter = model.get_iter_first() + if _iter: + net_list.get_selection().select_iter(_iter) + net_list.get_selection().emit("changed") + # ------------------------------ # Storage Manager methods @@ -567,19 +564,15 @@ class vmmHost(gobject.GObject): self.window.get_widget("vol-delete").set_sensitive(False) def refresh_storage_pool(self, src, uri, uuid): - sel = self.window.get_widget("pool-list").get_selection() - model = self.window.get_widget("pool-list").get_model() - active = sel.get_selected() - if active[1] == None: + refresh_pool_in_list(self.window.get_widget("pool-list"), + self.conn, uuid) + curpool = self.current_pool() + if curpool.uuid != uuid: return - curruuid = active[0].get_value(active[1], 0) - if curruuid != uuid: - return - self.pool_selected(sel) - for row in model: - if row[0] == curruuid: - row[2] = self.get_pool_size_percent(uuid) - break + + # Currently selected pool changed state: force a 'pool_selected' to + # update vol list + self.pool_selected(self.window.get_widget("pool-list").get_selection()) def reset_pool_state(self): self.window.get_widget("pool-details").set_sensitive(False) @@ -627,24 +620,8 @@ class vmmHost(gobject.GObject): def repopulate_storage_pools(self, src, uri, uuid): - self.populate_storage_pools(self.window.get_widget("pool-list").get_model()) - - def get_pool_size_percent(self, uuid): - pool = self.conn.get_pool(uuid) - cap = pool.get_capacity() - alloc = pool.get_allocation() - if not cap or alloc is None: - per = 0 - else: - per = int(((float(alloc) / float(cap)) * 100)) - return per - - def populate_storage_pools(self, model): - model.clear() - for uuid in self.conn.list_pool_uuids(): - per = self.get_pool_size_percent(uuid) - pool = self.conn.get_pool(uuid) - model.append([uuid, pool.get_name(), per]) + pool_list = self.window.get_widget("pool-list") + populate_storage_pools(pool_list, self.conn) def populate_storage_volumes(self): pool = self.current_pool() @@ -656,4 +633,61 @@ class vmmHost(gobject.GObject): model.append([key, vol.get_name(), vol.get_pretty_capacity(), vol.get_format() or "", vol.get_target_path() or ""]) + +# These functions are broken out, since they are used by storage browser +# dialog. + +def init_pool_list(pool_list, changed_func): + poolListModel = gtk.ListStore(str, str, bool, str) + pool_list.set_model(poolListModel) + + pool_list.get_selection().connect("changed", changed_func) + + poolCol = gtk.TreeViewColumn("Storage Pools") + pool_txt = gtk.CellRendererText() + pool_per = gtk.CellRendererText() + poolCol.pack_start(pool_per, False) + poolCol.pack_start(pool_txt, True) + poolCol.add_attribute(pool_txt, 'markup', 1) + poolCol.add_attribute(pool_txt, 'sensitive', 2) + poolCol.add_attribute(pool_per, 'markup', 3) + pool_list.append_column(poolCol) + poolListModel.set_sort_column_id(1, gtk.SORT_ASCENDING) + +def refresh_pool_in_list(pool_list, conn, uuid): + for row in pool_list.get_model(): + if row[0] == uuid: + # Update active sensitivity and percent available for passed uuid + row[3] = get_pool_size_percent(conn, uuid) + row[2] = conn.get_pool(uuid).is_active() + return + +def populate_storage_pools(pool_list, conn): + model = pool_list.get_model() + model.clear() + for uuid in conn.list_pool_uuids(): + per = get_pool_size_percent(conn, uuid) + pool = conn.get_pool(uuid) + + name = pool.get_name() + typ = Storage.StoragePool.get_pool_type_desc(pool.get_type()) + label = "%s\n%s" % (name, typ) + + model.append([uuid, label, pool.is_active(), per]) + + _iter = model.get_iter_first() + if _iter: + pool_list.get_selection().select_iter(_iter) + pool_list.get_selection().emit("changed") + +def get_pool_size_percent(conn, uuid): + pool = conn.get_pool(uuid) + cap = pool.get_capacity() + alloc = pool.get_allocation() + if not cap or alloc is None: + per = 0 + else: + per = int(((float(alloc) / float(cap)) * 100)) + return "%s%%" % int(per) + gobject.type_register(vmmHost)