- Update to release 0.8.1

- VM Migration wizard, exposing various migration options
- Enumerate CDROM and bridge devices on remote connections
- Support storage pool source enumeration for LVM, NFS, and SCSI
This commit is contained in:
Cole Robinson 2009-12-03 22:45:14 +00:00
parent 3b71f3d7ab
commit 2a9a33433c
25 changed files with 24 additions and 151747 deletions

View File

@ -1 +1 @@
virt-manager-0.8.0.tar.gz
virt-manager-0.8.1.tar.gz

View File

@ -1 +1 @@
0b6cb9144e3933f2c9af07e2d409842d virt-manager-0.8.0.tar.gz
6e461e91d679dc87d9fc506f34832d90 virt-manager-0.8.1.tar.gz

Binary file not shown.

Before

Width:  |  Height:  |  Size: 921 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 828 B

View File

@ -1,44 +0,0 @@
# HG changeset patch
# User Paul W. Frields <stickster@gmail.com>
# Date 1251729959 14400
# Node ID d34def55dbd78e2ad5f099d6a38c1f358c798555
# Parent b70858b9f8c6f9fea21f6e66a10e7b9498f11e5e
addhardware: Fix error message syntax typo
diff -r b70858b9f8c6 -r d34def55dbd7 AUTHORS
--- a/AUTHORS Mon Aug 31 10:19:49 2009 -0400
+++ b/AUTHORS Mon Aug 31 10:45:59 2009 -0400
@@ -59,6 +59,7 @@
Emmanuel Lacour <elacour-at-home-dn-dot-net>
Laurent Léonard <laurent-at-open-minds-dot-org>
Michal Novotny <minovotn-at-redhat-dot-com>
+ Paul W. Frields <stickster-at-gmail-dot-com>
<...send a patch & get your name here...>
diff -r b70858b9f8c6 -r d34def55dbd7 src/virtManager/addhardware.py
--- a/src/virtManager/addhardware.py Mon Aug 31 10:19:49 2009 -0400
+++ b/src/virtManager/addhardware.py Mon Aug 31 10:45:59 2009 -0400
@@ -1186,8 +1186,8 @@
conn = self.vm.get_connection().vmm,
name = nodedev_name)
except Exception, e:
- return self.err.val_err(_("Host device parameter error",
- str(e)))
+ return self.err.val_err(_("Host device parameter error"),
+ str(e))
elif page_num == PAGE_CHAR:
chartype = self.get_char_type()
diff -r b70858b9f8c6 -r d34def55dbd7 src/vmm-manager.glade
--- a/src/vmm-manager.glade Mon Aug 31 10:19:49 2009 -0400
+++ b/src/vmm-manager.glade Mon Aug 31 10:45:59 2009 -0400
@@ -118,7 +118,7 @@
<child>
<widget class="GtkImageMenuItem" id="menu_edit_delete">
<property name="visible">True</property>
- <property name="label" translatable="yes">Delete Virtual Machine</property>
+ <property name="label" translatable="yes">Delete</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_menu_edit_delete_activate"/>
<child internal-child="image">

View File

@ -1,70 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1251727555 14400
# Node ID c0de24094ca26b8da900d29746adba056f4114f7
# Parent 37a986ce54ceac389573d763c78f633a10ec1ab7
Don't mangle QEMU driver name on cdrom connect (bz 516116)
diff -r 37a986ce54ce -r c0de24094ca2 src/virtManager/domain.py
--- a/src/virtManager/domain.py Thu Aug 27 11:07:35 2009 -0400
+++ b/src/virtManager/domain.py Mon Aug 31 10:05:55 2009 -0400
@@ -1291,19 +1291,28 @@
xml = self.get_device_xml("disk", dev_id_info)
def cdrom_xml_connect(doc, ctx):
- disk_fragment = ctx.xpathEval("/disk")
+ disk_fragment = ctx.xpathEval("/disk")[0]
driver_fragment = ctx.xpathEval("/disk/driver")
- disk_fragment[0].setProp("type", _type)
- elem = disk_fragment[0].newChild(None, "source", None)
+ disk_fragment.setProp("type", _type)
+ elem = disk_fragment.newChild(None, "source", None)
+
if _type == "file":
elem.setProp("file", source)
- if driver_fragment:
- driver_fragment[0].setProp("name", _type)
+ driver_name = _type
else:
elem.setProp("dev", source)
- if driver_fragment:
- driver_fragment[0].setProp("name", "phy")
- return disk_fragment[0].serialize()
+ driver_name = "phy"
+
+ if driver_fragment:
+ driver_fragment = driver_fragment[0]
+ orig_name = driver_fragment.prop("name")
+
+ # For Xen, the driver name is dependent on the storage type
+ # (file or phys).
+ if orig_name and orig_name in [ "file", "phy" ]:
+ driver_fragment.setProp("name", driver_name)
+
+ return disk_fragment.serialize()
result = util.xml_parse_wrapper(xml, cdrom_xml_connect)
logging.debug("connect_cdrom produced: %s" % result)
@@ -1313,17 +1322,19 @@
xml = self.get_device_xml("disk", dev_id_info)
def cdrom_xml_disconnect(doc, ctx):
- disk_fragment = ctx.xpathEval("/disk")
+ disk_fragment = ctx.xpathEval("/disk")[0]
sourcenode = None
- for child in disk_fragment[0].children:
+
+ for child in disk_fragment.children:
if child.name == "source":
sourcenode = child
break
else:
continue
+
sourcenode.unlinkNode()
sourcenode.freeNode()
- return disk_fragment[0].serialize()
+ return disk_fragment.serialize()
result = util.xml_parse_wrapper(xml, cdrom_xml_disconnect)
logging.debug("eject_cdrom produced: %s" % result)

View File

@ -1,49 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253131339 14400
# Node ID 1c886d1863f72e7ddd5fb99050362296be6a9deb
# Parent 9242a7fe76b16c6505bdd3d3d328ae8f0c56da10
Don't close connection on all libvirt errors: only if libvirtd goes away.
diff -r 9242a7fe76b1 -r 1c886d1863f7 src/virtManager/connection.py
--- a/src/virtManager/connection.py Wed Sep 16 16:01:54 2009 -0400
+++ b/src/virtManager/connection.py Wed Sep 16 16:02:19 2009 -0400
@@ -941,7 +941,15 @@
updateVMs = newVMs
for uuid in updateVMs:
- self.vms[uuid].tick(now)
+ vm = self.vms[uuid]
+ try:
+ vm.tick(now)
+ except libvirt.libvirtError, e:
+ if e.get_error_code() == libvirt.VIR_ERR_SYSTEM_ERROR:
+ raise
+ logging.exception("Tick for VM '%s' failed" % vm.get_name())
+ except Exception, e:
+ logging.exception("Tick for VM '%s' failed" % vm.get_name())
if not noStatsUpdate:
self._recalculate_stats(now)
diff -r 9242a7fe76b1 -r 1c886d1863f7 src/virtManager/engine.py
--- a/src/virtManager/engine.py Wed Sep 16 16:01:54 2009 -0400
+++ b/src/virtManager/engine.py Wed Sep 16 16:02:19 2009 -0400
@@ -199,10 +199,14 @@
self.connections[uri]["connection"].tick()
except KeyboardInterrupt:
raise
- except:
- logging.exception("Could not refresh connection %s." % uri)
- logging.debug("Closing connection since refresh failed.")
- self.connections[uri]["connection"].close()
+ except libvirt.libvirtError, e:
+ if e.get_error_code() == libvirt.VIR_ERR_SYSTEM_ERROR:
+ logging.exception("Could not refresh connection %s." % uri)
+ logging.debug("Closing connection since libvirtd "
+ "appears to have stopped.")
+ self.connections[uri]["connection"].close()
+ else:
+ raise
return 1
def change_timer_interval(self,ignore1,ignore2,ignore3,ignore4):

