[virt-manager/f15/master] Fix broken cs.po which crashed gettext Fix offline attach fallback if hotplug fails Offer to attach

Cole Robinson crobinso at fedoraproject.org
Thu Apr 7 14:02:14 UTC 2011


commit 1192e5789532a308d963faa162d91892d9d3cbb0
Author: Cole Robinson <crobinso at redhat.com>
Date:   Thu Apr 7 08:58:14 2011 -0400

    Fix broken cs.po which crashed gettext
    Fix offline attach fallback if hotplug fails
    Offer to attach spicevmc if switching to spice

 virt-manager-fix-broken-cspo.patch      |   18 ++
 virt-manager-fix-hotplug-fallback.patch |   20 ++
 virt-manager-spicevmc.patch             |  436 +++++++++++++++++++++++++++++++
 virt-manager.spec                       |   18 ++-
 4 files changed, 490 insertions(+), 2 deletions(-)
---
diff --git a/virt-manager-fix-broken-cspo.patch b/virt-manager-fix-broken-cspo.patch
new file mode 100644
index 0000000..b28ad0b
--- /dev/null
+++ b/virt-manager-fix-broken-cspo.patch
@@ -0,0 +1,18 @@
+commit cb56316cf3702f03b05e30f406ff3028e45f7bfb
+Author: Cole Robinson <crobinso at redhat.com>
+Date:   Tue Apr 5 16:21:42 2011 -0400
+
+    cs.po: Busted Plural-forms crashes python gettext
+
+diff --git a/po/cs.po b/po/cs.po
+index d1808a7..cc13a1b 100644
+--- a/po/cs.po
++++ b/po/cs.po
+@@ -16,7 +16,6 @@ msgstr ""
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
+ "Content-Transfer-Encoding: 8bit\n"
+-"Plural-Forms: \n"
+ 
+ #: ../src/virt-manager.desktop.in.in.h:1
+ msgid "Manage virtual machines"
diff --git a/virt-manager-fix-hotplug-fallback.patch b/virt-manager-fix-hotplug-fallback.patch
new file mode 100644
index 0000000..8ae3f57
--- /dev/null
+++ b/virt-manager-fix-hotplug-fallback.patch
@@ -0,0 +1,20 @@
+commit 4922222c2c7b13704b6f461aedbee9ec06c01b5b
+Author: Cole Robinson <crobinso at redhat.com>
+Date:   Tue Apr 5 16:15:05 2011 -0400
+
+    addhw: Fix nonhotplug to running guest
+
+diff --git a/src/virtManager/addhardware.py b/src/virtManager/addhardware.py
+index 885c8b9..7fa5b6e 100644
+--- a/src/virtManager/addhardware.py
++++ b/src/virtManager/addhardware.py
+@@ -938,7 +938,8 @@ class vmmAddHardware(vmmGObjectUI):
+                   "Would you like to make the device available after the "
+                   "next VM shutdown?")),
+                 dialog_type=gtk.MESSAGE_WARNING,
+-                buttons=gtk.BUTTONS_YES_NO)
++                buttons=gtk.BUTTONS_YES_NO,
++                async=False)
+ 
+             if not res:
+                 return (False, None)
diff --git a/virt-manager-spicevmc.patch b/virt-manager-spicevmc.patch
new file mode 100644
index 0000000..eefaebf
--- /dev/null
+++ b/virt-manager-spicevmc.patch
@@ -0,0 +1,436 @@
+commit 6fa885e5831e637976487e39c877ab3a80325ee8
+Author: Marc-André Lureau <marcandre.lureau at redhat.com>
+Date:   Tue Apr 5 01:35:31 2011 +0200
+
+    addhardware: allow setting the char device target name
+
+diff --git a/src/virtManager/addhardware.py b/src/virtManager/addhardware.py
+index a8ceb78..91ece33 100644
+--- a/src/virtManager/addhardware.py
++++ b/src/virtManager/addhardware.py
+@@ -54,6 +54,7 @@ char_widget_mappings = {
+     "bind_port" : "char-bind-port",
+     "bind_host" : "char-bind-host",
+     "protocol"  : "char-use-telnet",
++    "target_name" : "char-target-name",
+ }
+ 
+ def get_list_selection(widget):
+@@ -117,6 +118,7 @@ class vmmAddHardware(vmmGObjectUI):
+             "char_host_focus_in": (self.update_doc, "source_host"),
+             "char_bind_host_focus_in": (self.update_doc, "bind_host"),
+             "char_telnet_focus_in": (self.update_doc, "protocol"),
++            "char_name_focus_in": (self.update_doc, "target_name"),
+             })
+         util.bind_escape_key_close(self)
+ 
+@@ -443,6 +445,7 @@ class vmmAddHardware(vmmGObjectUI):
+         self.window.get_widget("char-bind-host").set_text("127.0.0.1")
+         self.window.get_widget("char-bind-port").get_adjustment().value = 4556
+         self.window.get_widget("char-use-telnet").set_active(False)
++        self.window.get_widget("char-target-name").set_text("com.redhat.spice.0")
+ 
+         # Hide all notebook pages, so the wizard isn't as big as the largest
+         # page
+@@ -1143,6 +1146,7 @@ class vmmAddHardware(vmmGObjectUI):
+         bind_host = self.window.get_widget("char-bind-host").get_text()
+         source_port = self.window.get_widget("char-port").get_adjustment().value
+         bind_port = self.window.get_widget("char-bind-port").get_adjustment().value
++        target_name = self.window.get_widget("char-target-name").get_text()
+ 
+         if self.window.get_widget("char-use-telnet").get_active():
+             protocol = VirtualCharDevice.CHAR_PROTOCOL_TELNET
+@@ -1156,6 +1160,7 @@ class vmmAddHardware(vmmGObjectUI):
+             "bind_port": bind_port,
+             "bind_host": bind_host,
+             "protocol": protocol,
++            "target_name": target_name,
+         }
+ 
+         try:
+diff --git a/src/vmm-add-hardware.glade b/src/vmm-add-hardware.glade
+index bbd3a42..c5087a1 100644
+--- a/src/vmm-add-hardware.glade
++++ b/src/vmm-add-hardware.glade
+@@ -1504,7 +1504,7 @@ to connect to the virtual machine.</property>
+                                                 <child>
+                                                   <widget class="GtkTable" id="char-param-table">
+                                                     <property name="visible">True</property>
+-                                                    <property name="n_rows">5</property>
++                                                    <property name="n_rows">6</property>
+                                                     <property name="n_columns">2</property>
+                                                     <property name="column_spacing">8</property>
+                                                     <property name="row_spacing">8</property>
+@@ -1520,6 +1520,34 @@ to connect to the virtual machine.</property>
+                                                       </packing>
+                                                     </child>
+                                                     <child>
++                                                      <widget class="GtkEntry" id="char-target-name">
++                                                        <property name="visible">True</property>
++                                                        <property name="can_focus">True</property>
++                                                        <signal name="focus_in_event" handler="char_name_focus_in"/>
++                                                      </widget>
++                                                      <packing>
++                                                        <property name="left_attach">1</property>
++                                                        <property name="right_attach">2</property>
++                                                        <property name="top_attach">5</property>
++                                                        <property name="bottom_attach">6</property>
++                                                      </packing>
++                                                    </child>
++                                                    <child>
++                                                      <widget class="GtkLabel" id="target-name-label">
++                                                        <property name="visible">True</property>
++                                                        <property name="xalign">0</property>
++                                                        <property name="label" translatable="yes">Name:</property>
++                                                        <property name="use_underline">True</property>
++                                                        <property name="mnemonic_widget">char-use-telnet</property>
++                                                      </widget>
++                                                      <packing>
++                                                        <property name="top_attach">5</property>
++                                                        <property name="bottom_attach">6</property>
++                                                        <property name="x_options">GTK_FILL</property>
++                                                        <property name="y_options"></property>
++                                                      </packing>
++                                                    </child>
++                                                    <child>
+                                                       <widget class="GtkCheckButton" id="char-use-telnet">
+                                                         <property name="visible">True</property>
+                                                         <property name="can_focus">True</property>
+commit ce9a125728b6622008849dd9c35309e36104913e
+Author: Marc-André Lureau <marcandre.lureau at redhat.com>
+Date:   Tue Apr 5 01:35:32 2011 +0200
+
+    addhardware: fix adding and removing a channel device
+
+diff --git a/src/virtManager/addhardware.py b/src/virtManager/addhardware.py
+index 91ece33..885c8b9 100644
+--- a/src/virtManager/addhardware.py
++++ b/src/virtManager/addhardware.py
+@@ -286,19 +286,6 @@ class vmmAddHardware(vmmGObjectUI):
+         video_dev = self.window.get_widget("video-model")
+         uihelpers.build_video_combo(self.vm, video_dev)
+ 
+-        # Char device type
+-        char_devtype = self.window.get_widget("char-device-type")
+-        # Type name, desc
+-        char_devtype_model = gtk.ListStore(str, str)
+-        char_devtype.set_model(char_devtype_model)
+-        text = gtk.CellRendererText()
+-        char_devtype.pack_start(text, True)
+-        char_devtype.add_attribute(text, 'text', 1)
+-        for t in VirtualCharDevice.char_types:
+-            desc = VirtualCharDevice.get_char_type_desc(t)
+-            row = [t, desc + " (%s)" % t]
+-            char_devtype_model.append(row)
+-
+         # Character dev mode
+         char_mode = self.window.get_widget("char-mode")
+         # Mode name, desc
+@@ -358,6 +345,10 @@ class vmmAddHardware(vmmGObjectUI):
+                       self.vm.is_hvm(),
+                       _("Not supported for this guest type."),
+                       "parallel")
++        add_hw_option("Channel", gtk.STOCK_CONNECT, PAGE_CHAR,
++                      self.vm.is_hvm(),
++                      _("Not supported for this guest type."),
++                      "channel")
+         add_hw_option("USB Host Device", "system-run", PAGE_HOSTDEV,
+                       self.vm.get_connection().is_nodedev_capable(),
+                       _("Connection does not support host device enumeration"),
+@@ -688,6 +679,23 @@ class vmmAddHardware(vmmGObjectUI):
+     def get_hw_selection(self):
+         return get_list_selection(self.window.get_widget("hardware-list"))
+ 
++    def update_char_device_type_model(self):
++        # Char device type
++        char_devtype = self.window.get_widget("char-device-type")
++        dev_type = self.get_char_type()
++        # Type name, desc
++        char_devtype_model = gtk.ListStore(str, str)
++        char_devtype.clear()
++        char_devtype.set_model(char_devtype_model)
++        text = gtk.CellRendererText()
++        char_devtype.pack_start(text, True)
++        char_devtype.add_attribute(text, 'text', 1)
++        for t in VirtualCharDevice.char_types_for_dev_type[dev_type]:
++            desc = VirtualCharDevice.get_char_type_desc(t)
++            row = [t, desc + " (%s)" % t]
++            char_devtype_model.append(row)
++        char_devtype.set_active(0)
++
+     def hw_selected(self, src=None):
+         ignore = src
+         self._dev = None
+@@ -707,6 +715,7 @@ class vmmAddHardware(vmmGObjectUI):
+             self.window.get_widget("hardware-info").set_text(msg)
+ 
+         if page == PAGE_CHAR:
++            self.update_char_device_type_model()
+             devtype = self.window.get_widget("char-device-type")
+             self.change_char_device_type(devtype)
+ 
+@@ -814,6 +823,8 @@ class vmmAddHardware(vmmGObjectUI):
+ 
+         if label == "parallel":
+             return VirtualDevice.VIRTUAL_DEV_PARALLEL
++        elif label == "channel":
++            return VirtualDevice.VIRTUAL_DEV_CHANNEL
+         return VirtualDevice.VIRTUAL_DEV_SERIAL
+ 
+     def dev_to_title(self, page):
+@@ -849,6 +860,9 @@ class vmmAddHardware(vmmGObjectUI):
+ 
+     def change_char_device_type(self, src):
+         self.update_doc(None, None, "char_type")
++        idx = src.get_active()
++        if idx < 0:
++            return
+ 
+         chartype = self.get_char_type()
+         devtype = src.get_model()[src.get_active()][0]
+@@ -863,7 +877,6 @@ class vmmAddHardware(vmmGObjectUI):
+             self.window.get_widget(widget_name).set_sensitive(make_visible)
+ 
+         has_mode = self._dev.supports_property("source_mode")
+-
+         if has_mode and self.window.get_widget("char-mode").get_active() == -1:
+             self.window.get_widget("char-mode").set_active(0)
+ 
+diff --git a/src/virtManager/details.py b/src/virtManager/details.py
+index 69e2b1a..ca21c2d 100644
+--- a/src/virtManager/details.py
++++ b/src/virtManager/details.py
+@@ -2752,7 +2752,7 @@ class vmmDetails(vmmGObjectUI):
+             port = chardev.target_port
+ 
+             label = devtype.capitalize()
+-            if devtype != "console":
++            if devtype not in ["console", "channel"]:
+                 # Don't show port for console
+                 label += " %s" % (int(port) + 1)
+ 
+diff --git a/src/virtManager/domain.py b/src/virtManager/domain.py
+index 9730233..7fc66ed 100644
+--- a/src/virtManager/domain.py
++++ b/src/virtManager/domain.py
+@@ -46,6 +46,7 @@ def compare_device(origdev, newdev, idx):
+         "console"   : ["char_type", "target_type", "target_port"],
+         "graphics"  : ["type", "vmmindex"],
+         "controller" : ["type", "index"],
++        "channel"   : ["char_type", "target_name"],
+     }
+ 
+     if id(origdev) == id(newdev):
+@@ -713,8 +714,9 @@ class vmmDomainBase(vmmLibvirtObject):
+         serials     = self._build_device_list("serial")
+         parallels   = self._build_device_list("parallel")
+         consoles    = self._build_device_list("console")
++        channels    = self._build_device_list("channel")
+ 
+-        for devicelist in [serials, parallels, consoles]:
++        for devicelist in [serials, parallels, consoles, channels]:
+             devs.extend(devicelist)
+ 
+         # Don't display <console> if it's just a duplicate of <serial>
+commit 127e065d9ee7c5bee0f221352e51fb51ccff1626
+Author: Marc-André Lureau <marcandre.lureau at redhat.com>
+Date:   Tue Apr 5 01:35:33 2011 +0200
+
+    details: show char device target name
+
+diff --git a/src/virtManager/details.py b/src/virtManager/details.py
+index ca21c2d..8e6e50e 100644
+--- a/src/virtManager/details.py
++++ b/src/virtManager/details.py
+@@ -2495,6 +2495,7 @@ class vmmDetails(vmmGObjectUI):
+         target_port = chardev.target_port
+         dev_type = chardev.char_type or "pty"
+         src_path = chardev.source_path
++        target_name = chardev.target_name
+         primary = hasattr(chardev, "virtmanager_console_dup")
+ 
+         typelabel = ""
+@@ -2518,6 +2519,7 @@ class vmmDetails(vmmGObjectUI):
+         self.window.get_widget("char-type").set_markup(typelabel)
+         self.window.get_widget("char-dev-type").set_text(dev_type)
+         self.window.get_widget("char-source-path").set_text(src_path or "-")
++        self.window.get_widget("char-target-name").set_text(target_name or "-")
+ 
+     def refresh_hostdev_page(self):
+         hostdev = self.get_hw_selection(HW_LIST_COL_DEVICE)
+diff --git a/src/vmm-details.glade b/src/vmm-details.glade
+index d0d3837..d23c3da 100644
+--- a/src/vmm-details.glade
++++ b/src/vmm-details.glade
+@@ -4681,7 +4681,7 @@ I/O:</property>
+                                           <widget class="GtkTable" id="table37">
+                                             <property name="visible">True</property>
+                                             <property name="border_width">3</property>
+-                                            <property name="n_rows">2</property>
++                                            <property name="n_rows">3</property>
+                                             <property name="n_columns">2</property>
+                                             <property name="column_spacing">8</property>
+                                             <property name="row_spacing">4</property>
+@@ -4689,7 +4689,7 @@ I/O:</property>
+                                               <widget class="GtkLabel" id="label503">
+                                                 <property name="visible">True</property>
+                                                 <property name="xalign">1</property>
+-                                                <property name="label" translatable="yes">Device Type:</property>
++                                                <property name="label" translatable="yes">Device type:</property>
+                                               </widget>
+                                               <packing>
+                                                 <property name="x_options">GTK_FILL</property>
+@@ -4700,7 +4700,7 @@ I/O:</property>
+                                               <widget class="GtkLabel" id="label505">
+                                                 <property name="visible">True</property>
+                                                 <property name="xalign">1</property>
+-                                                <property name="label" translatable="yes">Source Path:</property>
++                                                <property name="label" translatable="yes">Source path:</property>
+                                               </widget>
+                                               <packing>
+                                                 <property name="top_attach">1</property>
+@@ -4710,6 +4710,19 @@ I/O:</property>
+                                               </packing>
+                                             </child>
+                                             <child>
++                                              <widget class="GtkLabel" id="label505">
++                                                <property name="visible">True</property>
++                                                <property name="xalign">1</property>
++                                                <property name="label" translatable="yes">Target name:</property>
++                                              </widget>
++                                              <packing>
++                                                <property name="top_attach">2</property>
++                                                <property name="bottom_attach">3</property>
++                                                <property name="x_options">GTK_FILL</property>
++                                                <property name="y_options"></property>
++                                              </packing>
++                                            </child>
++                                            <child>
+                                               <widget class="GtkLabel" id="char-dev-type">
+                                                 <property name="visible">True</property>
+                                                 <property name="xalign">0</property>
+@@ -4739,6 +4752,22 @@ I/O:</property>
+                                                 <property name="y_options"></property>
+                                               </packing>
+                                             </child>
++                                            <child>
++                                              <widget class="GtkLabel" id="char-target-name">
++                                                <property name="visible">True</property>
++                                                <property name="xalign">0</property>
++                                                <property name="label" translatable="yes">label508</property>
++                                                <property name="selectable">True</property>
++                                              </widget>
++                                              <packing>
++                                                <property name="left_attach">1</property>
++                                                <property name="right_attach">2</property>
++                                                <property name="top_attach">2</property>
++                                                <property name="bottom_attach">3</property>
++                                                <property name="x_options">GTK_FILL</property>
++                                                <property name="y_options"></property>
++                                              </packing>
++                                            </child>
+                                           </widget>
+                                         </child>
+                                       </widget>
+commit 69ba897ac35731bf6cfca00a3e8ac30485a9855d
+Author: Marc-André Lureau <marcandre.lureau at redhat.com>
+Date:   Tue Apr 5 01:35:34 2011 +0200
+
+    details: propose to add or remove Spice agent when switching
+    
+    crobinso: Improve metric for deciding to ask about add/remove agent
+
+diff --git a/src/virtManager/details.py b/src/virtManager/details.py
+index 8e6e50e..eb5a9e5 100644
+--- a/src/virtManager/details.py
++++ b/src/virtManager/details.py
+@@ -1850,17 +1850,54 @@ class vmmDetails(vmmGObjectUI):
+                                           (dev_id_info, nettype, source)])
+ 
+     # Graphics options
++    def _do_change_spicevmc(self, gdev, newgtype):
++        has_multi_spice = (len(filter(
++                                lambda dev: dev.type == dev.TYPE_SPICE,
++                                self.vm.get_graphics_devices())) > 1)
++        has_spicevmc = bool(filter(
++                            (lambda dev:
++                                (dev.dev_type == dev.DEV_CHANNEL and
++                                 dev.char_type == dev.CHAR_SPICEVMC)),
++                            self.vm.get_char_devices()))
++        fromspice = (gdev.type == "spice")
++        tospice = (newgtype == "spice")
++
++        if fromspice and tospice:
++            return False
++        if not fromspice and not tospice:
++            return False
++
++        print tospice, fromspice, has_spicevmc, has_multi_spice
++
++        if tospice and has_spicevmc:
++            return False
++        if fromspice and not has_spicevmc:
++            return False
++
++        if fromspice and has_multi_spice:
++            # Don't offer to remove if there are other spice displays
++            return False
++
++        msg = (_("You are switching graphics type to %(gtype)s, "
++                 "would you like to %(action)s Spice agent channels?") %
++                {"gtype": newgtype,
++                 "action": fromspice and "remove" or "add"})
++        return self.err.yes_no(msg)
++
+     def config_graphics_apply(self, dev_id_info):
+         gtype = self.get_combo_label_value("gfx-type")
+         passwd = self.window.get_widget("gfx-password").get_text() or None
+         keymap = self.get_combo_label_value("gfx-keymap")
+ 
++        change_spicevmc = self._do_change_spicevmc(dev_id_info, gtype)
++
+         return self._change_config_helper([self.vm.define_graphics_password,
+                                            self.vm.define_graphics_keymap,
+                                            self.vm.define_graphics_type],
+                                           [(dev_id_info, passwd),
+                                            (dev_id_info, keymap),
+-                                           (dev_id_info, gtype)],
++                                           (dev_id_info, gtype,
++                                            change_spicevmc)],
+                                           [self.vm.hotplug_graphics_password],
+                                           [(dev_id_info, passwd)])
+ 
+diff --git a/src/virtManager/domain.py b/src/virtManager/domain.py
+index 7fc66ed..a4d2f5c 100644
+--- a/src/virtManager/domain.py
++++ b/src/virtManager/domain.py
+@@ -26,6 +26,7 @@ import threading
+ import gobject
+ 
+ import virtinst
++from virtinst.VirtualCharDevice import VirtualCharSpicevmcDevice
+ from virtManager import util
+ import virtinst.support as support
+ 
+@@ -450,9 +451,20 @@ class vmmDomainBase(vmmLibvirtObject):
+         def change(editdev):
+             editdev.keymap = newval
+         return self._redefine_device(change, devobj)
+-    def define_graphics_type(self, devobj, newval):
++    def define_graphics_type(self, devobj, newval, spicevmc):
+         def change(editdev):
+             editdev.type = newval
++            if spicevmc:
++                guest = self._get_guest_to_define()
++                if newval == "spice":
++                    guest.add_device(VirtualCharSpicevmcDevice(guest.conn))
++                else:
++                    channels = guest.get_devices("channel")
++                    channels = filter(lambda x: x.char_type ==
++                                      virtinst.VirtualCharDevice.CHAR_SPICEVMC, channels)
++                    for dev in channels:
++                        guest.remove_device(dev)
++
+         return self._redefine_device(change, devobj)
+ 
+     def define_sound_model(self, devobj, newmodel):
diff --git a/virt-manager.spec b/virt-manager.spec
index 0476f6b..be7ad18 100644
--- a/virt-manager.spec
+++ b/virt-manager.spec
@@ -2,8 +2,8 @@
 
 %define _package virt-manager
 %define _version 0.8.7
