[fedora-virt-maint] rpms/virt-manager/F-11 virt-manager-0.7.0-czech-typo.patch, NONE, 1.1 virt-manager-0.7.0-fix-memory-interaction.patch, NONE, 1.1 virt-manager-0.7.0-fix-sparse-knob.patch, NONE, 1.1 virt-manager-0.7.0-iso-storage-browser.patch, NONE, 1.1 virt-manager-0.7.0-migrate-fixes.patch, NONE, 1.1 virt-manager-0.7.0-pylint-script.patch, NONE, 1.1 virt-manager-0.7.0-vcpu-mem-persistent.patch, NONE, 1.1 virt-manager.spec, 1.52, 1.53

Cole Robinson crobinso at fedoraproject.org
Fri Sep 18 14:50:46 UTC 2009


Author: crobinso

Update of /cvs/pkgs/rpms/virt-manager/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv18100

Modified Files:
	virt-manager.spec 
Added Files:
	virt-manager-0.7.0-czech-typo.patch 
	virt-manager-0.7.0-fix-memory-interaction.patch 
	virt-manager-0.7.0-fix-sparse-knob.patch 
	virt-manager-0.7.0-iso-storage-browser.patch 
	virt-manager-0.7.0-migrate-fixes.patch 
	virt-manager-0.7.0-pylint-script.patch 
	virt-manager-0.7.0-vcpu-mem-persistent.patch 
Log Message:
Fix migration for qemu/kvm guests (bz 517548)
Fix sparse allocation confusion (bz 504605)
Czech translation typo (bz 504385)
Use storage browser for iso installs (bz 504326)
Fix max/current memory spin button interaction (bz 503786)
Make memory and vcpu changes unconditionally persistent (bz 503784)
Add pylint script


virt-manager-0.7.0-czech-typo.patch:
 cs.po |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- NEW FILE virt-manager-0.7.0-czech-typo.patch ---
diff -rup virt-manager-0.7.0/po/cs.po new/po/cs.po
--- virt-manager-0.7.0/po/cs.po	2009-09-17 15:24:54.852374000 -0400
+++ new/po/cs.po	2009-09-17 15:22:11.927742000 -0400
@@ -1809,7 +1809,7 @@ msgstr "Vyžadován typ hardware"
 
 #: ../src/vmm-add-hardware.glade.h:46
 msgid "Hardware type:"
-msgstr "Tzp hardware"
+msgstr "Typ hardware"
 
 #: ../src/vmm-add-hardware.glade.h:47 ../src/vmm-details.glade.h:44
 msgid "Keymap:"

virt-manager-0.7.0-fix-memory-interaction.patch:
 .vmm-details.glade.rej.swp  |only
 virtManager/details.py      |   69 +++++++++++++++++++++++++++---------------
 virtManager/details.py.orig |   72 ++++++++++++++++++++++++++++++++++----------
 vmm-details.glade           |    9 ++---
 vmm-details.glade.orig      |only
 vmm-details.glade.rej       |only
 6 files changed, 106 insertions(+), 44 deletions(-)

--- NEW FILE virt-manager-0.7.0-fix-memory-interaction.patch ---
diff -rup old/src/virtManager/details.py virt-manager-0.7.0/src/virtManager/details.py
--- old/src/virtManager/details.py	2009-09-17 17:23:42.640307000 -0400
+++ virt-manager-0.7.0/src/virtManager/details.py	2009-09-17 17:24:09.098148000 -0400
@@ -960,11 +960,12 @@ class vmmDetails(gobject.GObject):
         curmem = self.window.get_widget("config-memory").get_adjustment()
         maxmem = self.window.get_widget("config-maxmem").get_adjustment()
 
-
         if self.window.get_widget("config-memory-apply").get_property("sensitive"):
-            if curmem.value > maxmem.value:
-                curmem.value = maxmem.value
-            curmem.upper = maxmem.value
+            memval = self.config_get_memory()
+            maxval = self.config_get_maxmem()
+            if maxval < memval:
+                maxmem.value = memval
+            maxmem.lower = memval
         else:
             curmem.value = int(round(self.vm.get_memory()/1024.0))
             maxmem.value = int(round(self.vm.maximum_memory()/1024.0))
@@ -1504,54 +1505,74 @@ class vmmDetails(gobject.GObject):
         self.vm.set_vcpu_count(vcpus)
         self.window.get_widget("config-vcpus-apply").set_sensitive(False)
 
-    def config_memory_changed(self, src):
-        self.window.get_widget("config-memory-apply").set_sensitive(True)
+    def config_get_maxmem(self):
+        maxadj = self.window.get_widget("config-maxmem").get_adjustment()
+        txtmax = self.window.get_widget("config-maxmem").get_text()
+        try:
+            maxmem = int(txtmax)
+        except:
+            maxmem = maxadj.value
+        return maxmem
+
+    def config_get_memory(self):
+        memadj = self.window.get_widget("config-memory").get_adjustment()
+        txtmem = self.window.get_widget("config-memory").get_text()
+        try:
+            mem = int(txtmem)
+        except:
+            mem = memadj.value
+        return mem
 
     def config_maxmem_changed(self, src):
         self.window.get_widget("config-memory-apply").set_sensitive(True)
-        memory = self.window.get_widget("config-maxmem").get_adjustment().value
-        memadj = self.window.get_widget("config-memory").get_adjustment()
-        memadj.upper = memory
-        if memadj.value > memory:
-            memadj.value = memory
+
+    def config_memory_changed(self, src):
+        self.window.get_widget("config-memory-apply").set_sensitive(True)
+
+        maxadj = self.window.get_widget("config-maxmem").get_adjustment()
+
+        mem = self.config_get_memory()
+        if maxadj.value < mem:
+            maxadj.value = mem
+        maxadj.lower = mem
 
     def config_memory_apply(self, src):
         self.refresh_config_memory()
         exc = None
         curmem = None
-        maxmem = self.window.get_widget("config-maxmem").get_adjustment()
+        maxmem = self.config_get_maxmem()
         if self.window.get_widget("config-memory").get_property("sensitive"):