View File

@ -1,73 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1254757810 14400
# Node ID 97c40c4fb29f7b1b1aadcebd42781f0d471d4697
# Parent c0cffb13680c120ceff22386754104f66bb01d25
create-vol: Don't allow allocation to be higher than capacity.
Also tweak the spin button climb rates to be more useful.
diff -r c0cffb13680c -r 97c40c4fb29f src/virtManager/createvol.py
--- a/src/virtManager/createvol.py Mon Oct 05 11:34:39 2009 -0400
+++ b/src/virtManager/createvol.py Mon Oct 05 11:50:10 2009 -0400
@@ -63,6 +63,8 @@
"on_vol_cancel_clicked" : self.close,
"on_vol_create_clicked" : self.finish,
"on_vol_name_changed" : self.vol_name_changed,
+ "on_vol_allocation_value_changed" : self.vol_allocation_changed,
+ "on_vol_capacity_value_changed" : self.vol_capacity_changed,
})
format_list = self.window.get_widget("vol-format")
@@ -144,6 +146,24 @@
text = src.get_text()
self.window.get_widget("vol-create").set_sensitive(bool(text))
+ def vol_allocation_changed(self, src):
+ cap_widget = self.window.get_widget("vol-capacity")
+
+ alloc = src.get_value()
+ cap = cap_widget.get_value()
+
+ if alloc > cap:
+ cap_widget.set_value(alloc)
+
+ def vol_capacity_changed(self, src):
+ alloc_widget = self.window.get_widget("vol-allocation")
+
+ cap = src.get_value()
+ alloc = self.window.get_widget("vol-allocation").get_value()
+
+ if cap < alloc:
+ alloc_widget.set_value(cap)
+
def finish(self, src):
# validate input
try:
diff -rup old/src/vmm-create-vol.glade virt-manager-0.8.0/src/vmm-create-vol.glade
--- old/src/vmm-create-vol.glade 2009-10-05 13:18:10.212062000 -0400
+++ virt-manager-0.8.0/src/vmm-create-vol.glade 2009-10-05 13:19:57.343395000 -0400
@@ -237,8 +237,9 @@
<widget class="GtkSpinButton" id="vol-capacity">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="adjustment">1 0 100000 1 10 0</property>
- <property name="climb_rate">1</property>
+ <property name="adjustment">1 0 100000 1 1000 0</property>
+ <property name="climb_rate">10</property>
+ <signal name="value_changed" handler="on_vol_capacity_value_changed"/>
</widget>
<packing>
<property name="left_attach">1</property>
@@ -251,8 +252,9 @@
<widget class="GtkSpinButton" id="vol-allocation">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="adjustment">1 0 100000 1 10 0</property>
- <property name="climb_rate">1</property>
+ <property name="adjustment">1 0 100000 1 1000 0</property>
+ <property name="climb_rate">10</property>
+ <signal name="value_changed" handler="on_vol_allocation_value_changed"/>
</widget>
<packing>
<property name="left_attach">1</property>

View File

@ -1,48 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1254756879 14400
# Node ID c0cffb13680c120ceff22386754104f66bb01d25
# Parent 67d5721a535f204db27f532e59f491f562c8ff18
create-vol: Don't allow creating vol without a name entered
diff -r 67d5721a535f -r c0cffb13680c src/virtManager/createvol.py
--- a/src/virtManager/createvol.py Mon Oct 05 10:06:29 2009 -0400
+++ b/src/virtManager/createvol.py Mon Oct 05 11:34:39 2009 -0400
@@ -62,6 +62,7 @@
"on_vmm_create_vol_delete_event" : self.close,
"on_vol_cancel_clicked" : self.close,
"on_vol_create_clicked" : self.finish,
+ "on_vol_name_changed" : self.vol_name_changed,
})
format_list = self.window.get_widget("vol-format")
@@ -99,6 +100,7 @@
def reset_state(self):
self.window.get_widget("vol-name").set_text("")
+ self.window.get_widget("vol-create").set_sensitive(False)
self.populate_vol_format()
self.populate_vol_suffix()
@@ -138,6 +140,10 @@
suffix = ".img"
self.window.get_widget("vol-name-suffix").set_text(suffix)
+ def vol_name_changed(self, src):
+ text = src.get_text()
+ self.window.get_widget("vol-create").set_sensitive(bool(text))
+
def finish(self, src):
# validate input
try:
diff -rup new/src/vmm-create-vol.glade virt-manager-0.8.0/src/vmm-create-vol.glade
--- new/src/vmm-create-vol.glade 2009-10-05 13:15:48.335564000 -0400
+++ virt-manager-0.8.0/src/vmm-create-vol.glade 2009-10-05 13:16:48.288704000 -0400
@@ -96,6 +96,7 @@
<widget class="GtkEntry" id="vol-name">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <signal name="changed" handler="on_vol_name_changed"/>
</widget>
</child>
<child>

View File