-%define _release 2
-%define virtinst_version 0.500.6
+%define _release 3
+%define virtinst_version 0.500.6-2
 
 %define qemu_user                  "qemu"
 %define preferred_distros          "fedora,rhel"
@@ -35,6 +35,12 @@ Source0: http://virt-manager.org/download/sources/%{name}/%{name}-%{version}.tar
 Patch1: %{name}-fix-config-options.patch
 # Fix lockup as non-root (bz 692570)
 Patch2: %{name}-gconf-after-fork.patch
+# Fix broken cs.po which crashed gettext
+Patch3: %{name}-fix-broken-cspo.patch
+# Fix offline attach fallback if hotplug fails
+Patch4: %{name}-fix-hotplug-fallback.patch
+# Offer to attach spicevmc if switching to spice
+Patch5: %{name}-spicevmc.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildArch: noarch
 
@@ -101,6 +107,9 @@ management API.
 %setup -q
 %patch1 -p1
 %patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
 
 %build
 %if %{qemu_user}
@@ -209,6 +218,11 @@ fi
 %{_datadir}/dbus-1/services/%{name}.service
 
 %changelog
+* Thu Apr 07 2011 Cole Robinson <crobinso at redhat.com> - 0.8.7-3.fc15
+- Fix broken cs.po which crashed gettext
+- Fix offline attach fallback if hotplug fails
+- Offer to attach spicevmc if switching to spice
+
 * Thu Mar 31 2011 Cole Robinson <crobinso at redhat.com> - 0.8.7-2.fc15
 - Fix using spice as default graphics type
 - Fix lockup as non-root (bz 692570)


More information about the scm-commits mailing list