-            curmem = self.window.get_widget("config-memory").get_adjustment()
+            curmem = self.config_get_memory()
 
-        logging.info("Setting max-memory for " + self.vm.get_name() + \
-                     " to " + str(maxmem.value))
+        logging.info("Setting max-memory for " + self.vm.get_name() +
+                     " to " + str(maxmem))
 
         actual_cur = self.vm.get_memory()
         if curmem is not None:
-            logging.info("Setting memory for " + self.vm.get_name() + \
-                         " to " + str(curmem.value))
-            if (maxmem.value * 1024) < actual_cur:
+            logging.info("Setting memory for " + self.vm.get_name() +
+                         " to " + str(curmem))
+            if (maxmem * 1024) < actual_cur:
                 # Set current first to avoid error
                 try:
-                    self.vm.set_memory(curmem.value * 1024)
-                    self.vm.set_max_memory(maxmem.value * 1024)
+                    self.vm.set_memory(curmem * 1024)
+                    self.vm.set_max_memory(maxmem * 1024)
                 except Exception, e:
                     exc = e
             else:
                 try:
-                    self.vm.set_max_memory(maxmem.value * 1024)
-                    self.vm.set_memory(curmem.value * 1024)
+                    self.vm.set_max_memory(maxmem * 1024)
+                    self.vm.set_memory(curmem * 1024)
                 except Exception, e:
                     exc = e
 
         else:
             try:
-                self.vm.set_max_memory(maxmem.value * 1024)
+                self.vm.set_max_memory(maxmem * 1024)
             except Exception, e:
                 exc = e
 
         if exc:
-            self.err.show_err(_("Error changing memory values: %s" % str(e)),\
+            self.err.show_err(_("Error changing memory values: %s" % str(e)),
                               "".join(traceback.format_exc()))
         else:
             self.window.get_widget("config-memory-apply").set_sensitive(False)
diff -rup old/src/virtManager/details.py.orig virt-manager-0.7.0/src/virtManager/details.py.orig
--- old/src/virtManager/details.py.orig	2009-09-17 17:23:42.778305000 -0400
+++ virt-manager-0.7.0/src/virtManager/details.py.orig	2009-09-17 17:24:08.925149000 -0400
@@ -501,7 +501,7 @@ class vmmDetails(gobject.GObject):
         self.update_scaling()
 
     def auth_login(self, ignore):
-        self.set_password()
+        self.set_credentials()
         self.activate_viewer_page()
 
     def toggle_toolbar(self, src):
@@ -1309,23 +1309,44 @@ class vmmDetails(gobject.GObject):
                      traceback.format_exc (stacktrace))
             logging.error(details)
 
-    def set_password(self, src=None):
-        txt = self.window.get_widget("console-auth-password")
-        self.vncViewer.set_credential(gtkvnc.CREDENTIAL_PASSWORD,
-                                      txt.get_text())
+    def set_credentials(self, src=None):
+        passwd = self.window.get_widget("console-auth-password")
+        if passwd.flags() & gtk.VISIBLE:
+            self.vncViewer.set_credential(gtkvnc.CREDENTIAL_PASSWORD,
+                                          passwd.get_text())
+        username = self.window.get_widget("console-auth-username")
+        if username.flags() & gtk.VISIBLE:
+            self.vncViewer.set_credential(gtkvnc.CREDENTIAL_USERNAME,
+                                          username.get_text())
+
+        if self.window.get_widget("console-auth-remember").get_active():
+            self.config.set_console_password(self.vm, passwd.get_text(), username.get_text())
 
     def _vnc_auth_credential(self, src, credList):
         for i in range(len(credList)):
+            if credList[i] not in (gtkvnc.CREDENTIAL_PASSWORD, gtkvnc.CREDENTIAL_USERNAME, gtkvnc.CREDENTIAL_CLIENTNAME):
+                self.err.show_err(summary=_("Unable to provide requested credentials to the VNC server"),
+                                  details=_("The credential type %s is not supported") % (str(credList[i])),
+                                  title=_("Unable to authenticate"),
+                                  async=True)
+                self.vncViewerRetriesScheduled = 10
+                self.vncViewer.close()
+                self.activate_unavailable_page(_("Unsupported console authentication type"))
+                return
+
+        withUsername = False
+        withPassword = False
+        for i in range(len(credList)):
             logging.debug("Got credential request %s", str(credList[i]))
             if credList[i] == gtkvnc.CREDENTIAL_PASSWORD:
-                self.activate_auth_page()
+                withPassword = True
+            elif credList[i] == gtkvnc.CREDENTIAL_USERNAME:
+                withUsername = True
             elif credList[i] == gtkvnc.CREDENTIAL_CLIENTNAME:
                 self.vncViewer.set_credential(credList[i], "libvirt-vnc")
-            else:
-                # Force it to stop re-trying
-                self.vncViewerRetriesScheduled = 10
-                self.vncViewer.close()
-                self.activate_unavailable_page(_("Unsupported console authentication type"))
+
+        if withUsername or withPassword:
+            self.activate_auth_page(withPassword, withUsername)
 
     def activate_unavailable_page(self, msg):
         self.window.get_widget("console-pages").set_current_page(PAGE_UNAVAILABLE)
@@ -1336,20 +1357,41 @@ class vmmDetails(gobject.GObject):
         self.window.get_widget("console-pages").set_current_page(PAGE_SCREENSHOT)
         self.window.get_widget("details-menu-vm-screenshot").set_sensitive(True)
 
-    def activate_auth_page(self):
-        pw = self.config.get_console_password(self.vm)
+    def activate_auth_page(self, withPassword=True, withUsername=False):
+        (pw, username) = self.config.get_console_password(self.vm)
         self.window.get_widget("details-menu-vm-screenshot").set_sensitive(False)
+
+        if withPassword:
+            self.window.get_widget("console-auth-password").show()
+            self.window.get_widget("label-auth-password").show()
+        else:
+            self.window.get_widget("console-auth-password").hide()
+            self.window.get_widget("label-auth-password").hide()
+
+        if withUsername:
+            self.window.get_widget("console-auth-username").show()
+            self.window.get_widget("label-auth-username").show()
+        else:
+            self.window.get_widget("console-auth-username").hide()
+            self.window.get_widget("label-auth-username").hide()
+
+        self.window.get_widget("console-auth-username").set_text(username)
         self.window.get_widget("console-auth-password").set_text(pw)