@ -1,349 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253738576 14400
# Node ID e7ee75a8f1353f2c42df93b5090b05fbdf89720a
# Parent 292a065aad7e4e5e5d50a71337efab2361378313
Add dialog-with-checkbox helper functions.
Useful for things like "Don't show this again'.
diff -r 292a065aad7e -r e7ee75a8f135 src/virtManager/error.py
--- a/src/virtManager/error.py Wed Sep 23 11:49:35 2009 -0400
+++ b/src/virtManager/error.py Wed Sep 23 16:42:56 2009 -0400
@@ -131,3 +131,61 @@
def ok_cancel(self, text1, text2=None):
return self._show_warning(gtk.BUTTONS_OK_CANCEL, text1, text2)
+ def warn_chkbox(self, text1, text2=None, chktext=None):
+ chkbox = vmmCheckDialog(self.parent, gtk.MESSAGE_WARNING)
+ return chkbox.show_chkbox(text1, text2, chktext)
+
+ def err_chkbox(self, text1, text2=None, chktext=None):
+ chkbox = vmmCheckDialog(self.parent, gtk.MESSAGE_ERROR)
+ return chkbox.show_chkbox(text1, text2, chktext)
+
+class vmmCheckDialog (gtk.MessageDialog):
+ def __init__ (self, parent=None, typ=gtk.MESSAGE_INFO):
+ if typ == gtk.MESSAGE_WARNING:
+ buttons = gtk.BUTTONS_OK_CANCEL
+ else:
+ buttons = gtk.BUTTONS_OK
+
+ gtk.MessageDialog.__init__ (self, parent, 0, typ, buttons)
+
+ self.connect("response", self.response_cb)
+ self.connect("delete-event", self.hide_on_delete)
+ self.set_title("")
+
+ self.chk_vbox = gtk.VBox(False, False)
+ self.chk_vbox.set_spacing(0)
+
+ self.chk_align = gtk.Alignment()
+ self.chk_align.set_padding(0, 0, 62, 0)
+ self.chk_align.add(self.chk_vbox)
+
+ self.chk_align.show_all()
+ self.vbox.pack_start(self.chk_align)
+
+ def response_cb(self, src, ignore):
+ src.hide()
+
+ def show_chkbox(self, text1, text2=None, chktext=None):
+ chkbox = None
+ res = None
+ chkres = None
+
+ self.hide()
+ for c in self.chk_vbox.get_children():
+ self.chk_vbox.remove(c)
+
+ self.set_property("text", text1)
+
+ if text2:
+ self.format_secondary_text(text2)
+
+ if chktext:
+ chkbox = gtk.CheckButton(chktext)
+ self.chk_vbox.add(chkbox)
+ chkbox.show()
+
+ res = self.run() in [ gtk.RESPONSE_YES, gtk.RESPONSE_OK ]
+ if chktext:
+ res = [res, chkbox.get_active()]
+
+ return res
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253738620 14400
# Node ID f5f3ff4f8942d631234f8e008d806bd502c58bc3
# Parent e7ee75a8f1353f2c42df93b5090b05fbdf89720a
connection: Add is_qemu_system helper.
diff -r e7ee75a8f135 -r f5f3ff4f8942 src/virtManager/connection.py
--- a/src/virtManager/connection.py Wed Sep 23 16:42:56 2009 -0400
+++ b/src/virtManager/connection.py Wed Sep 23 16:43:40 2009 -0400
@@ -201,6 +201,13 @@
def is_nodedev_capable(self):
return virtinst.NodeDeviceParser.is_nodedev_capable(self.vmm)
+ def is_qemu_system(self):
+ (scheme, ignore, ignore,
+ path, ignore, ignore) = virtinst.util.uri_split(self.uri)
+ if path == "/system" and scheme.startswith("qemu"):
+ return True
+ return False
+
def is_qemu_session(self):
(scheme, ignore, ignore,
path, ignore, ignore) = virtinst.util.uri_split(self.uri)
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253806909 14400
# Node ID cfcd19d057ddc973a129e7816cd4ea39f0d4365a
# Parent f5f3ff4f8942d631234f8e008d806bd502c58bc3
create: Don't prompt with same dialog multiple times.
diff -r f5f3ff4f8942 -r cfcd19d057dd src/virtManager/create.py
--- a/src/virtManager/create.py Wed Sep 23 16:43:40 2009 -0400
+++ b/src/virtManager/create.py Thu Sep 24 11:41:49 2009 -0400
@@ -1122,7 +1122,7 @@
if pagenum == PAGE_NAME:
return self.validate_name_page()
elif pagenum == PAGE_INSTALL:
- return self.validate_install_page()
+ return self.validate_install_page(revalidate=False)
elif pagenum == PAGE_MEM:
return self.validate_mem_page()
elif pagenum == PAGE_STORAGE:
@@ -1135,7 +1135,7 @@
return False
elif not self.validate_mem_page():
return False
- return self.validate_storage_page()
+ return self.validate_storage_page(revalidate=False)
elif pagenum == PAGE_FINISH:
# Since we allow the user to change to change HV type + arch
@@ -1169,7 +1169,7 @@
return True
- def validate_install_page(self):
+ def validate_install_page(self, revalidate=True):
instmethod = self.get_config_install_page()
installer = None
location = None
@@ -1270,7 +1270,7 @@
return True
- def validate_storage_page(self):
+ def validate_storage_page(self, revalidate=True):
use_storage = self.window.get_widget("enable-storage").get_active()
self.guest.disks = []
@@ -1296,19 +1296,21 @@
return self.verr(_("Storage parameter error."), str(e))
isfatal, errmsg = disk.is_size_conflict()
- if not isfatal and errmsg:
+ if not revalidate and not isfatal and errmsg:
# Fatal errors are reported when setting 'size'
res = self.err.ok_cancel(_("Not Enough Free Space"), errmsg)
if not res:
return False
# Disk collision
- if disk.is_conflict_disk(self.guest.conn):
- return self.err.yes_no(_('Disk "%s" is already in use by another '
- 'guest!' % disk.path),
- _("Do you really want to use the disk?"))
- else:
- return True
+ if not revalidate and disk.is_conflict_disk(self.guest.conn):
+ res = self.err.yes_no(_('Disk "%s" is already in use by another '
+ 'guest!' % disk.path),
+ _("Do you really want to use the disk?"))
+ if not res:
+ return False
+
+ return True
def validate_final_page(self):
nettype, devname, macaddr = self.get_config_network_info()
diff -r 343b42ebee5b src/virtManager/addhardware.py
--- a/src/virtManager/addhardware.py Thu Sep 24 11:41:49 2009 -0400
+++ b/src/virtManager/addhardware.py Thu Sep 24 11:44:49 2009 -0400
@@ -31,6 +31,7 @@
import virtinst
from virtinst import VirtualCharDevice, VirtualDevice, VirtualVideoDevice
+import virtManager.create
import virtManager.util as vmmutil
from virtManager.asyncjob import vmmAsyncJob
from virtManager.error import vmmErrorDialog
@@ -1054,6 +1055,7 @@
return self.err.val_err(_("Hardware Type Required"), \
_("You must specify what type of hardware to add."))
self._dev = None
+
elif page_num == PAGE_DISK:
path = self.get_config_disk_image()
if path == None or len(path) == 0:
@@ -1102,6 +1104,11 @@
_("Do you really want to use the disk?"))
return res
+ # Make sure qemu can access path
+ virtManager.create.check_path_search_for_qemu(self,
+ self.vm.connection,
+ self._dev.path)
+
elif page_num == PAGE_NETWORK:
net = self.get_config_network()
if self.window.get_widget("net-type-network").get_active():
diff -r 343b42ebee5b src/virtManager/choosecd.py
--- a/src/virtManager/choosecd.py Thu Sep 24 11:41:49 2009 -0400
+++ b/src/virtManager/choosecd.py Thu Sep 24 11:44:49 2009 -0400
@@ -24,6 +24,7 @@
import virtinst
import virtManager.opticalhelper
+import virtManager.create
from virtManager.storagebrowse import vmmStorageBrowser
from virtManager.error import vmmErrorDialog
@@ -108,6 +109,10 @@
except Exception, e:
return self.err.val_err(_("Invalid Media Path"), str(e))
+ # Make sure qemu can access the path
+ virtManager.create.check_path_search_for_qemu(self, self.conn,
+ disk.path)
+
self.emit("cdrom-chosen", disk.type, disk.path, self.dev_id_info)
self.cancel()
diff -r 343b42ebee5b src/virtManager/config.py
--- a/src/virtManager/config.py Thu Sep 24 11:41:49 2009 -0400
+++ b/src/virtManager/config.py Thu Sep 24 11:44:49 2009 -0400
@@ -558,3 +558,15 @@
else:
return os.getcwd()
+ def add_perms_fix_ignore(self, pathlist):
+ current_list = self.get_perms_fix_ignore() or []
+ for path in pathlist:
+ if path in current_list:
+ continue
+ current_list.append(path)
+ self.conf.set_list(self.conf_dir + "/paths/perms_fix_ignore",
+ gconf.VALUE_STRING,
+ current_list)
+ def get_perms_fix_ignore(self):
+ return self.conf.get_list(self.conf_dir + "/paths/perms_fix_ignore",
+ gconf.VALUE_STRING)
diff -r 343b42ebee5b src/virtManager/create.py
--- a/src/virtManager/create.py Thu Sep 24 11:41:49 2009 -0400
+++ b/src/virtManager/create.py Thu Sep 24 11:44:49 2009 -0400
@@ -30,6 +30,7 @@
import virtinst
from virtinst import VirtualNetworkInterface
+from virtinst import VirtualDisk
import virtManager.opticalhelper
from virtManager import util
@@ -53,6 +54,54 @@
INSTALL_PAGE_URL = 1
INSTALL_PAGE_PXE = 2
+def check_path_search_for_qemu(vmm_obj, conn, path):
+ if conn.is_remote() or not conn.is_qemu_system():
+ return
+
+ user = "qemu"
+
+ skip_paths = vmm_obj.config.get_perms_fix_ignore()
+ broken_paths = VirtualDisk.check_path_search_for_user(conn.vmm, path, user)
+ for p in broken_paths:
+ if p in skip_paths:
+ broken_paths.remove(p)
+
+ if not broken_paths:
+ return
+
+ logging.debug("No search access for dirs: %s" % broken_paths)
+ resp, chkres = vmm_obj.err.warn_chkbox(
+ _("The emulator may not have search permissions "
+ "for the path '%s'.") % path,
+ _("Do you want to correct this now?"),
+ _("Don't ask about these directories again."))
+
+ if chkres:
+ vmm_obj.config.add_perms_fix_ignore(broken_paths)
+ if not resp:
+ return
+
+ logging.debug("Attempting to correct permission issues.")
+ errors = VirtualDisk.fix_path_search_for_user(conn.vmm, path, user)
+ if not errors:
+ return
+
+ errmsg = _("Errors were encountered changing permissions for the "
+ "following directories:")
+ details = ""
+ for path, error in errors.items():
+ if path not in broken_paths:
+ continue
+ details += "%s : %s\n" % (path, error)
+
+ logging.debug("Permission errors:\n%s" % details)
+
+ ignore, chkres = vmm_obj.err.err_chkbox(errmsg, details,
+ _("Don't ask about these directories again."))
+
+ if chkres:
+ vmm_obj.config.add_perms_fix_ignore(errors.keys())
+
class vmmCreate(gobject.GObject):
__gsignals__ = {
"action-show-console": (gobject.SIGNAL_RUN_FIRST,
@@ -1245,6 +1294,11 @@
return self.err.val_err(_("Error setting OS information."),
str(e))
+ if instmethod == INSTALL_PAGE_ISO and not revalidate:
+ # Check if 'qemu' user can access disk
+ check_path_search_for_qemu(self, self.conn,
+ self.guest.installer.location)
+
# Validation passed, store the install path (if there is one) in
# gconf
self.get_config_local_media(store_media=True)
@@ -1286,10 +1340,10 @@
if not diskpath:
return self.verr(_("A storage path must be specified."))
- disk = virtinst.VirtualDisk(conn = self.conn.vmm,
- path = diskpath,
- size = disksize,
- sparse = sparse)
+ disk = VirtualDisk(conn = self.conn.vmm,
+ path = diskpath,
+ size = disksize,
+ sparse = sparse)
self.guest.disks.append(disk)
except Exception, e:
@@ -1310,6 +1364,10 @@
if not res:
return False
+ if not revalidate:
+ # Check if 'qemu' user can access disk
+ check_path_search_for_qemu(self, self.conn, disk.path)
+
return True
def validate_final_page(self):

View File

@ -1,19 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253823268 14400
# Node ID d78b7e7131439dc9f22c8e7391e82c5f29888fe8
# Parent cfcd19d057ddc973a129e7816cd4ea39f0d4365a
Fix vcpu hotplug.
diff -r cfcd19d057dd -r d78b7e713143 src/virtManager/domain.py
--- a/src/virtManager/domain.py Thu Sep 24 11:41:49 2009 -0400
+++ b/src/virtManager/domain.py Thu Sep 24 16:14:28 2009 -0400
@@ -1355,7 +1355,7 @@
self._change_cdrom(result, dev_id_info)
def hotplug_vcpu(self, vcpus):
- self.vm.setVcpus()
+ self.vm.setVcpus(int(vcpus))
def hotplug_vcpus(self, vcpus):
vcpus = int(vcpus)

View File

@ -1,152 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1254248737 14400
# Node ID 65951459abe9efb9fc5f58a243ddcfd49deba0a5
# Parent 59f3d7a2ec289145c41437b7f12bcd730e17f340
Hide access to help docs: they are out of date to the point of uselessness.
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/addhardware.py
--- a/src/virtManager/addhardware.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/addhardware.py Tue Sep 29 14:25:37 2009 -0400
@@ -115,6 +115,9 @@
"char_telnet_focus_in": (self.update_doc, "protocol"),
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("create-help").hide()
+
self.set_initial_state()
def update_doc(self, ignore1, ignore2, param):
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/clone.py
--- a/src/virtManager/clone.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/clone.py Tue Sep 29 14:25:37 2009 -0400
@@ -129,6 +129,9 @@
"on_clone_help_clicked" : self.show_help,
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("clone-help").hide()
+
self.set_initial_state()
def show(self):
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/createnet.py
--- a/src/virtManager/createnet.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/createnet.py Tue Sep 29 14:25:37 2009 -0400
@@ -68,6 +68,9 @@
"on_create_help_clicked": self.show_help,
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("create-help").hide()
+
self.set_initial_state()
def show(self):
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/createpool.py
--- a/src/virtManager/createpool.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/createpool.py Tue Sep 29 14:25:37 2009 -0400
@@ -88,6 +88,9 @@
"on_pool_build_focus_in_event": (self.update_build_doc)
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("pool-help").hide()
+
self.set_initial_state()
def show(self):
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/createvol.py
--- a/src/virtManager/createvol.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/createvol.py Tue Sep 29 14:25:37 2009 -0400
@@ -72,6 +72,10 @@
format_list.add_attribute(text2, 'text', 1)
self.window.get_widget("vol-info-view").modify_bg(gtk.STATE_NORMAL,
gtk.gdk.color_parse("grey"))
+
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("pool-help").hide()
+
self.reset_state()
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/details.py
--- a/src/virtManager/details.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/details.py Tue Sep 29 14:25:37 2009 -0400
@@ -313,6 +313,9 @@
"on_security_model_changed": self.security_model_changed,
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("help1").hide()
+
self.vm.connect("status-changed", self.update_widget_states)
self.vm.connect("resources-sampled", self.refresh_resources)
self.vm.connect("config-changed", self.refresh_vm_info)
@@ -575,7 +578,7 @@
if self.is_visible():
self.topwin.present()
return
- self.topwin.show_all()
+ self.topwin.show()
self.topwin.present()
self.engine.increment_window_counter()
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/host.py
--- a/src/virtManager/host.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/host.py Tue Sep 29 14:25:37 2009 -0400
@@ -169,6 +169,9 @@
"on_config_autoconnect_toggled": self.toggle_autoconnect,
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("help1").hide()
+
self.conn.connect("resources-sampled", self.refresh_resources)
self.reset_state()
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/manager.py
--- a/src/virtManager/manager.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/manager.py Tue Sep 29 14:25:37 2009 -0400
@@ -188,6 +188,7 @@
filename = self.config.get_icon_dir() + "/%s" % iconfile
pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, l, w)
image = gtk.image_new_from_pixbuf(pixbuf)
+ image.show_all()
self.window.get_widget(widget).set_icon_widget(image)
set_toolbar_image("vm-new", "vm_new_wizard.png", 28, 28)
@@ -356,6 +357,9 @@
"on_menu_help_activate": self.show_help,
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("menu_help").hide()
+
self.vm_selected(None)
self.window.get_widget("vm-list").get_selection().connect("changed", self.vm_selected)
@@ -391,7 +395,8 @@
if self.is_visible():
win.present()
return
- win.show_all()
+ win.show()
+ win.present()
self.engine.increment_window_counter()
if self.startup_error:
diff -r 59f3d7a2ec28 -r 65951459abe9 src/virtManager/preferences.py
--- a/src/virtManager/preferences.py Tue Sep 29 14:02:28 2009 -0400
+++ b/src/virtManager/preferences.py Tue Sep 29 14:25:37 2009 -0400
@@ -75,6 +75,9 @@
"on_prefs_stats_enable_net_toggled": self.change_net_poll,
})
+ # XXX: Help docs useless/out of date
+ self.window.get_widget("prefs-help").hide()
+
def close(self, ignore1=None, ignore2=None):
self.topwin.hide()
return 1

