From 0c96ca82377bd1a20aa85ba3207525682e61c9d6 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Sep 17 2009 18:42:27 +0000 Subject: Don't close libvirt connection for non-fatal errors (bz 522168) Manager UI tweaks Generate better errors if disk/net stats polling fails --- diff --git a/state_paused.png b/state_paused.png new file mode 100644 index 0000000..1d2966d Binary files /dev/null and b/state_paused.png differ diff --git a/state_running.png b/state_running.png new file mode 100644 index 0000000..bbee381 Binary files /dev/null and b/state_running.png differ diff --git a/state_shutoff.png b/state_shutoff.png new file mode 100644 index 0000000..db9914e Binary files /dev/null and b/state_shutoff.png differ diff --git a/virt-manager-0.8.0-conn-close-exception.patch b/virt-manager-0.8.0-conn-close-exception.patch new file mode 100644 index 0000000..3c16fbe --- /dev/null +++ b/virt-manager-0.8.0-conn-close-exception.patch @@ -0,0 +1,49 @@ +# HG changeset patch +# User Cole Robinson +# Date 1253131339 14400 +# Node ID 1c886d1863f72e7ddd5fb99050362296be6a9deb +# Parent 9242a7fe76b16c6505bdd3d3d328ae8f0c56da10 +Don't close connection on all libvirt errors: only if libvirtd goes away. + +diff -r 9242a7fe76b1 -r 1c886d1863f7 src/virtManager/connection.py +--- a/src/virtManager/connection.py Wed Sep 16 16:01:54 2009 -0400 ++++ b/src/virtManager/connection.py Wed Sep 16 16:02:19 2009 -0400 +@@ -941,7 +941,15 @@ + updateVMs = newVMs + + for uuid in updateVMs: +- self.vms[uuid].tick(now) ++ vm = self.vms[uuid] ++ try: ++ vm.tick(now) ++ except libvirt.libvirtError, e: ++ if e.get_error_code() == libvirt.VIR_ERR_SYSTEM_ERROR: ++ raise ++ logging.exception("Tick for VM '%s' failed" % vm.get_name()) ++ except Exception, e: ++ logging.exception("Tick for VM '%s' failed" % vm.get_name()) + + if not noStatsUpdate: + self._recalculate_stats(now) +diff -r 9242a7fe76b1 -r 1c886d1863f7 src/virtManager/engine.py +--- a/src/virtManager/engine.py Wed Sep 16 16:01:54 2009 -0400 ++++ b/src/virtManager/engine.py Wed Sep 16 16:02:19 2009 -0400 +@@ -199,10 +199,14 @@ + self.connections[uri]["connection"].tick() + except KeyboardInterrupt: + raise +- except: +- logging.exception("Could not refresh connection %s." % uri) +- logging.debug("Closing connection since refresh failed.") +- self.connections[uri]["connection"].close() ++ except libvirt.libvirtError, e: ++ if e.get_error_code() == libvirt.VIR_ERR_SYSTEM_ERROR: ++ logging.exception("Could not refresh connection %s." % uri) ++ logging.debug("Closing connection since libvirtd " ++ "appears to have stopped.") ++ self.connections[uri]["connection"].close() ++ else: ++ raise + return 1 + + def change_timer_interval(self,ignore1,ignore2,ignore3,ignore4): diff --git a/virt-manager-0.8.0-manager-ui-tweaks.patch b/virt-manager-0.8.0-manager-ui-tweaks.patch new file mode 100644 index 0000000..0245c84 --- /dev/null +++ b/virt-manager-0.8.0-manager-ui-tweaks.patch @@ -0,0 +1,249 @@ +# HG changeset patch +# User Cole Robinson +# Date 1253201058 14400 +# Node ID a6f055361d165bea5fbb3c62ec54a820987a7dde +# Parent 1c886d1863f72e7ddd5fb99050362296be6a9deb +Update new VM status icons. + +Previous round didn't convey state very well, and looked too much like +buttons. + +diff -r 1c886d1863f7 -r a6f055361d16 pixmaps/state_paused.png +Binary file pixmaps/state_paused.png has changed +diff -r 1c886d1863f7 -r a6f055361d16 pixmaps/state_running.png +Binary file pixmaps/state_running.png has changed +diff -r 1c886d1863f7 -r a6f055361d16 pixmaps/state_shutoff.png +Binary file pixmaps/state_shutoff.png has changed +diff -r 1c886d1863f7 -r a6f055361d16 src/virtManager/config.py +--- a/src/virtManager/config.py Wed Sep 16 16:02:19 2009 -0400 ++++ b/src/virtManager/config.py Thu Sep 17 11:24:18 2009 -0400 +@@ -90,7 +90,16 @@ + libvirt.VIR_DOMAIN_SHUTOFF: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_shutoff.png", 18, 18), + libvirt.VIR_DOMAIN_NOSTATE: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 18, 18), + } +- #initialize the help stuff ++ self.status_icons_large = { ++ libvirt.VIR_DOMAIN_BLOCKED: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 32, 32), ++ libvirt.VIR_DOMAIN_CRASHED: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_crashed.png", 32, 32), ++ libvirt.VIR_DOMAIN_PAUSED: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_paused.png", 32, 32), ++ libvirt.VIR_DOMAIN_RUNNING: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 32, 32), ++ libvirt.VIR_DOMAIN_SHUTDOWN: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_shutoff.png", 32, 32), ++ libvirt.VIR_DOMAIN_SHUTOFF: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_shutoff.png", 32, 32), ++ libvirt.VIR_DOMAIN_NOSTATE: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 32, 32), ++ } ++ + props = { gnome.PARAM_APP_DATADIR : self.get_data_dir()} + gnome.program_init(self.get_appname(), self.get_appversion(), \ + properties=props) +@@ -100,6 +109,9 @@ + def get_vm_status_icon(self, state): + return self.status_icons[state] + ++ def get_vm_status_icon_large(self, state): ++ return self.status_icons_large[state] ++ + def get_shutdown_icon_name(self): + theme = gtk.icon_theme_get_default() + if theme.has_icon("system-shutdown"): +diff -r 1c886d1863f7 -r a6f055361d16 src/virtManager/domain.py +--- a/src/virtManager/domain.py Wed Sep 16 16:02:19 2009 -0400 ++++ b/src/virtManager/domain.py Thu Sep 17 11:24:18 2009 -0400 +@@ -728,6 +728,8 @@ + + def run_status_icon(self): + return self.config.get_vm_status_icon(self.status()) ++ def run_status_icon_large(self): ++ return self.config.get_vm_status_icon_large(self.status()) + + def _is_serial_console_tty_accessible(self, path): + # pty serial scheme doesn't work over remote +diff -r 1c886d1863f7 -r a6f055361d16 src/virtManager/manager.py +--- a/src/virtManager/manager.py Wed Sep 16 16:02:19 2009 -0400 ++++ b/src/virtManager/manager.py Thu Sep 17 11:24:18 2009 -0400 +@@ -493,7 +493,7 @@ + row.insert(ROW_NAME, vm.get_name()) + row.insert(ROW_MARKUP, row[ROW_NAME]) + row.insert(ROW_STATUS, vm.run_status()) +- row.insert(ROW_STATUS_ICON, vm.run_status_icon()) ++ row.insert(ROW_STATUS_ICON, vm.run_status_icon_large()) + row.insert(ROW_KEY, vm.get_uuid()) + row.insert(ROW_HINT, None) + row.insert(ROW_IS_CONN, False) +@@ -575,7 +575,7 @@ + + row = self.rows[self.vm_row_key(vm)] + row[ROW_STATUS] = vm.run_status() +- row[ROW_STATUS_ICON] = vm.run_status_icon() ++ row[ROW_STATUS_ICON] = vm.run_status_icon_large() + row[ROW_IS_VM_RUNNING] = vm.is_active() + model.row_changed(row.path, row.iter) + +@@ -850,7 +850,6 @@ + statusCol.add_attribute(status_icon, 'cell-background', ROW_COLOR) + statusCol.add_attribute(status_icon, 'pixbuf', ROW_STATUS_ICON) + statusCol.add_attribute(status_icon, 'visible', ROW_IS_VM) +- statusCol.add_attribute(status_icon, 'sensitive', ROW_IS_VM_RUNNING) + + name_txt = gtk.CellRendererText() + nameCol.pack_start(name_txt, True) +# HG changeset patch +# User Cole Robinson +# Date 1253205341 14400 +# Node ID cdbe1da3ce75a5ad06b8e07e891ac35d1b246685 +# Parent a6f055361d165bea5fbb3c62ec54a820987a7dde +Change VM name text arrangement in manager view. + +Shrink text size, add a second row that shows the VM status. Fills the +display up a bit so it doesn't look so sparse. + +diff -r a6f055361d16 -r cdbe1da3ce75 src/virtManager/manager.py +--- a/src/virtManager/manager.py Thu Sep 17 11:24:18 2009 -0400 ++++ b/src/virtManager/manager.py Thu Sep 17 12:35:41 2009 -0400 +@@ -486,12 +486,26 @@ + else: + self.emit("action-refresh-console", uri, vmuuid) + ++ def _build_conn_markup(self, conn, row): ++ if conn.state == conn.STATE_DISCONNECTED: ++ markup = ("%s - " ++ "Not Connected" % row[ROW_NAME]) ++ else: ++ markup = ("%s" % row[ROW_NAME]) ++ return markup ++ ++ def _build_vm_markup(self, vm, row): ++ markup = ("%s\n" ++ "%s" % ++ (row[ROW_NAME], row[ROW_STATUS])) ++ return markup ++ + def _append_vm(self, model, vm, conn): + parent = self.rows[conn.get_uri()].iter + row = [] + row.insert(ROW_HANDLE, vm) + row.insert(ROW_NAME, vm.get_name()) +- row.insert(ROW_MARKUP, row[ROW_NAME]) ++ row.insert(ROW_MARKUP, "") + row.insert(ROW_STATUS, vm.run_status()) + row.insert(ROW_STATUS_ICON, vm.run_status_icon_large()) + row.insert(ROW_KEY, vm.get_uuid()) +@@ -502,6 +516,8 @@ + row.insert(ROW_IS_VM_RUNNING, vm.is_active()) + row.insert(ROW_COLOR, "white") + ++ row[ROW_MARKUP] = self._build_vm_markup(vm, row) ++ + _iter = model.append(parent, row) + path = model.get_path(_iter) + self.rows[self.vm_row_key(vm)] = model[path] +@@ -512,12 +528,7 @@ + row = [] + row.insert(ROW_HANDLE, conn) + row.insert(ROW_NAME, conn.get_pretty_desc_inactive(False)) +- if conn.state == conn.STATE_DISCONNECTED: +- markup = ("%s - " +- "Not Connected" % row[ROW_NAME]) +- else: +- markup = ("%s" % row[ROW_NAME]) +- row.insert(ROW_MARKUP, markup) ++ row.insert(ROW_MARKUP, self._build_conn_markup(conn, row)) + row.insert(ROW_STATUS, ("%s" % + conn.get_state_text())) + row.insert(ROW_STATUS_ICON, None) +@@ -589,12 +600,7 @@ + model = vmlist.get_model() + row = self.rows[conn.get_uri()] + +- if conn.state == conn.STATE_DISCONNECTED: +- markup = ("%s - " +- "Not Connected" % row[ROW_NAME]) +- else: +- markup = ("%s" % row[ROW_NAME]) +- row[ROW_MARKUP] = markup ++ row[ROW_MARKUP] = self._build_conn_markup(conn, row) + row[ROW_STATUS] = "%s" % conn.get_state_text() + row[ROW_IS_CONN_CONNECTED] = conn.state != conn.STATE_DISCONNECTED + +# HG changeset patch +# User Cole Robinson +# Date 1253201111 14400 +# Node ID 739a6876af4692d6f86d8813f6dd3aa046bf6a8b +# Parent cdbe1da3ce75a5ad06b8e07e891ac35d1b246685 +Drop row coloring for managed connection rows. + +Looks kind of funky with lots of dark colored rows for a user with multiple +connections. + +diff -r cdbe1da3ce75 -r 739a6876af46 src/virtManager/manager.py +--- a/src/virtManager/manager.py Thu Sep 17 12:35:41 2009 -0400 ++++ b/src/virtManager/manager.py Thu Sep 17 11:25:11 2009 -0400 +@@ -49,8 +49,6 @@ + ROW_IS_CONN_CONNECTED = 8 + ROW_IS_VM = 9 + ROW_IS_VM_RUNNING = 10 +-ROW_COLOR = 11 +-ROW_HEIGHT = 12 + + # Columns in the tree view + COL_NAME = 0 +@@ -514,7 +512,6 @@ + row.insert(ROW_IS_CONN_CONNECTED, True) + row.insert(ROW_IS_VM, True) + row.insert(ROW_IS_VM_RUNNING, vm.is_active()) +- row.insert(ROW_COLOR, "white") + + row[ROW_MARKUP] = self._build_vm_markup(vm, row) + +@@ -539,7 +536,6 @@ + conn.state != conn.STATE_DISCONNECTED) + row.insert(ROW_IS_VM, False) + row.insert(ROW_IS_VM_RUNNING, False) +- row.insert(ROW_COLOR, "#d4d2d2") + + _iter = model.append(None, row) + path = model.get_path(_iter) +@@ -823,9 +819,9 @@ + vmlist = self.window.get_widget("vm-list") + + # Handle, name, markup, status, status icon, key/uuid, hint, is conn, +- # is conn connected, is vm, is vm running, color ++ # is conn connected, is vm, is vm running + model = gtk.TreeStore(object, str, str, str, gtk.gdk.Pixbuf, str, str, +- bool, bool, bool, bool, str) ++ bool, bool, bool, bool) + vmlist.set_model(model) + util.tooltip_wrapper(vmlist, ROW_HINT, "set_tooltip_column") + +@@ -834,7 +830,7 @@ + + nameCol = gtk.TreeViewColumn(_("Name")) + nameCol.set_expand(True) +- nameCol.set_spacing(12) ++ nameCol.set_spacing(6) + cpuUsageCol = gtk.TreeViewColumn(_("CPU usage")) + cpuUsageCol.set_min_width(150) + +@@ -853,13 +849,11 @@ + + status_icon = gtk.CellRendererPixbuf() + statusCol.pack_start(status_icon, False) +- statusCol.add_attribute(status_icon, 'cell-background', ROW_COLOR) + statusCol.add_attribute(status_icon, 'pixbuf', ROW_STATUS_ICON) + statusCol.add_attribute(status_icon, 'visible', ROW_IS_VM) + + name_txt = gtk.CellRendererText() + nameCol.pack_start(name_txt, True) +- nameCol.add_attribute(name_txt, 'cell-background', ROW_COLOR) + nameCol.add_attribute(name_txt, 'markup', ROW_MARKUP) + nameCol.set_sort_column_id(VMLIST_SORT_NAME) + +@@ -870,9 +864,7 @@ + cpuUsage_img.set_property("reversed", True) + cpuUsageCol.pack_start(cpuUsage_img, True) + cpuUsageCol.pack_start(cpuUsage_txt, False) +- cpuUsageCol.add_attribute(cpuUsage_img, 'cell-background', ROW_COLOR) + cpuUsageCol.add_attribute(cpuUsage_img, 'visible', ROW_IS_VM) +- cpuUsageCol.add_attribute(cpuUsage_txt, 'cell-background', ROW_COLOR) + cpuUsageCol.add_attribute(cpuUsage_txt, 'visible', ROW_IS_CONN) + cpuUsageCol.set_sort_column_id(VMLIST_SORT_STATS) + self.stats_sparkline = cpuUsage_img diff --git a/virt-manager-0.8.0-stats-logging.patch b/virt-manager-0.8.0-stats-logging.patch new file mode 100644 index 0000000..85addd4 --- /dev/null +++ b/virt-manager-0.8.0-stats-logging.patch @@ -0,0 +1,60 @@ +# HG changeset patch +# User Cole Robinson +# Date 1253131314 14400 +# Node ID 9242a7fe76b16c6505bdd3d3d328ae8f0c56da10 +# Parent 6aa2dc9ada0c43e19680af5b922cd643e35602d0 +Better logging and error avoidance with net/disk stats routines. + +diff -r 6aa2dc9ada0c -r 9242a7fe76b1 src/virtManager/domain.py +--- a/src/virtManager/domain.py Wed Sep 16 16:00:47 2009 -0400 ++++ b/src/virtManager/domain.py Wed Sep 16 16:01:54 2009 -0400 +@@ -337,8 +337,12 @@ + return rx, tx + + for netdev in self.get_network_devices(refresh_if_necc=False): ++ dev = netdev[4] ++ if not dev: ++ continue ++ + try: +- io = self.vm.interfaceStats(netdev[4]) ++ io = self.vm.interfaceStats(dev) + if io: + rx += io[0] + tx += io[4] +@@ -347,7 +351,9 @@ + logging.debug("Net stats not supported: %s" % err) + self._stats_net_supported = False + else: +- logging.error("Error reading net stats: %s" % err) ++ logging.error("Error reading net stats for " ++ "'%s' dev '%s': %s" % ++ (self.get_name(), dev, err)) + return rx, tx + + def _sample_disk_io_dummy(self): +@@ -360,8 +366,12 @@ + return rd, wr + + for disk in self.get_disk_devices(refresh_if_necc=False): ++ dev = disk[2] ++ if not dev: ++ continue ++ + try: +- io = self.vm.blockStats(disk[2]) ++ io = self.vm.blockStats(dev) + if io: + rd += io[1] + wr += io[3] +@@ -370,7 +380,9 @@ + logging.debug("Disk stats not supported: %s" % err) + self._stats_disk_supported = False + else: +- logging.error("Error reading disk stats: %s" % err) ++ logging.error("Error reading disk stats for " ++ "'%s' dev '%s': %s" % ++ (self.get_name(), dev, err)) + return rd, wr + + def _get_cur_rate(self, what): diff --git a/virt-manager.spec b/virt-manager.spec index 5fafe5b..d70a529 100644 --- a/virt-manager.spec +++ b/virt-manager.spec @@ -8,13 +8,16 @@ Name: virt-manager Version: 0.8.0 -Release: 3%{_extra_release} +Release: 4%{_extra_release} Summary: Virtual Machine Manager Group: Applications/Emulators License: GPLv2+ URL: http://virt-manager.org/ Source0: http://virt-manager.org/download/sources/%{name}/%{name}-%{version}.tar.gz +Source1: state_paused.png +Source2: state_running.png +Source3: state_shutoff.png BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch: noarch # Fix disk XML mangling via connect/eject cdrom (bz 516116) @@ -27,6 +30,12 @@ Patch3: %{name}-%{version}-newvm-storage-cb.patch Patch4: %{name}-%{version}-addhw-errmsg-typo.patch # Fixes for pylint script to return nicer results on F11/F12 Patch5: %{name}-%{version}-pylint-tweak.patch +# Don't close libvirt connection for non-fatal errors (bz 522168) +Patch6: /home/boston/crobinso/virt-manager-0.8.0-conn-close-exception.patch +# Manager UI tweaks +Patch7: /home/boston/crobinso/virt-manager-0.8.0-manager-ui-tweaks.patch +# Generate better errors is disk/net stats polling fails +Patch8: /home/boston/crobinso/virt-manager-0.8.0-stats-logging.patch # These two are just the oldest version tested Requires: pygtk2 >= 1.99.12-6 @@ -91,11 +100,17 @@ management API. %prep %setup -q +cp %{SOURCE1} pixmaps +cp %{SOURCE2} pixmaps +cp %{SOURCE3} pixmaps %patch1 -p1 %patch2 -p1 %patch3 -p1 %patch4 -p1 %patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 %build %configure @@ -169,6 +184,11 @@ fi %{_datadir}/dbus-1/services/%{name}.service %changelog +* Thu Sep 17 2009 Cole Robinson - 0.8.0-4.fc12 +- Don't close libvirt connection for non-fatal errors (bz 522168) +- Manager UI tweaks +- Generate better errors if disk/net stats polling fails + * Mon Sep 14 2009 Cole Robinson - 0.8.0-3.fc12 - Fix disk XML mangling via connect/eject cdrom (bz 516116) - Fix delete button sensitivity (bz 518536)