-        self.window.get_widget("console-auth-password").grab_focus()
+
         if self.config.has_keyring():
             self.window.get_widget("console-auth-remember").set_sensitive(True)
-            if pw != None and pw != "":
+            if pw != "" or username != "":
                 self.window.get_widget("console-auth-remember").set_active(True)
             else:
                 self.window.get_widget("console-auth-remember").set_active(False)
         else:
             self.window.get_widget("console-auth-remember").set_sensitive(False)
         self.window.get_widget("console-pages").set_current_page(PAGE_AUTHENTICATE)
+        if withUsername:
+            self.window.get_widget("console-auth-username").grab_focus()
+        else:
+            self.window.get_widget("console-auth-password").grab_focus()
+
 
     def activate_viewer_page(self):
         self.window.get_widget("console-pages").set_current_page(PAGE_VNCVIEWER)
diff -rup old/src/vmm-details.glade virt-manager-0.7.0/src/vmm-details.glade
--- old/src/vmm-details.glade	2009-09-17 17:23:42.448302000 -0400
+++ virt-manager-0.7.0/src/vmm-details.glade	2009-09-17 17:25:42.970347000 -0400
@@ -1436,7 +1436,6 @@ I/O:</property>
                               </widget>
                               <packing>
                                 <property name="position">2</property>
-                                <property name="tab_expand">True</property>
                               </packing>
                             </child>
                             <child>
@@ -1572,8 +1571,8 @@ I/O:</property>
                                                       <widget class="GtkSpinButton" id="config-memory">
                                                         <property name="visible">True</property>
                                                         <property name="can_focus">True</property>
-                                                        <property name="adjustment">50 50 32000 5 10 0</property>
-                                                        <property name="climb_rate">1</property>
+                                                        <property name="adjustment">50 50 32000 1 25 0</property>
+                                                        <property name="climb_rate">2</property>
                                                         <property name="numeric">True</property>
                                                         <property name="update_policy">GTK_UPDATE_IF_VALID</property>
                                                         <accessibility>
@@ -1610,8 +1609,8 @@ I/O:</property>
                                                       <widget class="GtkSpinButton" id="config-maxmem">
                                                         <property name="visible">True</property>
                                                         <property name="can_focus">True</property>
-                                                        <property name="adjustment">50 50 32000 5 10 0</property>
-                                                        <property name="climb_rate">1</property>
+                                                        <property name="adjustment">50 50 32000 1 25 0</property>
+                                                        <property name="climb_rate">2</property>
                                                         <property name="numeric">True</property>
                                                         <property name="update_policy">GTK_UPDATE_IF_VALID</property>
                                                         <accessibility>
Only in virt-manager-0.7.0/src: vmm-details.glade.orig
Only in virt-manager-0.7.0/src: vmm-details.glade.rej
Only in virt-manager-0.7.0/src: .vmm-details.glade.rej.swp

virt-manager-0.7.0-fix-sparse-knob.patch:
 create.py |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- NEW FILE virt-manager-0.7.0-fix-sparse-knob.patch ---
# HG changeset patch
# User Cole Robinson <crobinso at redhat.com>
# Date 1245180678 14400
# Node ID bd26943d4dadf3be993c44ff8401c6426fd94488
# Parent  f9ad1d0c29d08bbb0ed94df9878d666904d018a2
Correctly handle non sparse request in VM wizard. (Mark McLoughlin)

We currently have it backwards, so a sparse request actually asks for
nonsparse. We didn't see this much, since until recently virtinst wasn't
allowing nonsparse volume allocation.

diff -r f9ad1d0c29d0 -r bd26943d4dad src/virtManager/create.py
--- a/src/virtManager/create.py	Thu Jun 04 16:28:40 2009 -0400
+++ b/src/virtManager/create.py	Tue Jun 16 15:31:18 2009 -0400
@@ -820,14 +820,14 @@
     def get_storage_info(self):
         path = None
         size = self.window.get_widget("config-storage-size").get_value()
-        nosparse = self.window.get_widget("config-storage-nosparse").get_active()
+        sparse = not self.window.get_widget("config-storage-nosparse").get_active()
         if self.window.get_widget("config-storage-create").get_active():
             path = self.get_default_path(self.guest.name)
             logging.debug("Default storage path is: %s" % path)
         else:
             path = self.window.get_widget("config-storage-entry").get_text()
 
-        return (path, size, nosparse)
+        return (path, size, sparse)
 
     def get_default_path(self, name):
         path = ""

virt-manager-0.7.0-iso-storage-browser.patch:
 .create.py.rej.swp |only
 choosecd.py        |   25 +++++++++++++++++--------
 create.py          |   44 +++++++++++++++++---------------------------
 create.py.orig     |    4 ++--
 create.py.rej      |only
 storagebrowse.py   |    6 ++++++
 6 files changed, 42 insertions(+), 37 deletions(-)

--- NEW FILE virt-manager-0.7.0-iso-storage-browser.patch ---
diff -rup old/src/virtManager/choosecd.py virt-manager-0.7.0/src/virtManager/choosecd.py
--- old/src/virtManager/choosecd.py	2009-09-17 17:12:16.317469000 -0400
+++ virt-manager-0.7.0/src/virtManager/choosecd.py	2009-09-17 17:12:26.626644000 -0400
@@ -23,8 +23,8 @@ import logging
 
 import virtinst
 
-from virtManager import util
 from virtManager.opticalhelper import vmmOpticalDriveHelper
+from virtManager.storagebrowse import vmmStorageBrowser
 from virtManager.error import vmmErrorDialog
 
 class vmmChooseCD(gobject.GObject):
@@ -39,10 +39,13 @@ class vmmChooseCD(gobject.GObject):
                                   0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
                                   _("Unexpected Error"),
                                   _("An unexpected error occurred"))
+        self.topwin = self.window.get_widget("vmm-choose-cd")
+        self.topwin.hide()
+
         self.config = config