View File

@ -1,249 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253201058 14400
# Node ID a6f055361d165bea5fbb3c62ec54a820987a7dde
# Parent 1c886d1863f72e7ddd5fb99050362296be6a9deb
Update new VM status icons.
Previous round didn't convey state very well, and looked too much like
buttons.
diff -r 1c886d1863f7 -r a6f055361d16 pixmaps/state_paused.png
Binary file pixmaps/state_paused.png has changed
diff -r 1c886d1863f7 -r a6f055361d16 pixmaps/state_running.png
Binary file pixmaps/state_running.png has changed
diff -r 1c886d1863f7 -r a6f055361d16 pixmaps/state_shutoff.png
Binary file pixmaps/state_shutoff.png has changed
diff -r 1c886d1863f7 -r a6f055361d16 src/virtManager/config.py
--- a/src/virtManager/config.py Wed Sep 16 16:02:19 2009 -0400
+++ b/src/virtManager/config.py Thu Sep 17 11:24:18 2009 -0400
@@ -90,7 +90,16 @@
libvirt.VIR_DOMAIN_SHUTOFF: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_shutoff.png", 18, 18),
libvirt.VIR_DOMAIN_NOSTATE: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 18, 18),
}
- #initialize the help stuff
+ self.status_icons_large = {
+ libvirt.VIR_DOMAIN_BLOCKED: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 32, 32),
+ libvirt.VIR_DOMAIN_CRASHED: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_crashed.png", 32, 32),
+ libvirt.VIR_DOMAIN_PAUSED: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_paused.png", 32, 32),
+ libvirt.VIR_DOMAIN_RUNNING: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 32, 32),
+ libvirt.VIR_DOMAIN_SHUTDOWN: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_shutoff.png", 32, 32),
+ libvirt.VIR_DOMAIN_SHUTOFF: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_shutoff.png", 32, 32),
+ libvirt.VIR_DOMAIN_NOSTATE: gtk.gdk.pixbuf_new_from_file_at_size(self.get_icon_dir() + "/state_running.png", 32, 32),
+ }
+
props = { gnome.PARAM_APP_DATADIR : self.get_data_dir()}
gnome.program_init(self.get_appname(), self.get_appversion(), \
properties=props)
@@ -100,6 +109,9 @@
def get_vm_status_icon(self, state):
return self.status_icons[state]
+ def get_vm_status_icon_large(self, state):
+ return self.status_icons_large[state]
+
def get_shutdown_icon_name(self):
theme = gtk.icon_theme_get_default()
if theme.has_icon("system-shutdown"):
diff -r 1c886d1863f7 -r a6f055361d16 src/virtManager/domain.py
--- a/src/virtManager/domain.py Wed Sep 16 16:02:19 2009 -0400
+++ b/src/virtManager/domain.py Thu Sep 17 11:24:18 2009 -0400
@@ -728,6 +728,8 @@
def run_status_icon(self):
return self.config.get_vm_status_icon(self.status())
+ def run_status_icon_large(self):
+ return self.config.get_vm_status_icon_large(self.status())
def _is_serial_console_tty_accessible(self, path):
# pty serial scheme doesn't work over remote
diff -r 1c886d1863f7 -r a6f055361d16 src/virtManager/manager.py
--- a/src/virtManager/manager.py Wed Sep 16 16:02:19 2009 -0400
+++ b/src/virtManager/manager.py Thu Sep 17 11:24:18 2009 -0400
@@ -493,7 +493,7 @@
row.insert(ROW_NAME, vm.get_name())
row.insert(ROW_MARKUP, row[ROW_NAME])
row.insert(ROW_STATUS, vm.run_status())
- row.insert(ROW_STATUS_ICON, vm.run_status_icon())
+ row.insert(ROW_STATUS_ICON, vm.run_status_icon_large())
row.insert(ROW_KEY, vm.get_uuid())
row.insert(ROW_HINT, None)
row.insert(ROW_IS_CONN, False)
@@ -575,7 +575,7 @@
row = self.rows[self.vm_row_key(vm)]
row[ROW_STATUS] = vm.run_status()
- row[ROW_STATUS_ICON] = vm.run_status_icon()
+ row[ROW_STATUS_ICON] = vm.run_status_icon_large()
row[ROW_IS_VM_RUNNING] = vm.is_active()
model.row_changed(row.path, row.iter)
@@ -850,7 +850,6 @@
statusCol.add_attribute(status_icon, 'cell-background', ROW_COLOR)
statusCol.add_attribute(status_icon, 'pixbuf', ROW_STATUS_ICON)
statusCol.add_attribute(status_icon, 'visible', ROW_IS_VM)
- statusCol.add_attribute(status_icon, 'sensitive', ROW_IS_VM_RUNNING)
name_txt = gtk.CellRendererText()
nameCol.pack_start(name_txt, True)
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253205341 14400
# Node ID cdbe1da3ce75a5ad06b8e07e891ac35d1b246685
# Parent a6f055361d165bea5fbb3c62ec54a820987a7dde
Change VM name text arrangement in manager view.
Shrink text size, add a second row that shows the VM status. Fills the
display up a bit so it doesn't look so sparse.
diff -r a6f055361d16 -r cdbe1da3ce75 src/virtManager/manager.py
--- a/src/virtManager/manager.py Thu Sep 17 11:24:18 2009 -0400
+++ b/src/virtManager/manager.py Thu Sep 17 12:35:41 2009 -0400
@@ -486,12 +486,26 @@
else:
self.emit("action-refresh-console", uri, vmuuid)
+ def _build_conn_markup(self, conn, row):
+ if conn.state == conn.STATE_DISCONNECTED:
+ markup = ("<span font='9' color='#5b5b5b'>%s - "
+ "Not Connected</span>" % row[ROW_NAME])
+ else:
+ markup = ("<span font='9'>%s</span>" % row[ROW_NAME])
+ return markup
+
+ def _build_vm_markup(self, vm, row):
+ markup = ("<span font='10'>%s</span>\n"
+ "<span font='9' color='#989898'>%s</span>" %
+ (row[ROW_NAME], row[ROW_STATUS]))
+ return markup
+
def _append_vm(self, model, vm, conn):
parent = self.rows[conn.get_uri()].iter
row = []
row.insert(ROW_HANDLE, vm)
row.insert(ROW_NAME, vm.get_name())
- row.insert(ROW_MARKUP, row[ROW_NAME])
+ row.insert(ROW_MARKUP, "")
row.insert(ROW_STATUS, vm.run_status())
row.insert(ROW_STATUS_ICON, vm.run_status_icon_large())
row.insert(ROW_KEY, vm.get_uuid())
@@ -502,6 +516,8 @@
row.insert(ROW_IS_VM_RUNNING, vm.is_active())
row.insert(ROW_COLOR, "white")
+ row[ROW_MARKUP] = self._build_vm_markup(vm, row)
+
_iter = model.append(parent, row)
path = model.get_path(_iter)
self.rows[self.vm_row_key(vm)] = model[path]
@@ -512,12 +528,7 @@
row = []
row.insert(ROW_HANDLE, conn)
row.insert(ROW_NAME, conn.get_pretty_desc_inactive(False))
- if conn.state == conn.STATE_DISCONNECTED:
- markup = ("<span font='9.5' color='#5b5b5b'>%s - "
- "Not Connected</span>" % row[ROW_NAME])
- else:
- markup = ("<span font='9.5'>%s</span>" % row[ROW_NAME])
- row.insert(ROW_MARKUP, markup)
+ row.insert(ROW_MARKUP, self._build_conn_markup(conn, row))
row.insert(ROW_STATUS, ("<span font='9'>%s</span>" %
conn.get_state_text()))
row.insert(ROW_STATUS_ICON, None)
@@ -589,12 +600,7 @@
model = vmlist.get_model()
row = self.rows[conn.get_uri()]
- if conn.state == conn.STATE_DISCONNECTED:
- markup = ("<span font='9.5' color='#5b5b5b'>%s - "
- "Not Connected</span>" % row[ROW_NAME])
- else:
- markup = ("<span font='9.5'>%s</span>" % row[ROW_NAME])
- row[ROW_MARKUP] = markup
+ row[ROW_MARKUP] = self._build_conn_markup(conn, row)
row[ROW_STATUS] = "<span font='9'>%s</span>" % conn.get_state_text()
row[ROW_IS_CONN_CONNECTED] = conn.state != conn.STATE_DISCONNECTED
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253201111 14400
# Node ID 739a6876af4692d6f86d8813f6dd3aa046bf6a8b
# Parent cdbe1da3ce75a5ad06b8e07e891ac35d1b246685
Drop row coloring for managed connection rows.
Looks kind of funky with lots of dark colored rows for a user with multiple
connections.
diff -r cdbe1da3ce75 -r 739a6876af46 src/virtManager/manager.py
--- a/src/virtManager/manager.py Thu Sep 17 12:35:41 2009 -0400
+++ b/src/virtManager/manager.py Thu Sep 17 11:25:11 2009 -0400
@@ -49,8 +49,6 @@
ROW_IS_CONN_CONNECTED = 8
ROW_IS_VM = 9
ROW_IS_VM_RUNNING = 10
-ROW_COLOR = 11
-ROW_HEIGHT = 12
# Columns in the tree view
COL_NAME = 0
@@ -514,7 +512,6 @@
row.insert(ROW_IS_CONN_CONNECTED, True)
row.insert(ROW_IS_VM, True)
row.insert(ROW_IS_VM_RUNNING, vm.is_active())
- row.insert(ROW_COLOR, "white")
row[ROW_MARKUP] = self._build_vm_markup(vm, row)
@@ -539,7 +536,6 @@
conn.state != conn.STATE_DISCONNECTED)
row.insert(ROW_IS_VM, False)
row.insert(ROW_IS_VM_RUNNING, False)
- row.insert(ROW_COLOR, "#d4d2d2")
_iter = model.append(None, row)
path = model.get_path(_iter)
@@ -823,9 +819,9 @@
vmlist = self.window.get_widget("vm-list")
# Handle, name, markup, status, status icon, key/uuid, hint, is conn,
- # is conn connected, is vm, is vm running, color
+ # is conn connected, is vm, is vm running
model = gtk.TreeStore(object, str, str, str, gtk.gdk.Pixbuf, str, str,
- bool, bool, bool, bool, str)
+ bool, bool, bool, bool)
vmlist.set_model(model)
util.tooltip_wrapper(vmlist, ROW_HINT, "set_tooltip_column")
@@ -834,7 +830,7 @@
nameCol = gtk.TreeViewColumn(_("Name"))
nameCol.set_expand(True)
- nameCol.set_spacing(12)
+ nameCol.set_spacing(6)
cpuUsageCol = gtk.TreeViewColumn(_("CPU usage"))
cpuUsageCol.set_min_width(150)
@@ -853,13 +849,11 @@
status_icon = gtk.CellRendererPixbuf()
statusCol.pack_start(status_icon, False)
- statusCol.add_attribute(status_icon, 'cell-background', ROW_COLOR)
statusCol.add_attribute(status_icon, 'pixbuf', ROW_STATUS_ICON)
statusCol.add_attribute(status_icon, 'visible', ROW_IS_VM)
name_txt = gtk.CellRendererText()
nameCol.pack_start(name_txt, True)
- nameCol.add_attribute(name_txt, 'cell-background', ROW_COLOR)
nameCol.add_attribute(name_txt, 'markup', ROW_MARKUP)
nameCol.set_sort_column_id(VMLIST_SORT_NAME)
@@ -870,9 +864,7 @@
cpuUsage_img.set_property("reversed", True)
cpuUsageCol.pack_start(cpuUsage_img, True)
cpuUsageCol.pack_start(cpuUsage_txt, False)
- cpuUsageCol.add_attribute(cpuUsage_img, 'cell-background', ROW_COLOR)
cpuUsageCol.add_attribute(cpuUsage_img, 'visible', ROW_IS_VM)
- cpuUsageCol.add_attribute(cpuUsage_txt, 'cell-background', ROW_COLOR)
cpuUsageCol.add_attribute(cpuUsage_txt, 'visible', ROW_IS_CONN)
cpuUsageCol.set_sort_column_id(VMLIST_SORT_STATS)
self.stats_sparkline = cpuUsage_img

