- bnc#821214 - virt-manager has a big memory leak.
virtman-memleak-disable-graph.patch virtman-memleak-callbacks.patch virtman-graph-row-spacing.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/virt-manager?expand=0&rev=127
This commit is contained in:
parent
b485c9c53e
commit
7bb7e3e169
@ -1,3 +1,11 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Sep 5 14:03:32 MDT 2013 - carnold@suse.com
|
||||||
|
|
||||||
|
- bnc#821214 - virt-manager has a big memory leak.
|
||||||
|
virtman-memleak-disable-graph.patch
|
||||||
|
virtman-memleak-callbacks.patch
|
||||||
|
virtman-graph-row-spacing.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Aug 29 15:41:17 MDT 2013 - carnold@suse.com
|
Thu Aug 29 15:41:17 MDT 2013 - carnold@suse.com
|
||||||
|
|
||||||
|
@ -34,6 +34,9 @@ Release: 0
|
|||||||
Url: http://virt-manager.et.redhat.com
|
Url: http://virt-manager.et.redhat.com
|
||||||
Source0: virt-manager-%{version}.tar.bz2
|
Source0: virt-manager-%{version}.tar.bz2
|
||||||
Patch0: virtman-dropped-connection-segfault.patch
|
Patch0: virtman-dropped-connection-segfault.patch
|
||||||
|
Patch1: virtman-memleak-disable-graph.patch
|
||||||
|
Patch2: virtman-memleak-callbacks.patch
|
||||||
|
Patch3: virtman-graph-row-spacing.patch
|
||||||
Patch50: virtman-desktop.patch
|
Patch50: virtman-desktop.patch
|
||||||
Patch51: virtman-cdrom.patch
|
Patch51: virtman-cdrom.patch
|
||||||
Patch52: virtman-kvm.patch
|
Patch52: virtman-kvm.patch
|
||||||
@ -102,6 +105,9 @@ Authors:
|
|||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
%patch50 -p1
|
%patch50 -p1
|
||||||
%patch51 -p1
|
%patch51 -p1
|
||||||
%patch52 -p1
|
%patch52 -p1
|
||||||
|
110
virtman-graph-row-spacing.patch
Normal file
110
virtman-graph-row-spacing.patch
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
|
||||||
|
Subject: manager: Use consistent row spacing even if we disable all graphs
|
||||||
|
From: Cole Robinson crobinso@redhat.com Mon Sep 2 10:43:53 2013 -0400
|
||||||
|
Date: Mon Sep 2 10:43:53 2013 -0400:
|
||||||
|
Git: b86c5b21ec3016f64dcf6e0375fcea166b16bcb7
|
||||||
|
|
||||||
|
|
||||||
|
Index: virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-0.9.5.orig/src/virtManager/manager.py
|
||||||
|
+++ virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
|
@@ -48,11 +48,11 @@ ROW_COLOR = 11
|
||||||
|
ROW_INSPECTION_OS_ICON = 12
|
||||||
|
|
||||||
|
# Columns in the tree view
|
||||||
|
-COL_NAME = 0
|
||||||
|
-COL_GUEST_CPU = 1
|
||||||
|
-COL_HOST_CPU = 2
|
||||||
|
-COL_DISK = 3
|
||||||
|
-COL_NETWORK = 4
|
||||||
|
+(COL_NAME,
|
||||||
|
+COL_GUEST_CPU,
|
||||||
|
+COL_HOST_CPU,
|
||||||
|
+COL_DISK,
|
||||||
|
+COL_NETWORK) = range(5)
|
||||||
|
|
||||||
|
rcstring = """
|
||||||
|
style "toolbar-style" {
|
||||||
|
@@ -92,13 +92,6 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
self.connmenu = gtk.Menu()
|
||||||
|
self.connmenu_items = {}
|
||||||
|
|
||||||
|
- # There seem to be ref counting issues with calling
|
||||||
|
- # list.get_column, so avoid it
|
||||||
|
- self.diskcol = None
|
||||||
|
- self.netcol = None
|
||||||
|
- self.guestcpucol = None
|
||||||
|
- self.hostcpucol = None
|
||||||
|
-
|
||||||
|
self.window.connect_signals({
|
||||||
|
"on_menu_view_guest_cpu_usage_activate":
|
||||||
|
(self.toggle_stats_visible, COL_GUEST_CPU),
|
||||||
|
@@ -133,7 +126,15 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
"on_menu_help_activate": self.show_help,
|
||||||
|
})
|
||||||
|
|
||||||
|
+ # There seem to be ref counting issues with calling
|
||||||
|
+ # list.get_column, so avoid it
|
||||||
|
+ self.diskcol = None
|
||||||
|
+ self.netcol = None
|
||||||
|
+ self.guestcpucol = None
|
||||||
|
+ self.hostcpucol = None
|
||||||
|
+ self.spacer_txt = None
|
||||||
|
self.init_vmlist()
|
||||||
|
+
|
||||||
|
self.init_stats()
|
||||||
|
self.init_toolbar()
|
||||||
|
self.init_context_menus()
|
||||||
|
@@ -368,27 +369,31 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
nameCol = gtk.TreeViewColumn(_("Name"))
|
||||||
|
nameCol.set_expand(True)
|
||||||
|
nameCol.set_spacing(6)
|
||||||
|
+ nameCol.set_sort_column_id(COL_NAME)
|
||||||
|
|
||||||
|
- statusCol = nameCol
|
||||||
|
vmlist.append_column(nameCol)
|
||||||
|
|
||||||
|
status_icon = gtk.CellRendererPixbuf()
|
||||||
|
status_icon.set_property("stock-size", gtk.ICON_SIZE_DND)
|
||||||
|
- statusCol.pack_start(status_icon, False)
|
||||||
|
- statusCol.add_attribute(status_icon, 'icon-name', ROW_STATUS_ICON)
|
||||||
|
- statusCol.add_attribute(status_icon, 'visible', ROW_IS_VM)
|
||||||
|
+ nameCol.pack_start(status_icon, False)
|
||||||
|
+ nameCol.add_attribute(status_icon, 'icon-name', ROW_STATUS_ICON)
|
||||||
|
+ nameCol.add_attribute(status_icon, 'visible', ROW_IS_VM)
|
||||||
|
|
||||||
|
inspection_os_icon = gtk.CellRendererPixbuf()
|
||||||
|
- statusCol.pack_start(inspection_os_icon, False)
|
||||||
|
- statusCol.add_attribute(inspection_os_icon, 'pixbuf',
|
||||||
|
- ROW_INSPECTION_OS_ICON)
|
||||||
|
- statusCol.add_attribute(inspection_os_icon, 'visible', ROW_IS_VM)
|
||||||
|
+ nameCol.pack_start(inspection_os_icon, False)
|
||||||
|
+ nameCol.add_attribute(inspection_os_icon, 'pixbuf',
|
||||||
|
+ ROW_INSPECTION_OS_ICON)
|
||||||
|
+ nameCol.add_attribute(inspection_os_icon, 'visible', ROW_IS_VM)
|
||||||
|
|
||||||
|
name_txt = gtk.CellRendererText()
|
||||||
|
nameCol.pack_start(name_txt, True)
|
||||||
|
nameCol.add_attribute(name_txt, 'markup', ROW_MARKUP)
|
||||||
|
nameCol.add_attribute(name_txt, 'foreground-gdk', ROW_COLOR)
|
||||||
|
- nameCol.set_sort_column_id(COL_NAME)
|
||||||
|
+
|
||||||
|
+ self.spacer_txt = gtk.CellRendererText()
|
||||||
|
+ self.spacer_txt.set_property("ypad", 4)
|
||||||
|
+ self.spacer_txt.set_property("visible", False)
|
||||||
|
+ nameCol.pack_end(self.spacer_txt, False)
|
||||||
|
|
||||||
|
def make_stats_column(title, colnum):
|
||||||
|
col = gtk.TreeViewColumn(title)
|
||||||
|
@@ -1161,6 +1166,10 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
col.set_visible(do_show)
|
||||||
|
self.widget(menu).set_active(do_show)
|
||||||
|
|
||||||
|
+ any_visible = any([col.get_visible() for col in
|
||||||
|
+ [self.netcol, self.diskcol, self.guestcpucol, self.hostcpucol]])
|
||||||
|
+ self.spacer_txt.set_property("visible", not any_visible)
|
||||||
|
+
|
||||||
|
def toggle_network_traffic_visible_widget(self, *ignore):
|
||||||
|
self._toggle_graph_helper(
|
||||||
|
self.config.is_vmlist_network_traffic_visible(), self.netcol,
|
192
virtman-memleak-callbacks.patch
Normal file
192
virtman-memleak-callbacks.patch
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
|
||||||
|
Subject: manager: Separate stats and state update callbacks
|
||||||
|
From: Cole Robinson crobinso@redhat.com Mon Sep 2 09:09:31 2013 -0400
|
||||||
|
Date: Mon Sep 2 09:32:50 2013 -0400:
|
||||||
|
Git: f141c77c452d4807b516bdc40a0e86235bf5243a
|
||||||
|
|
||||||
|
There's no need to be resetting row keys like VM name, state, on every
|
||||||
|
'resources-sampled' signals, since we have had finer grained status-changed
|
||||||
|
and config-changed signals for a while. This seems to reduce the memory
|
||||||
|
leak on F19 as well.
|
||||||
|
|
||||||
|
Index: virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-0.9.5.orig/src/virtManager/manager.py
|
||||||
|
+++ virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
|
@@ -141,9 +141,9 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
# XXX: Help docs useless/out of date
|
||||||
|
self.widget("menu_help").hide()
|
||||||
|
|
||||||
|
- self.vm_selected()
|
||||||
|
- self.widget("vm-list").get_selection().connect("changed",
|
||||||
|
- self.vm_selected)
|
||||||
|
+ self.update_current_selection()
|
||||||
|
+ self.widget("vm-list").get_selection().connect(
|
||||||
|
+ "changed", self.update_current_selection)
|
||||||
|
|
||||||
|
self.max_disk_rate = 10.0
|
||||||
|
self.max_net_rate = 10.0
|
||||||
|
@@ -708,9 +708,9 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
|
||||||
|
def vm_added(self, conn, vmuuid):
|
||||||
|
vm = conn.get_vm(vmuuid)
|
||||||
|
+ vm.connect("config-changed", self.vm_config_changed)
|
||||||
|
vm.connect("status-changed", self.vm_status_changed)
|
||||||
|
- vm.connect("resources-sampled", self.vm_resources_sampled)
|
||||||
|
- vm.connect("config-changed", self.vm_resources_sampled, True)
|
||||||
|
+ vm.connect("resources-sampled", self.vm_row_updated)
|
||||||
|
vm.connect("inspection-changed", self.vm_inspection_changed)
|
||||||
|
|
||||||
|
vmlist = self.widget("vm-list")
|
||||||
|
@@ -829,7 +829,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
|
||||||
|
conn.connect("vm-added", self.vm_added)
|
||||||
|
conn.connect("vm-removed", self.vm_removed)
|
||||||
|
- conn.connect("resources-sampled", self.conn_resources_sampled)
|
||||||
|
+ conn.connect("resources-sampled", self.conn_row_updated)
|
||||||
|
conn.connect("state-changed", self.conn_state_changed)
|
||||||
|
conn.connect("connect-error", self._connect_error)
|
||||||
|
|
||||||
|
@@ -854,7 +854,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
continue
|
||||||
|
|
||||||
|
newname = conn.get_pretty_desc_inactive(False, True)
|
||||||
|
- self.conn_resources_sampled(conn, newname)
|
||||||
|
+ self.conn_state_changed(conn, newname=newname)
|
||||||
|
|
||||||
|
def remove_conn(self, engine_ignore, uri):
|
||||||
|
model = self.widget("vm-list").get_model()
|
||||||
|
@@ -877,6 +877,29 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
# State/UI updating methods #
|
||||||
|
#############################
|
||||||
|
|
||||||
|
+ def vm_row_updated(self, vm):
|
||||||
|
+ row = self.rows.get(self.vm_row_key(vm), None)
|
||||||
|
+ if row is None:
|
||||||
|
+ return
|
||||||
|
+ self.widget("vm-list").get_model().row_changed(row.path, row.iter)
|
||||||
|
+
|
||||||
|
+ def vm_config_changed(self, vm):
|
||||||
|
+ if self.vm_row_key(vm) not in self.rows:
|
||||||
|
+ return
|
||||||
|
+
|
||||||
|
+ row = self.rows[self.vm_row_key(vm)]
|
||||||
|
+ row[ROW_NAME] = vm.get_name()
|
||||||
|
+ row[ROW_STATUS] = vm.run_status()
|
||||||
|
+ row[ROW_STATUS_ICON] = vm.run_status_icon_name()
|
||||||
|
+ row[ROW_IS_VM_RUNNING] = vm.is_active()
|
||||||
|
+ row[ROW_MARKUP] = self._build_vm_markup(row)
|
||||||
|
+
|
||||||
|
+ desc = vm.get_description()
|
||||||
|
+ if not uihelpers.can_set_row_none:
|
||||||
|
+ desc = desc or ""
|
||||||
|
+ row[ROW_HINT] = util.xml_escape(desc)
|
||||||
|
+ self.vm_row_updated(vm)
|
||||||
|
+
|
||||||
|
def vm_status_changed(self, vm, oldstatus, newstatus):
|
||||||
|
ignore = newstatus
|
||||||
|
ignore = oldstatus
|
||||||
|
@@ -887,7 +910,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
missing = True
|
||||||
|
for row in range(model.iter_n_children(parent)):
|
||||||
|
_iter = model.iter_nth_child(parent, row)
|
||||||
|
- if model.get_value(_iter, ROW_KEY) == vm.get_uuid():
|
||||||
|
+ if model.get_value(_iter, ROW_HANDLE) == vm:
|
||||||
|
missing = False
|
||||||
|
break
|
||||||
|
|
||||||
|
@@ -895,27 +918,8 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
self._append_vm(model, vm, vm.conn)
|
||||||
|
|
||||||
|
# Update run/shutdown/pause button states
|
||||||
|
- self.vm_selected()
|
||||||
|
- self.vm_resources_sampled(vm)
|
||||||
|
-
|
||||||
|
- def vm_resources_sampled(self, vm, config_changed=False):
|
||||||
|
- vmlist = self.widget("vm-list")
|
||||||
|
- model = vmlist.get_model()
|
||||||
|
-
|
||||||
|
- if self.vm_row_key(vm) not in self.rows:
|
||||||
|
- return
|
||||||
|
-
|
||||||
|
- row = self.rows[self.vm_row_key(vm)]
|
||||||
|
- row[ROW_NAME] = vm.get_name()
|
||||||
|
- row[ROW_STATUS] = vm.run_status()
|
||||||
|
- row[ROW_STATUS_ICON] = vm.run_status_icon_name()
|
||||||
|
- row[ROW_IS_VM_RUNNING] = vm.is_active()
|
||||||
|
- row[ROW_MARKUP] = self._build_vm_markup(row)
|
||||||
|
-
|
||||||
|
- if config_changed:
|
||||||
|
- row[ROW_HINT] = util.xml_escape(vm.get_description())
|
||||||
|
-
|
||||||
|
- model.row_changed(row.path, row.iter)
|
||||||
|
+ self.update_current_selection()
|
||||||
|
+ self.vm_config_changed(vm)
|
||||||
|
|
||||||
|
def vm_inspection_changed(self, vm):
|
||||||
|
vmlist = self.widget("vm-list")
|
||||||
|
@@ -927,7 +931,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
row = self.rows[self.vm_row_key(vm)]
|
||||||
|
row[ROW_INSPECTION_OS_ICON] = \
|
||||||
|
self.get_inspection_icon_pixbuf(vm, 16, 16)
|
||||||
|
- model.row_changed(row.path, row.iter)
|
||||||
|
+ self.vm_row_updated(vm)
|
||||||
|
|
||||||
|
def get_inspection_icon_pixbuf(self, vm, w, h):
|
||||||
|
# libguestfs gives us the PNG data as a string.
|
||||||
|
@@ -943,13 +947,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
|
||||||
|
- def conn_state_changed(self, conn):
|
||||||
|
- self.conn_resources_sampled(conn)
|
||||||
|
- self.vm_selected()
|
||||||
|
-
|
||||||
|
- def conn_resources_sampled(self, conn, newname=None):
|
||||||
|
- vmlist = self.widget("vm-list")
|
||||||
|
- model = vmlist.get_model()
|
||||||
|
+ def conn_state_changed(self, conn, newname=None):
|
||||||
|
row = self.rows[conn.get_uri()]
|
||||||
|
|
||||||
|
if newname:
|
||||||
|
@@ -964,20 +962,27 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
if conn.get_state() in [vmmConnection.STATE_DISCONNECTED,
|
||||||
|
vmmConnection.STATE_CONNECTING]:
|
||||||
|
# Connection went inactive, delete any VM child nodes
|
||||||
|
- parent = self.rows[conn.get_uri()].iter
|
||||||
|
+ parent = row.iter
|
||||||
|
if parent is not None:
|
||||||
|
+ model = self.widget("vm-list").get_model()
|
||||||
|
child = model.iter_children(parent)
|
||||||
|
while child is not None:
|
||||||
|
- del self.rows[self.vm_row_key(model.get_value(child,
|
||||||
|
- ROW_HANDLE))]
|
||||||
|
+ vm = model[child][ROW_HANDLE]
|
||||||
|
+ del self.rows[self.vm_row_key(vm)]
|
||||||
|
model.remove(child)
|
||||||
|
child = model.iter_children(parent)
|
||||||
|
|
||||||
|
+ self.conn_row_updated(conn)
|
||||||
|
+ self.update_current_selection()
|
||||||
|
+
|
||||||
|
+ def conn_row_updated(self, conn):
|
||||||
|
+ row = self.rows[conn.get_uri()]
|
||||||
|
+
|
||||||
|
self.max_disk_rate = max(self.max_disk_rate, conn.disk_io_max_rate())
|
||||||
|
self.max_net_rate = max(self.max_net_rate,
|
||||||
|
conn.network_traffic_max_rate())
|
||||||
|
|
||||||
|
- model.row_changed(row.path, row.iter)
|
||||||
|
+ self.widget("vm-list").get_model().row_changed(row.path, row.iter)
|
||||||
|
|
||||||
|
def change_run_text(self, can_restore):
|
||||||
|
if can_restore:
|
||||||
|
@@ -989,7 +994,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
self.vmmenu_items["run"].get_child().set_label(text)
|
||||||
|
self.widget("vm-run").set_label(strip_text)
|
||||||
|
|
||||||
|
- def vm_selected(self, ignore=None):
|
||||||
|
+ def update_current_selection(self, ignore=None):
|
||||||
|
conn = self.current_conn()
|
||||||
|
vm = self.current_vm()
|
||||||
|
|
160
virtman-memleak-disable-graph.patch
Normal file
160
virtman-memleak-disable-graph.patch
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
|
||||||
|
Subject: manager: Disable graph data func if graph isn't visible
|
||||||
|
From: Cole Robinson crobinso@redhat.com Sun Sep 1 21:35:23 2013 -0400
|
||||||
|
Date: Mon Sep 2 08:42:25 2013 -0400:
|
||||||
|
Git: db7db9ab47dd00d746cf8a3359c1c26dbfcfa50e
|
||||||
|
|
||||||
|
Seems like pygobject is a bit leaky with tree row accesses, and
|
||||||
|
the cell cb hammers on that quite a bit, even if the graph isn't showing.
|
||||||
|
|
||||||
|
Index: virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-0.9.5.orig/src/virtManager/manager.py
|
||||||
|
+++ virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
|
@@ -249,15 +249,11 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
self.config.on_stats_enable_net_poll_changed(self.enable_polling,
|
||||||
|
COL_NETWORK))
|
||||||
|
|
||||||
|
+ self.toggle_guest_cpu_usage_visible_widget()
|
||||||
|
+ self.toggle_host_cpu_usage_visible_widget()
|
||||||
|
+ self.toggle_disk_io_visible_widget()
|
||||||
|
+ self.toggle_network_traffic_visible_widget()
|
||||||
|
|
||||||
|
- self.widget("menu_view_stats_guest_cpu").set_active(
|
||||||
|
- self.config.is_vmlist_guest_cpu_usage_visible())
|
||||||
|
- self.widget("menu_view_stats_host_cpu").set_active(
|
||||||
|
- self.config.is_vmlist_host_cpu_usage_visible())
|
||||||
|
- self.widget("menu_view_stats_disk").set_active(
|
||||||
|
- self.config.is_vmlist_disk_io_visible())
|
||||||
|
- self.widget("menu_view_stats_network").set_active(
|
||||||
|
- self.config.is_vmlist_network_traffic_visible())
|
||||||
|
|
||||||
|
def init_toolbar(self):
|
||||||
|
self.widget("vm-new").set_icon_name("vm_new")
|
||||||
|
@@ -394,7 +390,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
nameCol.add_attribute(name_txt, 'foreground-gdk', ROW_COLOR)
|
||||||
|
nameCol.set_sort_column_id(COL_NAME)
|
||||||
|
|
||||||
|
- def make_stats_column(title, datafunc, is_visible, colnum):
|
||||||
|
+ def make_stats_column(title, colnum):
|
||||||
|
col = gtk.TreeViewColumn(title)
|
||||||
|
col.set_min_width(140)
|
||||||
|
txt = gtk.CellRendererText()
|
||||||
|
@@ -406,28 +402,14 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
col.pack_start(txt, False)
|
||||||
|
col.add_attribute(img, 'visible', ROW_IS_VM)
|
||||||
|
col.add_attribute(txt, 'visible', ROW_IS_CONN)
|
||||||
|
- col.set_cell_data_func(img, datafunc, None)
|
||||||
|
- col.set_visible(is_visible)
|
||||||
|
col.set_sort_column_id(colnum)
|
||||||
|
vmlist.append_column(col)
|
||||||
|
return col
|
||||||
|
|
||||||
|
- self.guestcpucol = make_stats_column(_("CPU usage"),
|
||||||
|
- self.guest_cpu_usage_img,
|
||||||
|
- self.config.is_vmlist_guest_cpu_usage_visible(),
|
||||||
|
- COL_GUEST_CPU)
|
||||||
|
- self.hostcpucol = make_stats_column(_("Host CPU usage"),
|
||||||
|
- self.host_cpu_usage_img,
|
||||||
|
- self.config.is_vmlist_host_cpu_usage_visible(),
|
||||||
|
- COL_HOST_CPU)
|
||||||
|
- self.diskcol = make_stats_column(_("Disk I/O"),
|
||||||
|
- self.disk_io_img,
|
||||||
|
- self.config.is_vmlist_disk_io_visible(),
|
||||||
|
- COL_DISK)
|
||||||
|
- self.netcol = make_stats_column(_("Network I/O"),
|
||||||
|
- self.network_traffic_img,
|
||||||
|
- self.config.is_vmlist_network_traffic_visible(),
|
||||||
|
- COL_NETWORK)
|
||||||
|
+ self.guestcpucol = make_stats_column(_("CPU usage"), COL_GUEST_CPU)
|
||||||
|
+ self.hostcpucol = make_stats_column(_("Host CPU usage"), COL_HOST_CPU)
|
||||||
|
+ self.diskcol = make_stats_column(_("Disk I/O"), COL_DISK)
|
||||||
|
+ self.netcol = make_stats_column(_("Network I/O"), COL_NETWORK)
|
||||||
|
|
||||||
|
model.set_sort_func(COL_NAME, self.vmlist_name_sorter)
|
||||||
|
model.set_sort_func(COL_GUEST_CPU, self.vmlist_guest_cpu_usage_sorter)
|
||||||
|
@@ -1163,25 +1145,33 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
current_text = current_text + disabled_text
|
||||||
|
widget.set_label(current_text)
|
||||||
|
|
||||||
|
- def toggle_network_traffic_visible_widget(self, *ignore):
|
||||||
|
- val = self.config.is_vmlist_network_traffic_visible()
|
||||||
|
- self.netcol.set_visible(val)
|
||||||
|
- self.widget("menu_view_stats_network").set_active(val)
|
||||||
|
+ def _toggle_graph_helper(self, do_show, col, datafunc, menu):
|
||||||
|
+ img = -1
|
||||||
|
+ for child in col.get_cells():
|
||||||
|
+ if isinstance(child, CellRendererSparkline):
|
||||||
|
+ img = child
|
||||||
|
+ datafunc = do_show and datafunc or None
|
||||||
|
+
|
||||||
|
+ col.set_cell_data_func(img, datafunc, None)
|
||||||
|
+ col.set_visible(do_show)
|
||||||
|
+ self.widget(menu).set_active(do_show)
|
||||||
|
|
||||||
|
+ def toggle_network_traffic_visible_widget(self, *ignore):
|
||||||
|
+ self._toggle_graph_helper(
|
||||||
|
+ self.config.is_vmlist_network_traffic_visible(), self.netcol,
|
||||||
|
+ self.network_traffic_img, "menu_view_stats_network")
|
||||||
|
def toggle_disk_io_visible_widget(self, *ignore):
|
||||||
|
- val = self.config.is_vmlist_disk_io_visible()
|
||||||
|
- self.diskcol.set_visible(val)
|
||||||
|
- self.widget("menu_view_stats_disk").set_active(val)
|
||||||
|
-
|
||||||
|
+ self._toggle_graph_helper(
|
||||||
|
+ self.config.is_vmlist_disk_io_visible(), self.diskcol,
|
||||||
|
+ self.disk_io_img, "menu_view_stats_disk")
|
||||||
|
def toggle_guest_cpu_usage_visible_widget(self, *ignore):
|
||||||
|
- val = self.config.is_vmlist_guest_cpu_usage_visible()
|
||||||
|
- self.guestcpucol.set_visible(val)
|
||||||
|
- self.widget("menu_view_stats_guest_cpu").set_active(val)
|
||||||
|
-
|
||||||
|
+ self._toggle_graph_helper(
|
||||||
|
+ self.config.is_vmlist_guest_cpu_usage_visible(), self.guestcpucol,
|
||||||
|
+ self.guest_cpu_usage_img, "menu_view_stats_guest_cpu")
|
||||||
|
def toggle_host_cpu_usage_visible_widget(self, *ignore):
|
||||||
|
- val = self.config.is_vmlist_host_cpu_usage_visible()
|
||||||
|
- self.hostcpucol.set_visible(val)
|
||||||
|
- self.widget("menu_view_stats_host_cpu").set_active(val)
|
||||||
|
+ self._toggle_graph_helper(
|
||||||
|
+ self.config.is_vmlist_host_cpu_usage_visible(), self.hostcpucol,
|
||||||
|
+ self.host_cpu_usage_img, "menu_view_stats_host_cpu")
|
||||||
|
|
||||||
|
def toggle_stats_visible(self, src, stats_id):
|
||||||
|
visible = src.get_active()
|
||||||
|
@@ -1194,7 +1184,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
set_stats[stats_id](visible)
|
||||||
|
|
||||||
|
def guest_cpu_usage_img(self, column_ignore, cell, model, _iter, data):
|
||||||
|
- obj = model.get_value(_iter, ROW_HANDLE)
|
||||||
|
+ obj = model[_iter][ROW_HANDLE]
|
||||||
|
if obj is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
@@ -1202,7 +1192,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
cell.set_property('data_array', data)
|
||||||
|
|
||||||
|
def host_cpu_usage_img(self, column_ignore, cell, model, _iter, data):
|
||||||
|
- obj = model.get_value(_iter, ROW_HANDLE)
|
||||||
|
+ obj = model[_iter][ROW_HANDLE]
|
||||||
|
if obj is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
@@ -1210,7 +1200,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
cell.set_property('data_array', data)
|
||||||
|
|
||||||
|
def disk_io_img(self, column_ignore, cell, model, _iter, data):
|
||||||
|
- obj = model.get_value(_iter, ROW_HANDLE)
|
||||||
|
+ obj = model[_iter][ROW_HANDLE]
|
||||||
|
if obj is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
@@ -1221,7 +1211,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
|
cell.set_property('data_array', data)
|
||||||
|
|
||||||
|
def network_traffic_img(self, column_ignore, cell, model, _iter, data):
|
||||||
|
- obj = model.get_value(_iter, ROW_HANDLE)
|
||||||
|
+ obj = model[_iter][ROW_HANDLE]
|
||||||
|
if obj is None:
|
||||||
|
return
|
||||||
|
|
@ -10,7 +10,7 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- virt-manager-0.9.5.orig/src/virtManager/manager.py
|
--- virt-manager-0.9.5.orig/src/virtManager/manager.py
|
||||||
+++ virt-manager-0.9.5/src/virtManager/manager.py
|
+++ virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
@@ -787,7 +787,7 @@ class vmmManager(vmmGObjectUI):
|
@@ -774,7 +774,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
row.insert(ROW_STATUS, vm.run_status())
|
row.insert(ROW_STATUS, vm.run_status())
|
||||||
row.insert(ROW_STATUS_ICON, vm.run_status_icon_name())
|
row.insert(ROW_STATUS_ICON, vm.run_status_icon_name())
|
||||||
row.insert(ROW_KEY, vm.get_uuid())
|
row.insert(ROW_KEY, vm.get_uuid())
|
||||||
@ -19,12 +19,12 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py
|
|||||||
row.insert(ROW_IS_CONN, False)
|
row.insert(ROW_IS_CONN, False)
|
||||||
row.insert(ROW_IS_CONN_CONNECTED, True)
|
row.insert(ROW_IS_CONN_CONNECTED, True)
|
||||||
row.insert(ROW_IS_VM, True)
|
row.insert(ROW_IS_VM, True)
|
||||||
@@ -931,7 +931,7 @@ class vmmManager(vmmGObjectUI):
|
@@ -902,7 +902,7 @@ class vmmManager(vmmGObjectUI):
|
||||||
row[ROW_MARKUP] = self._build_vm_markup(row)
|
desc = vm.get_description()
|
||||||
|
if not uihelpers.can_set_row_none:
|
||||||
if config_changed:
|
desc = desc or ""
|
||||||
- row[ROW_HINT] = util.xml_escape(vm.get_description())
|
- row[ROW_HINT] = util.xml_escape(desc)
|
||||||
+ row[ROW_HINT] = vm.get_description()
|
+ row[ROW_HINT] = desc
|
||||||
|
self.vm_row_updated(vm)
|
||||||
model.row_changed(row.path, row.iter)
|
|
||||||
|
|
||||||
|
def vm_status_changed(self, vm, oldstatus, newstatus):
|
||||||
|
@ -23,8 +23,8 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- virt-manager-0.9.5.orig/src/virtManager/manager.py
|
--- virt-manager-0.9.5.orig/src/virtManager/manager.py
|
||||||
+++ virt-manager-0.9.5/src/virtManager/manager.py
|
+++ virt-manager-0.9.5/src/virtManager/manager.py
|
||||||
@@ -260,7 +260,8 @@ class vmmManager(vmmGObjectUI):
|
@@ -257,7 +257,8 @@ class vmmManager(vmmGObjectUI):
|
||||||
self.config.is_vmlist_network_traffic_visible())
|
|
||||||
|
|
||||||
def init_toolbar(self):
|
def init_toolbar(self):
|
||||||
- self.widget("vm-new").set_icon_name("vm_new")
|
- self.widget("vm-new").set_icon_name("vm_new")
|
||||||
@ -33,7 +33,7 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py
|
|||||||
self.widget("vm-open").set_icon_name("icon_console")
|
self.widget("vm-open").set_icon_name("icon_console")
|
||||||
uihelpers.build_shutdown_button_menu(self.widget("vm-shutdown"),
|
uihelpers.build_shutdown_button_menu(self.widget("vm-shutdown"),
|
||||||
self.poweroff_vm,
|
self.poweroff_vm,
|
||||||
@@ -510,6 +511,9 @@ class vmmManager(vmmGObjectUI):
|
@@ -497,6 +498,9 @@ class vmmManager(vmmGObjectUI):
|
||||||
def new_vm(self, src_ignore=None):
|
def new_vm(self, src_ignore=None):
|
||||||
self.emit("action-show-create", self.current_conn_uri())
|
self.emit("action-show-create", self.current_conn_uri())
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ Index: virt-manager-0.9.5/src/virtManager/manager.py
|
|||||||
def show_about(self, src_ignore):
|
def show_about(self, src_ignore):
|
||||||
self.emit("action-show-about")
|
self.emit("action-show-about")
|
||||||
|
|
||||||
@@ -1238,6 +1242,7 @@ vmmManager.signal_new(vmmManager, "actio
|
@@ -1242,6 +1246,7 @@ vmmManager.signal_new(vmmManager, "actio
|
||||||
vmmManager.signal_new(vmmManager, "action-show-host", [str])
|
vmmManager.signal_new(vmmManager, "action-show-host", [str])
|
||||||
vmmManager.signal_new(vmmManager, "action-show-preferences", [])
|
vmmManager.signal_new(vmmManager, "action-show-preferences", [])
|
||||||
vmmManager.signal_new(vmmManager, "action-show-create", [str])
|
vmmManager.signal_new(vmmManager, "action-show-create", [str])
|
||||||
|
Loading…
Reference in New Issue
Block a user