[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