File diff suppressed because it is too large Load Diff

View File

@ -1,72 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1252939197 14400
# Node ID 486cd6791c3926420786d30401a690884acdf653
# Parent 043ca66e19aabcdb89b8bbe76ef5ded8b0c0fc54
Fix populating text box with storage browser selection in 'New VM' (bz 517263)
We were only properly setting the 'finish' callback for the first time the
storage browser was launched. All subsequent runs would not enter anything
in the associated text box.
diff -r 043ca66e19aa -r 486cd6791c39 src/virtManager/addhardware.py
--- a/src/virtManager/addhardware.py Mon Sep 14 10:14:41 2009 -0400
+++ b/src/virtManager/addhardware.py Mon Sep 14 10:39:57 2009 -0400
@@ -80,7 +80,6 @@
_("An unexpected error occurred"))
self.storage_browser = None
- self._browse_cb_id = None
self._dev = None
@@ -911,10 +910,8 @@
conn = self.vm.get_connection()
if self.storage_browser == None:
self.storage_browser = vmmStorageBrowser(self.config, conn, False)
- if self._browse_cb_id:
- self.storage_browser.disconnect(self._browse_cb_id)
- self._browse_cb_id = self.storage_browser.connect("storage-browse-finish", set_storage_cb)
+ self.storage_browser.set_finish_cb(set_storage_cb)
self.storage_browser.local_args = { "dialog_name": dialog_name,
"confirm_func": confirm_func,
"browse_reason":
diff -r 043ca66e19aa -r 486cd6791c39 src/virtManager/create.py
--- a/src/virtManager/create.py Mon Sep 14 10:14:41 2009 -0400
+++ b/src/virtManager/create.py Mon Sep 14 10:39:57 2009 -0400
@@ -1644,8 +1644,9 @@
if self.storage_browser == None:
self.storage_browser = vmmStorageBrowser(self.config, self.conn,
is_media)
- self.storage_browser.connect("storage-browse-finish",
- callback)
+
+ self.storage_browser.set_finish_cb(callback)
+
if is_media:
reason = self.config.CONFIG_DIR_MEDIA
else:
diff -r 043ca66e19aa -r 486cd6791c39 src/virtManager/storagebrowse.py
--- a/src/virtManager/storagebrowse.py Mon Sep 14 10:14:41 2009 -0400
+++ b/src/virtManager/storagebrowse.py Mon Sep 14 10:39:57 2009 -0400
@@ -47,6 +47,7 @@
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,
@@ -89,6 +90,11 @@
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)