-        self.window.get_widget("vmm-choose-cd").hide()
         self.dev_id_info = dev_id_info
         self.conn = connection
+        self.storage_browser = None
 
         self.window.signal_autoconnect({
             "on_media_toggled": self.media_toggled,
@@ -130,9 +133,7 @@ class vmmChooseCD(gobject.GObject):
         pass
 
     def browse_fv_iso_location(self, ignore1=None, ignore2=None):
-        filename = self._browse_file(_("Locate ISO Image"))
-        if filename != None:
-            self.window.get_widget("iso-path").set_text(filename)
+        self._browse_file(_("Locate ISO Image"))
 
     def populate_opt_media(self):
         try:
@@ -143,9 +144,17 @@ class vmmChooseCD(gobject.GObject):
             logging.error("Unable to create optical-helper widget: '%s'", e)
             self.window.get_widget("physical-media").set_sensitive(False)
 
-    def _browse_file(self, dialog_name, folder=None, _type=None):
-        return util.browse_local(self.window.get_widget("vmm-choose-cd"),
-                                 dialog_name, folder, _type)
+    def set_storage_path(self, src, path):
+        self.window.get_widget("iso-path").set_text(path)
 
+    def _browse_file(self, dialog_name):
+        if self.storage_browser == None:
+            self.storage_browser = vmmStorageBrowser(self.config, self.conn)
+                                                     #self.topwin)
+            self.storage_browser.connect("storage-browse-finish",
+                                         self.set_storage_path)
+        self.storage_browser.local_args = { "dialog_name": dialog_name }
+        self.storage_browser.show(self.conn)
+        return None
 
 gobject.type_register(vmmChooseCD)
diff -rup old/src/virtManager/create.py virt-manager-0.7.0/src/virtManager/create.py
--- old/src/virtManager/create.py	2009-09-17 17:12:16.371469000 -0400
+++ virt-manager-0.7.0/src/virtManager/create.py	2009-09-17 17:14:56.395189000 -0400
@@ -997,18 +997,16 @@ class vmmCreate(gobject.GObject):
             nodetect_label.show()
 
     def browse_iso(self, ignore1=None, ignore2=None):
-        f = self._browse_file(_("Locate ISO Image"), is_media=True)
-        if f != None:
-            self.window.get_widget("install-local-entry").set_text(f)
+        self._browse_file(_("Locate ISO Image"),
+                          self.set_iso_storage_path)
         self.window.get_widget("install-local-entry").activate()
 
     def toggle_enable_storage(self, src):
         self.window.get_widget("config-storage-box").set_sensitive(src.get_active())
 
     def browse_storage(self, ignore1):
-        f = self._browse_file(_("Locate existing storage"))
-        if f != None:
-            self.window.get_widget("config-storage-entry").set_text(f)
+        self._browse_file(_("Locate existing storage"),
+                          self.set_disk_storage_path)
 
     def toggle_storage_select(self, src):
         act = src.get_active()
@@ -1017,13 +1015,11 @@ class vmmCreate(gobject.GObject):
     def toggle_macaddr(self, src):
         self.window.get_widget("config-macaddr").set_sensitive(src.get_active())
 
-    def set_storage_path(self, src, path):
-        notebook = self.window.get_widget("create-pages")
-        curpage = notebook.get_current_page()
-        if curpage == PAGE_INSTALL:
-            self.window.get_widget("install-local-entry").set_text(path)
-        elif curpage == PAGE_STORAGE:
-            self.window.get_widget("config-storage-entry").set_text(path)
+    def set_iso_storage_path(self, ignore, path):
+        self.window.get_widget("install-local-entry").set_text(path)
+
+    def set_disk_storage_path(self, ignore, path):
+        self.window.get_widget("config-storage-entry").set_text(path)
 
     # Navigation methods
     def set_install_page(self):
@@ -1655,20 +1651,14 @@ class vmmCreate(gobject.GObject):
             logging.exception("Error detecting distro.")
             self.detectedDistro = (None, None)
 
-    def _browse_file(self, dialog_name, folder=None, is_media=False):
-
-        if self.conn.is_remote() or not is_media:
-            if self.storage_browser == None:
-                self.storage_browser = vmmStorageBrowser(self.config,
-                                                         self.conn)
-                self.storage_browser.connect("storage-browse-finish",
-                                             self.set_storage_path)
-            self.storage_browser.local_args = { "dialog_name": dialog_name,
-                                                "start_folder": folder}
-            self.storage_browser.show(self.conn)
-            return None
-
-        return util.browse_local(self.topwin, dialog_name, folder)
+    def _browse_file(self, dialog_name, callback, folder=None):
+        if self.storage_browser == None:
+            self.storage_browser = vmmStorageBrowser(self.config, self.conn)
+
+        self.storage_browser.set_finish_cb(callback)
+        self.storage_browser.local_args = { "dialog_name": dialog_name,
+                                            "start_folder": folder}
+        self.storage_browser.show(self.conn)
 
     def show_help(self, ignore):
         # No help available yet.
diff -rup old/src/virtManager/create.py.orig virt-manager-0.7.0/src/virtManager/create.py.orig
--- old/src/virtManager/create.py.orig	2009-09-17 17:12:16.548472000 -0400
+++ virt-manager-0.7.0/src/virtManager/create.py.orig	2009-09-17 17:12:26.597639000 -0400
@@ -822,14 +822,14 @@ class vmmCreate(gobject.GObject):
     def get_storage_info(self):
         path = None
         size = self.window.get_widget("config-storage-size").get_value()
-        nosparse = self.window.get_widget("config-storage-nosparse").get_active()
+        sparse = not self.window.get_widget("config-storage-nosparse").get_active()
         if self.window.get_widget("config-storage-create").get_active():
             path = self.get_default_path(self.guest.name)
             logging.debug("Default storage path is: %s" % path)
         else:
             path = self.window.get_widget("config-storage-entry").get_text()
 
-        return (path, size, nosparse)
+        return (path, size, sparse)
 
     def get_default_path(self, name):
         path = ""
Only in virt-manager-0.7.0/src/virtManager: create.py.rej
Only in virt-manager-0.7.0/src/virtManager: .create.py.rej.swp
diff -rup old/src/virtManager/storagebrowse.py virt-manager-0.7.0/src/virtManager/storagebrowse.py
--- old/src/virtManager/storagebrowse.py	2009-09-17 17:12:16.503470000 -0400
+++ virt-manager-0.7.0/src/virtManager/storagebrowse.py	2009-09-17 17:12:26.650639000 -0400
@@ -47,6 +47,7 @@ class vmmStorageBrowser(gobject.GObject)
         self.config = config
         self.conn = conn
         self.conn_signal_ids = []
+        self.finish_cb_id = None
 
         self.topwin = self.window.get_widget("vmm-storage-browse")
         self.err = vmmErrorDialog(self.topwin,
@@ -83,6 +84,11 @@ class vmmStorageBrowser(gobject.GObject)
             self.addvol.close()
         return 1
 
+    def set_finish_cb(self, callback):
+        if self.finish_cb_id:
+            self.disconnect(self.finish_cb_id)
+        self.finish_cb_id = self.connect("storage-browse-finish", callback)
+
     def set_initial_state(self):
         pool_list = self.window.get_widget("pool-list")
         virtManager.host.init_pool_list(pool_list, self.pool_selected)

virt-manager-0.7.0-migrate-fixes.patch:
 domain.py |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

--- NEW FILE virt-manager-0.7.0-migrate-fixes.patch ---
# HG changeset patch
# User Cole Robinson <crobinso at redhat.com>
# Date 1236630113 14400
# Node ID 6126a50801deafa155b17b66cfc3008ffe584b24
# Parent  3f37d0519b1750666e88e7eaef8d5dfaafc34237
Fix conn uri lookup for domain migration.

diff -rup virt-manager-0.6.1/src/virtManager/domain.py new/src/virtManager/domain.py
--- virt-manager-0.6.1/src/virtManager/domain.py	2009-09-13 20:25:12.000000000 -0400
+++ new/src/virtManager/domain.py	2009-09-13 20:24:29.000000000 -0400
@@ -1293,11 +1293,15 @@ class vmmDomain(gobject.GObject):
         else:
             self._disk_io = self._sample_disk_io_dummy
 
-
-    def migrate(self, dictcon):
+    def migrate(self, destconn):
         flags = 0
         if self.lastStatus == libvirt.VIR_DOMAIN_RUNNING:
             flags = libvirt.VIR_MIGRATE_LIVE
-        self.vm.migrate(self.connection.vmm, flags, None, dictcon.get_short_hostname(), 0)
+
+        newxml = self.get_xml()
+
+        self.vm.migrate(destconn.vmm, flags, None, None, 0)
+
+        destconn.define_domain(newxml)
 
 gobject.type_register(vmmDomain)

virt-manager-0.7.0-pylint-script.patch:
 Makefile.am                  |    2 
 tests/Makefile.am            |    4 +
 tests/pylint-virt-manager.sh |  115 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 120 insertions(+), 1 deletion(-)

--- NEW FILE virt-manager-0.7.0-pylint-script.patch ---
diff -rupN virt-manager-0.6.1/tests/Makefile.am new/tests/Makefile.am
--- virt-manager-0.6.1/tests/Makefile.am	1969-12-31 19:00:00.000000000 -0500
+++ new/tests/Makefile.am	2009-03-18 13:05:51.516847000 -0400
@@ -0,0 +1,4 @@
+testsdir = $(pkgdatadir)/tests
+tests_DATA = $(wildcard $(srcdir)/*.sh)
+
+EXTRA_DIST = $(tests_DATA)
diff -rupN virt-manager-0.6.1/tests/pylint-virt-manager.sh new/tests/pylint-virt-manager.sh
--- virt-manager-0.6.1/tests/pylint-virt-manager.sh	1969-12-31 19:00:00.000000000 -0500
+++ new/tests/pylint-virt-manager.sh	2009-03-18 13:05:51.513848000 -0400
@@ -0,0 +1,115 @@
+#!/bin/sh
+
+# pylint doesn't work well with a file named xxx.py.xxx
+cp src/virt-manager.py.in src/_virt-manager
+
+cd src || exit 1
+
+IGNOREFILES="IPy.py"
+FILES="virtManager/ _virt-manager"
+
+# Deliberately ignored warnings:
+# Don't print pylint config warning
+NO_PYL_CONFIG=".*No config file found.*"
+
+# The gettext function is installed in the builtin namespace
+GETTEXT_VAR="Undefined variable '_'"
+
+# These all work fine and are legit, just false positives
+GOBJECT_VAR="has no '__gobject_init__' member"
+EMIT_VAR="has no 'emit' member"
+ERROR_VBOX="vmmErrorDialog.__init__.*Class 'vbox' has no 'pack_start' member"
+EXCEPTHOOK="no '__excepthook__' member"
+CONNECT_VAR="no 'connect' member"
+DISCONNECT_VAR="no 'disconnect' member"
+
+# os._exit is needed for forked processes.
+OS_EXIT="protected member _exit of a client class"
+
+# Avahi API may have requirements on callback argument names, so ignore these
+# warnings
+BTYPE_LIST="(vmmConnect.add_service|vmmConnect.remove_service|vmmConnect.add_conn_to_list)"
+BUILTIN_TYPE="${BTYPE_LIST}.*Redefining built-in 'type'"
+
+
+DMSG=""
+addmsg() {
+    DMSG="${DMSG},$1"
+}
+
+addchecker() {
+    DCHECKERS="${DCHECKERS},$1"
+}
+
+# Disabled unwanted messages
+addmsg "C0103"      # C0103: Name doesn't match some style regex
+addmsg "C0111"      # C0111: No docstring
+addmsg "C0301"      # C0301: Line too long
+addmsg "C0302"      # C0302: Too many lines in module
+addmsg "C0324"      # C0324: *Comma not followed by a space*
+addmsg "R0201"      # R0201: Method could be a function
+addmsg "W0105"      # W0105: String statement has no effect
+addmsg "W0141"      # W0141: Complaining about 'map' and 'filter'
+addmsg "W0142"      # W0142: *Used * or ** magic*
+addmsg "W0403"      # W0403: Relative imports
+addmsg "W0603"      # W0603: Using the global statement
+addmsg "W0702"      # W0703: No exception type specified
+addmsg "W0703"      # W0703: Catch 'Exception'
+addmsg "W0704"      # W0704: Exception doesn't do anything
+
+# Potentially useful messages, disabled for now
+addmsg "C0322"      # C0322: *Operator not preceded by a space*
+addmsg "C0323"      # C0323: *Operator not followed by a space*
+addmsg "W0201"      # W0201: Defined outside __init__
+addmsg "W0511"      # W0511: FIXME and XXX: messages
+addmsg "W0613"      # W0613: Unused arguments
+
+# Disabled Checkers:
+addchecker "Design"         # Things like "Too many func arguments",
+                            #             "Too man public methods"
+addchecker "Similarities"   # Finds duplicate code (enable this later?)
+
+# May want to enable this in the future
+SHOW_REPORT="n"
+
+AWK=awk
+[ `uname -s` = 'SunOS' ] && AWK=nawk
+
+pylint --ignore=IPy.py $FILES \
+  --reports=$SHOW_REPORT \
+  --output-format=colorized \
+  --dummy-variables-rgx="dummy|ignore*" \
+  --disable-msg=${DMSG}\
+  --disable-checker=${DCHECKERS} 2>&1 | \
+  egrep -ve "$NO_PYL_CONFIG" \
+        -ve "$GOBJECT_VAR" \
+        -ve "$EMIT_VAR" \
+        -ve "$CONNECT_VAR" \
+        -ve "$DISCONNECT_VAR" \
+        -ve "$GETTEXT_VAR" \
+        -ve "$OS_EXIT" \
+        -ve "$BUILTIN_TYPE" \
+        -ve "$ERROR_VBOX" \
+        -ve "$EXCEPTHOOK" | \
+$AWK '\
+# Strip out any "*** Module name" lines if we dont list any errors for them
+BEGIN { found=0; cur_line="" }
+{
+    if (found == 1) {
+        if ( /\*\*\*/ ) {
+            prev_line = $0
+        } else {
+            print prev_line
+            print $0
+            found = 0
+        }
+    } else if ( /\*\*\*/ ) {
+        found = 1
+        prev_line = $0
+    } else {
+        print $0
+    }
+}'
+
+cd - > /dev/null
+rm src/_virt-manager
diff -rup virt-manager-0.6.1/Makefile.am new/Makefile.am
--- virt-manager-0.6.1/Makefile.am	2009-01-26 14:33:33.000000000 -0500
+++ new/Makefile.am	2009-03-18 13:25:07.912999000 -0400
@@ -11,4 +11,4 @@ rpm: clean
 	$(MAKE) dist && rpmbuild -ta $(distdir).tar.gz
 
 check-pylint:
-	tests/pylint-virt-manager.sh
+	sh tests/pylint-virt-manager.sh

virt-manager-0.7.0-vcpu-mem-persistent.patch:
 old/src/virtManager/create.py.orig            |only
 old/src/virtManager/delete.py.orig            |only
 old/src/virtManager/details.py.orig           |only
 old/src/virtManager/domain.py.orig            |only
 src/virtManager/util.py                       |    1 
 virt-manager-0.7.0/src/virtManager/details.py |   74 ++++++++-----
 virt-manager-0.7.0/src/virtManager/domain.py  |  138 +++++++++++++++++++++-----
 virt-manager-0.7.0/src/virtManager/util.py    |   20 +++
 8 files changed, 178 insertions(+), 55 deletions(-)

--- NEW FILE virt-manager-0.7.0-vcpu-mem-persistent.patch ---
Only in old/src/virtManager: create.py.orig
Only in old/src/virtManager: delete.py.orig
diff -rup old/src/virtManager/details.py virt-manager-0.7.0/src/virtManager/details.py
--- old/src/virtManager/details.py	2009-09-17 17:31:58.267831000 -0400
+++ virt-manager-0.7.0/src/virtManager/details.py	2009-09-17 17:45:36.638881000 -0400
@@ -1502,7 +1502,27 @@ class vmmDetails(gobject.GObject):
     def config_vcpus_apply(self, src):
         vcpus = self.window.get_widget("config-vcpus").get_adjustment().value
         logging.info("Setting vcpus for " + self.vm.get_uuid() + " to " + str(vcpus))
-        self.vm.set_vcpu_count(vcpus)
+        hotplug_err = False
+
+        try:
+            if self.vm.is_active():
+                self.vm.hotplug_vcpus(vcpus)
+        except Exception, e:
+            logging.debug("VCPU hotplug failed: %s" % str(e))
+            hotplug_err = True
+
+        # Change persistent config
+        try:
+            self.vm.define_vcpus(vcpus)
+        except Exception, e:
+            self.err.show_err(_("Error changing vcpu value: %s" % str(e)),
+                              "".join(traceback.format_exc()))
+            return False
+
+        if hotplug_err:
+            self.err.show_info(_("These changes will take effect after the "
+                                 "next guest reboot. "))
+
         self.window.get_widget("config-vcpus-apply").set_sensitive(False)
 
     def config_get_maxmem(self):
@@ -1538,44 +1558,38 @@ class vmmDetails(gobject.GObject):
 
     def config_memory_apply(self, src):
         self.refresh_config_memory()
-        exc = None
+        hotplug_err = False
+
         curmem = None
         maxmem = self.config_get_maxmem()
         if self.window.get_widget("config-memory").get_property("sensitive"):
             curmem = self.config_get_memory()
 
-        logging.info("Setting max-memory for " + self.vm.get_name() +
-                     " to " + str(maxmem))
-
-        actual_cur = self.vm.get_memory()
-        if curmem is not None:
-            logging.info("Setting memory for " + self.vm.get_name() +
-                         " to " + str(curmem))
-            if (maxmem * 1024) < actual_cur:
-                # Set current first to avoid error
-                try:
-                    self.vm.set_memory(curmem * 1024)
-                    self.vm.set_max_memory(maxmem * 1024)
-                except Exception, e:
-                    exc = e
-            else:
-                try:
-                    self.vm.set_max_memory(maxmem * 1024)
-                    self.vm.set_memory(curmem * 1024)
-                except Exception, e:
-                    exc = e
+        if curmem:
+            curmem = int(curmem) * 1024
+        if maxmem:
+            maxmem = int(maxmem) * 1024
 
-        else:
-            try:
-                self.vm.set_max_memory(maxmem * 1024)
-            except Exception, e:
-                exc = e
+        try:
+            if self.vm.is_active():
+                self.vm.hotplug_both_mem(curmem, maxmem)
+        except Exception, e:
+            logging.debug("Memory hotplug failed: %s" % str(e))
+            hotplug_err = True
 
-        if exc:
+        # Change persistent config
+        try:
+            self.vm.define_both_mem(curmem, maxmem)
+        except Exception, e:
             self.err.show_err(_("Error changing memory values: %s" % str(e)),
                               "".join(traceback.format_exc()))
-        else:
-            self.window.get_widget("config-memory-apply").set_sensitive(False)
+            return
+
+        if hotplug_err:
+            self.err.show_info(_("These changes will take effect after the "
+                                 "next guest reboot. "))
+
+        self.window.get_widget("config-memory-apply").set_sensitive(False)
 
     def config_boot_options_changed(self, src):
         self.window.get_widget("config-boot-options-apply").set_sensitive(True)
Only in old/src/virtManager: details.py.orig
diff -rup old/src/virtManager/domain.py virt-manager-0.7.0/src/virtManager/domain.py
--- old/src/virtManager/domain.py	2009-09-17 17:31:58.276831000 -0400
+++ virt-manager-0.7.0/src/virtManager/domain.py	2009-09-17 17:47:15.693255000 -0400
@@ -23,6 +23,7 @@ import libvirt
 import libxml2
 import os
 import logging
+import difflib
 
 from virtManager import util
 import virtinst.util as vutil
@@ -113,6 +114,16 @@ class vmmDomain(gobject.GObject):
             self.refresh_inactive_xml()
         return self._orig_inactive_xml
 
+    def get_xml_to_define(self):
+        # FIXME: This isn't sufficient, since we pull stuff like disk targets
+        #        from the active XML. This all needs proper fixing in the long
+        #        term.
+        if self.is_active():
+            return self.get_inactive_xml()
+        else:
+            self.update_xml()
+            return self.get_xml()
+
     def refresh_inactive_xml(self):
         flags = (libvirt.VIR_DOMAIN_XML_INACTIVE |
                  libvirt.VIR_DOMAIN_XML_SECURE)
@@ -124,6 +135,36 @@ class vmmDomain(gobject.GObject):
 
         self._orig_inactive_xml = self.vm.XMLDesc(flags)
 
+    def redefine(self, xml_func, *args):
+        """
+        Helper function for altering a redefining VM xml
+
+        @param xml_func: Function to alter the running XML. Takes the
+                         original XML as its first argument.
+        @param args: Extra arguments to pass to xml_func
+        """
+        origxml = self.get_xml_to_define()
+        # Sanitize origxml to be similar to what we will get back
+        origxml = util.xml_parse_wrapper(origxml, lambda d, c: d.serialize())
+
+        newxml = xml_func(origxml, *args)
+
+        if origxml == newxml:
+            logging.debug("Redefinition requested, but new xml was not"
+                          " different")
+            return
+
+        diff = "".join(difflib.unified_diff(origxml.splitlines(1),
+                                            newxml.splitlines(1),
+                                            fromfile="Original XML",
+                                            tofile="New XML"))
+        logging.debug("Redefining '%s' with XML diff:\n%s",
+                      self.get_name(), diff)
+        self.get_connection().define_domain(newxml)
+
+        # Invalidate cached XML
+        self.invalidate_xml()
+
     def release_handle(self):
         del(self.vm)
         self.vm = None
@@ -1126,16 +1167,6 @@ class vmmDomain(gobject.GObject):
             if doc != None:
                 doc.freeDoc()
 
-    def get_xml_to_define(self):
-        # FIXME: This isn't sufficient, since we pull stuff like disk targets
-        #        from the active XML. This all needs proper fixing in the long
-        #        term.
-        if self.is_active():
-            return self.get_inactive_xml()
-        else:
-            self.update_xml()
-            return self.get_xml()
-
     def attach_device(self, xml):
         """Hotplug device to running guest"""
         if self.is_active():
@@ -1232,23 +1263,80 @@ class vmmDomain(gobject.GObject):
                 doc.freeDoc()
         self._change_cdrom(result, dev_id_info)
 
-    def set_vcpu_count(self, vcpus):
+    def hotplug_vcpu(self, vcpus):
+        self.vm.setVcpus()
+
+    def hotplug_vcpus(self, vcpus):
         vcpus = int(vcpus)
-        self.vm.setVcpus(vcpus)
+        if vcpus != self.vcpu_count():
+            self.vm.setVcpus(vcpus)
+
+    def define_vcpus(self, vcpus):
+        vcpus = int(vcpus)
+
+        def set_node(doc, ctx, val, xpath):
+            node = ctx.xpathEval(xpath)
+            node = (node and node[0] or None)
+
+            if node:
+                node.setContent(str(val))
+            return doc.serialize()
+
+        def change_vcpu_xml(xml, vcpus):
+            return util.xml_parse_wrapper(xml, set_node, vcpus,
+                                          "/domain/vcpu[1]")
+
+        self.redefine(change_vcpu_xml, vcpus)
+
+    def hotplug_memory(self, memory):
+        if memory != self.get_memory():
+            self.vm.setMemory(memory)
+
+    def hotplug_maxmem(self, maxmem):
+        if maxmem != self.maximum_memory():
+            self.vm.setMaxMemory(maxmem)
+
+    def hotplug_both_mem(self, memory, maxmem):
+        logging.info("Hotplugging curmem=%s maxmem=%s for VM '%s'" %
+                     (memory, maxmem, self.get_name()))
+
+        if self.is_active():
+            actual_cur = self.get_memory()
+            if memory:
+                if maxmem < actual_cur:
+                    # Set current first to avoid error
+                    self.hotplug_memory(memory)
+                    self.hotplug_maxmem(maxmem)
+                else:
+                    self.hotplug_maxmem(maxmem)
+                    self.hotplug_memory(memory)
+            else:
+                self.hotplug_maxmem(maxmem)
+
+    def define_both_mem(self, memory, maxmem):
+        # Make sure we correctly define the XML with new values, since
+        # setMem and setMaxMem don't (or, aren't supposed to) affect
+        # the persistent config
+        self.invalidate_xml()
+
+        def set_mem_node(doc, ctx, memval, xpath):
+            node = ctx.xpathEval(xpath)
+            node = (node and node[0] or None)
+
+            if node:
+                node.setContent(str(memval))
+            return doc.serialize()
+
+        def change_mem_xml(xml, memory, maxmem):
+            if memory:
+                xml = util.xml_parse_wrapper(xml, set_mem_node, memory,
+                                             "/domain/currentMemory[1]")
+            if maxmem:
+                xml = util.xml_parse_wrapper(xml, set_mem_node, maxmem,
+                                             "/domain/memory[1]")
+            return xml
 
-    def set_memory(self, memory):
-        memory = int(memory)
-        # capture updated information due to failing to get proper maxmem setting
-        # if both current & max allocation are set simultaneously
-        maxmem = self.vm.info()
-        if (memory > maxmem[1]):
-            logging.warning("Requested memory " + str(memory) + " over maximum " + str(self.maximum_memory()))
-            memory = self.maximum_memory()
-        self.vm.setMemory(memory)
-
-    def set_max_memory(self, memory):
-        memory = int(memory)
-        self.vm.setMaxMemory(memory)
+        self.redefine(change_mem_xml, memory, maxmem)
 
     def get_autostart(self):
         return self.vm.autostart()
Only in old/src/virtManager: domain.py.orig
diff -rup old/src/virtManager/util.py virt-manager-0.7.0/src/virtManager/util.py
--- old/src/virtManager/util.py	2009-09-17 17:52:15.948670000 -0400
+++ virt-manager-0.7.0/src/virtManager/util.py	2009-09-17 17:52:58.963375000 -0400
@@ -140,3 +140,23 @@ def dup_conn(config, conn, libconn=None)
     newconn.connectThreadEvent.wait()
 
     return newconn.vmm
+
+def xml_parse_wrapper(xml, parse_func, *args, **kwargs):
+    """
+    Parse the passed xml string into an xpath context, which is passed
+    to parse_func, along with any extra arguments.
+    """
+
+    doc = None
+    ctx = None
+    ret = None
+    try:
+        doc = libxml2.parseDoc(xml)
+        ctx = doc.xpathNewContext()
+        ret = parse_func(doc, ctx, *args, **kwargs)
+    finally:
+        if ctx != None:
+            ctx.xpathFreeContext()
+        if doc != None:
+            doc.freeDoc()
+    return ret
diff -rup old/src/virtManager/util.py virt-manager-0.7.0/src/virtManager/util.py
--- old/src/virtManager/util.py	2009-09-17 17:55:17.930744000 -0400
+++ virt-manager-0.7.0/src/virtManager/util.py	2009-09-17 17:55:31.355655000 -0400
@@ -21,6 +21,7 @@
 import logging
 import gtk
 
+import libxml2
 import libvirt
 
 import virtManager


Index: virt-manager.spec
===================================================================
RCS file: /cvs/pkgs/rpms/virt-manager/F-11/virt-manager.spec,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -p -r1.52 -r1.53
--- virt-manager.spec	21 May 2009 14:58:14 -0000	1.52
+++ virt-manager.spec	18 Sep 2009 14:50:44 -0000	1.53
@@ -8,7 +8,7 @@
 
 Name: virt-manager
 Version: 0.7.0
-Release: 5%{_extra_release}
+Release: 6%{_extra_release}
 Summary: Virtual Machine Manager
 
 Group: Applications/Emulators
@@ -27,6 +27,20 @@ Patch9: %{name}-%{version}-fix-window-re
 Patch10: %{name}-%{version}-vnc-auth-get-username.patch
 Patch11: %{name}-%{version}-handle-arch-config.patch
 Patch12: %{name}-%{version}-log-capabilities-at-startup.patch
+# Fix migration for qemu/kvm guests (bz 517548)
+Patch13: %{name}-%{version}-migrate-fixes.patch
+# Fix sparse allocation confusion (bz 504605)
+Patch14: %{name}-%{version}-fix-sparse-knob.patch
+# Czech translation typo (bz 504385)
+Patch15: %{name}-%{version}-czech-typo.patch
+# Use storage browser for iso installs (bz 504326)
+Patch16: %{name}-%{version}-iso-storage-browser.patch
+# Fix max/current memory spin button interaction (bz 503786)
+Patch17: %{name}-%{version}-fix-memory-interaction.patch
+# Make memory and vcpu changes unconditionally persistent (bz 503784)
+Patch18: %{name}-%{version}-vcpu-mem-persistent.patch
+# Add pylint script
+Patch19: %{name}-%{version}-pylint-script.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 # These two are just the oldest version tested
@@ -111,6 +125,13 @@ management API.
 %patch10 -p1
 %patch11 -p1
 %patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
 
 %build
 %configure
@@ -188,6 +209,14 @@ fi
 %{_datadir}/dbus-1/services/%{name}.service
 
 %changelog
+* Fri Sep 18 2009 Cole Robinson <crobinso at redhat.com> - 0.7.0-6.fc11
+- Fix migration for qemu/kvm guests (bz 517548)
+- Fix sparse allocation confusion (bz 504605)
+- Czech translation typo (bz 504385)
+- Use storage browser for iso installs (bz 504326)
+- Fix max/current memory spin button interaction (bz 503786)
+- Make memory and vcpu changes unconditionally persistent (bz 503784)
+
 * Thu May 21 2009 Mark McLoughlin <markmc at redhat.com> - 0.7.0-5.fc11
 - Fix 'opertaing' typo in 'New VM' dialog (#495128)
 - Allow details window to resize again (#491683)




More information about the Fedora-virt-maint mailing list