View File

@ -1,20 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1251728389 14400
# Node ID b70858b9f8c6f9fea21f6e66a10e7b9498f11e5e
# Parent 0bdea2b6c30e3b9ac7ca7b35f957598e66fd8c36
Don't allow deleting an active VM (bz 518536)
diff -r 0bdea2b6c30e -r b70858b9f8c6 src/virtManager/manager.py
--- a/src/virtManager/manager.py Mon Aug 31 10:07:06 2009 -0400
+++ b/src/virtManager/manager.py Mon Aug 31 10:19:49 2009 -0400
@@ -684,7 +684,8 @@
show_open = bool(vm)
show_details = bool(vm)
host_details = bool(vm or conn)
- delete = bool((vm and vm.is_runable()) or conn)
+ delete = bool((vm and vm.is_runable()) or
+ (not vm and conn))
show_run = bool(vm and vm.is_runable())
is_paused = bool(vm and vm.is_paused())
if is_paused:

View File

@ -1,18 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1252937681 14400
# Node ID 043ca66e19aabcdb89b8bbe76ef5ded8b0c0fc54
# Parent d34def55dbd78e2ad5f099d6a38c1f358c798555
Try to avoid 'maximum recursion depth' errors from pylint script.
diff -r d34def55dbd7 -r 043ca66e19aa tests/pylint-virt-manager.sh
--- a/tests/pylint-virt-manager.sh Mon Aug 31 10:45:59 2009 -0400
+++ b/tests/pylint-virt-manager.sh Mon Sep 14 10:14:41 2009 -0400
@@ -95,6 +95,7 @@
-ve "$BUILTIN_TYPE" \
-ve "$ERROR_VBOX" \
-ve "$UNABLE_IMPORT" \
+ -ve "$MAX_RECURSION" \
-ve "$EXCEPTHOOK" | \
$AWK '\
# Strip out any "*** Module name" lines if we dont list any errors for them

View File

@ -1,96 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253563791 14400
# Node ID f75237b0a84e73552a55ef0121215633c4530879
# Parent d3b377306a994f66cd1c03f3bcbef17c4b060720
Use timer to refresh available disk space in 'New VM' wizard (bz 502777)
diff -r d3b377306a99 -r f75237b0a84e src/virtManager/create.py
--- a/src/virtManager/create.py Thu Sep 17 13:45:53 2009 -0400
+++ b/src/virtManager/create.py Mon Sep 21 16:09:51 2009 -0400
@@ -93,6 +93,10 @@
# 'Guest' class from the previous failed install
self.failed_guest = None
+ # Host space polling
+ self.host_storage_timer = None
+ self.host_storage = None
+
self.window.signal_autoconnect({
"on_vmm_newcreate_delete_event" : self.close,
@@ -136,8 +140,18 @@
def close(self, ignore1=None, ignore2=None):
self.topwin.hide()
+ self.remove_timers()
+
return 1
+ def remove_timers(self):
+ try:
+ if self.host_storage_timer:
+ gobject.source_remote(self.host_storage_timer)
+ self.host_storage_timer = None
+ except:
+ pass
+
def set_conn(self, newconn):
if self.conn == newconn:
return
@@ -303,9 +317,11 @@
self.window.get_widget("config-cpus").set_value(1)
# Storage
+ if not self.host_storage_timer:
+ self.host_storage_timer = gobject.timeout_add(3 * 1000,
+ self.host_space_tick)
self.window.get_widget("enable-storage").set_active(True)
self.window.get_widget("config-storage-create").set_active(True)
- # FIXME: Make sure this doesn't exceed host?
self.window.get_widget("config-storage-size").set_value(8)
self.window.get_widget("config-storage-entry").set_text("")
self.window.get_widget("config-storage-nosparse").set_active(True)
@@ -437,11 +453,6 @@
# Storage
have_storage = (is_local or is_storage_capable)
storage_tooltip = None
- max_storage = self.host_disk_space()
- hd_label = "%s available on the host" % self.pretty_storage(max_storage)
- hd_label = ("<span color='#484848'>%s</span>" % hd_label)
- self.window.get_widget("phys-hd-label").set_markup(hd_label)
- self.window.get_widget("config-storage-size").set_range(1, max_storage)
use_storage = self.window.get_widget("config-storage-select")
storage_area = self.window.get_widget("config-storage-area")
@@ -863,6 +874,7 @@
# FIXME: use a conn specific function after we send pool-added
pool = virtinst.util.lookup_pool_by_path(self.conn.vmm, path)
if pool:
+ pool.refresh(0)
avail = int(virtinst.util.get_xml_path(pool.XMLDesc(0),
"/pool/available"))
@@ -870,7 +882,21 @@
vfs = os.statvfs(os.path.dirname(path))
avail = vfs[statvfs.F_FRSIZE] * vfs[statvfs.F_BAVAIL]
- return int(avail / 1024.0 / 1024.0 / 1024.0)
+ return float(avail / 1024.0 / 1024.0 / 1024.0)
+
+ def host_space_tick(self):
+ max_storage = self.host_disk_space()
+ if self.host_storage == max_storage:
+ return 1
+ self.host_storage = max_storage
+
+ hd_label = ("%s available in the default location" %
+ self.pretty_storage(max_storage))
+ hd_label = ("<span color='#484848'>%s</span>" % hd_label)
+ self.window.get_widget("phys-hd-label").set_markup(hd_label)
+ self.window.get_widget("config-storage-size").set_range(1, self.host_storage)
+
+ return 1
def get_config_network_info(self):
netidx = self.window.get_widget("config-netdev").get_active()

View File

@ -1,60 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1253131314 14400
# Node ID 9242a7fe76b16c6505bdd3d3d328ae8f0c56da10
# Parent 6aa2dc9ada0c43e19680af5b922cd643e35602d0
Better logging and error avoidance with net/disk stats routines.
diff -r 6aa2dc9ada0c -r 9242a7fe76b1 src/virtManager/domain.py
--- a/src/virtManager/domain.py Wed Sep 16 16:00:47 2009 -0400
+++ b/src/virtManager/domain.py Wed Sep 16 16:01:54 2009 -0400
@@ -337,8 +337,12 @@
return rx, tx
for netdev in self.get_network_devices(refresh_if_necc=False):
+ dev = netdev[4]
+ if not dev:
+ continue
+
try:
- io = self.vm.interfaceStats(netdev[4])
+ io = self.vm.interfaceStats(dev)
if io:
rx += io[0]
tx += io[4]
@@ -347,7 +351,9 @@
logging.debug("Net stats not supported: %s" % err)
self._stats_net_supported = False
else:
- logging.error("Error reading net stats: %s" % err)
+ logging.error("Error reading net stats for "
+ "'%s' dev '%s': %s" %
+ (self.get_name(), dev, err))
return rx, tx
def _sample_disk_io_dummy(self):
@@ -360,8 +366,12 @@
return rd, wr
for disk in self.get_disk_devices(refresh_if_necc=False):
+ dev = disk[2]
+ if not dev:
+ continue
+
try:
- io = self.vm.blockStats(disk[2])
+ io = self.vm.blockStats(dev)
if io:
rd += io[1]
wr += io[3]
@@ -370,7 +380,9 @@
logging.debug("Disk stats not supported: %s" % err)
self._stats_disk_supported = False
else:
- logging.error("Error reading disk stats: %s" % err)
+ logging.error("Error reading disk stats for "
+ "'%s' dev '%s': %s" %
+ (self.get_name(), dev, err))
return rd, wr
def _get_cur_rate(self, what):

View File

@ -1,101 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1254762221 14400
# Node ID 7df46187c156c7697b9b93e46e3b391a19c4fbb2
# Parent 97c40c4fb29f7b1b1aadcebd42781f0d471d4697
Add tooltips for toolbar buttons in manager and details.
diff -r 97c40c4fb29f -r 7df46187c156 src/vmm-details.glade
--- a/src/vmm-details.glade Mon Oct 05 11:50:10 2009 -0400
+++ b/src/vmm-details.glade Mon Oct 05 13:03:41 2009 -0400
@@ -430,6 +430,7 @@
<child>
<widget class="GtkRadioToolButton" id="control-vm-console">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Show the graphical console</property>
<property name="label" translatable="yes">Console</property>
<property name="icon_name">icon_console</property>
<property name="active">True</property>
@@ -443,6 +444,7 @@
<child>
<widget class="GtkRadioToolButton" id="control-vm-details">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Show virtual hardware details</property>
<property name="label" translatable="yes">Details</property>
<property name="stock_id">gtk-info</property>
<property name="group">control-vm-console</property>
@@ -465,6 +467,7 @@
<child>
<widget class="GtkToolButton" id="control-run">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Power on the virtual machine</property>
<property name="is_important">True</property>
<property name="label" translatable="yes">Run</property>
<property name="use_underline">True</property>
@@ -479,6 +482,7 @@
<child>
<widget class="GtkToggleToolButton" id="control-pause">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Pause the virtual machine</property>
<property name="is_important">True</property>
<property name="label" translatable="yes">Pause</property>
<property name="use_underline">True</property>
@@ -493,6 +497,7 @@
<child>
<widget class="GtkMenuToolButton" id="control-shutdown">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Shutdown the virtual machine</property>
<property name="is_important">True</property>
<property name="label" translatable="yes">Shut Down</property>
<property name="use_underline">True</property>
@@ -514,6 +519,7 @@
<child>
<widget class="GtkToggleToolButton" id="control-fullscreen">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Switch to fullscreen view</property>
<property name="stock_id">gtk-fullscreen</property>
<signal name="toggled" handler="on_control_fullscreen_toggled"/>
</widget>
diff -r 97c40c4fb29f -r 7df46187c156 src/vmm-manager.glade
--- a/src/vmm-manager.glade Mon Oct 05 11:50:10 2009 -0400
+++ b/src/vmm-manager.glade Mon Oct 05 13:03:41 2009 -0400
@@ -229,6 +229,7 @@
<child>
<widget class="GtkToolButton" id="vm-new">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Create a new virtual machine</property>
<property name="label" translatable="yes">_New</property>
<property name="use_underline">True</property>
<property name="icon_name">vm_new_large</property>
@@ -251,6 +252,7 @@
<child>
<widget class="GtkToolButton" id="vm-open">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Show the virtual machine's details</property>
<property name="label" translatable="yes">_Open</property>
<property name="use_underline">True</property>
<property name="icon_name">icon_console</property>
@@ -264,6 +266,7 @@
<child>
<widget class="GtkToolButton" id="vm-run">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Power on the virtual machine</property>
<property name="label" translatable="yes">_Run</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-play</property>
@@ -277,6 +280,7 @@
<child>
<widget class="GtkToggleToolButton" id="vm-pause">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Pause the virtual machine</property>
<property name="label" translatable="yes">_Pause</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-pause</property>
@@ -290,6 +294,7 @@
<child>
<widget class="GtkMenuToolButton" id="vm-shutdown">
<property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Shutdown the virtual machine</property>
<property name="label" translatable="yes">_Shutdown</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_vm_shutdown_clicked"/>

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
# HG changeset patch
# User Cole Robinson <crobinso@redhat.com>
# Date 1254247348 14400
# Node ID 59f3d7a2ec289145c41437b7f12bcd730e17f340
# Parent 6d219a6db4fbcb343d41a959dac7a8623f3dcbb3
manager: Actually update VM state text when state changes
diff -r 6d219a6db4fb -r 59f3d7a2ec28 src/virtManager/manager.py
--- a/src/virtManager/manager.py Tue Sep 29 14:00:50 2009 -0400
+++ b/src/virtManager/manager.py Tue Sep 29 14:02:28 2009 -0400
@@ -584,6 +584,7 @@
row[ROW_STATUS] = vm.run_status()
row[ROW_STATUS_ICON] = vm.run_status_icon_large()
row[ROW_IS_VM_RUNNING] = vm.is_active()
+ row[ROW_MARKUP] = self._build_vm_markup(vm, row)
model.row_changed(row.path, row.iter)

View File

@ -0,0 +1,12 @@
diff -rup virt-manager-0.8.1/src/virtManager/uihelpers.py new/src/virtManager/uihelpers.py
--- virt-manager-0.8.1/src/virtManager/uihelpers.py 2009-12-03 16:15:01.000000000 -0500
+++ new/src/virtManager/uihelpers.py 2009-12-03 17:15:09.101994000 -0500
@@ -38,7 +38,7 @@ OPTICAL_MEDIA_KEY = 4
# may use a nonroot user, so simply changing this will cause several UI
# pieces to attempt to verify that permissions are correct. Eventually this
# should be exposed via capabilities so we can determine this programmatically.
-QEMU_SYSTEM_EMULATOR_USER = "root"
+QEMU_SYSTEM_EMULATOR_USER = "qemu"
##############################################################
# Initialize an error object to use for validation functions #

View File

@ -7,55 +7,18 @@
%define _extra_release %{?dist:%{dist}}%{!?dist:%{?extra_release:%{extra_release}}}
Name: virt-manager
Version: 0.8.0
Release: 8%{_extra_release}
Version: 0.8.1
Release: 1%{_extra_release}
Summary: Virtual Machine Manager
Group: Applications/Emulators
License: GPLv2+
URL: http://virt-manager.org/
Source0: http://virt-manager.org/download/sources/%{name}/%{name}-%{version}.tar.gz
Source1: state_paused.png
Source2: state_running.png
Source3: state_shutoff.png
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
# Fix disk XML mangling via connect/eject cdrom (bz 516116)
Patch1: %{name}-%{version}-cdrom-eject-driver.patch
# Fix delete button sensitivity (bz 518536)
Patch2: %{name}-%{version}-no-delete-active.patch
# Fix populating text box from storage browser in 'New VM' (bz 517263)
Patch3: %{name}-%{version}-newvm-storage-cb.patch
# Fix a traceback in an 'Add Hardware' error path (bz 517286)
Patch4: %{name}-%{version}-addhw-errmsg-typo.patch
# Fixes for pylint script to return nicer results on F11/F12
Patch5: %{name}-%{version}-pylint-tweak.patch
# Don't close libvirt connection for non-fatal errors (bz 522168)
Patch6: %{name}-%{version}-conn-close-exception.patch
# Manager UI tweaks
Patch7: %{name}-%{version}-manager-ui-tweaks.patch
# Generate better errors is disk/net stats polling fails
Patch8: %{name}-%{version}-stats-logging.patch
# Refresh host disk space in create wizard (bz 502777)
Patch9: %{name}-%{version}-refresh-disk-space.patch
# Offer to fix disk permission issues (bz 517379)
Patch10: %{name}-%{version}-fix-path-perms.patch
# Fix VCPU hotplug
Patch11: %{name}-%{version}-fix-vcpu-hotplug.patch
# Remove access to outdated docs (bz 522823, bz 524805)
Patch12: %{name}-%{version}-hide-help-docs.patch
# Update VM state text in manager view (bz 526182)
Patch13: %{name}-%{version}-update-vm-state.patch
# Update translations (bz 493795)
Patch14: %{name}-%{version}-update-translations.patch
# More translations (bz 493795)
Patch15: %{name}-%{version}-more-translations.patch
# Don't allow creating a volume without a name (bz 526111)
Patch16: %{name}-%{version}-createvol-name.patch
# Don't allow volume allocation > capacity (bz 526077)
Patch17: %{name}-%{version}-createvol-alloc.patch
# Add tooltips for toolbar buttons (bz 524083)
Patch18: %{name}-%{version}-toolbar-tooltips.patch
# Check QEMU permissions against the qemu user
Patch1: %{name}-%{version}-perms-qemu-user.patch
# These two are just the oldest version tested
Requires: pygtk2 >= 1.99.12-6
@ -72,12 +35,6 @@ Requires: gnome-keyring >= 0.4.9
# will work just fine - keyring functionality will simply be
# disabled
Requires: gnome-python2-gnomekeyring >= 2.15.4
Requires: gnome-python2-gnomevfs >= 2.15.4
%if 0%{?fedora} <= 9
Requires: gnome-python2
%else
Requires: gnome-python2-gnome
%endif
# Minimum we've tested with
Requires: libxml2-python >= 2.6.23
# Required to install Xen & QEMU guests
@ -120,27 +77,7 @@ management API.
%prep
%setup -q
cp %{SOURCE1} pixmaps
cp %{SOURCE2} pixmaps
cp %{SOURCE3} pixmaps
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%build
%configure
@ -214,6 +151,12 @@ fi
%{_datadir}/dbus-1/services/%{name}.service
%changelog
* Thu Dec 3 2009 Cole Robinson <crobinso@redhat.com> - 0.8.1-1.fc13
- Update to release 0.8.1
- VM Migration wizard, exposing various migration options
- Enumerate CDROM and bridge devices on remote connections
- Support storage pool source enumeration for LVM, NFS, and SCSI
* Mon Oct 05 2009 Cole Robinson <crobinso@redhat.com> - 0.8.0-8.fc13
- Don't allow creating a volume without a name (bz 526111)
- Don't allow volume allocation > capacity (bz 526077)