Centralize all generic error raising routines to vmmError. Add some error catching cases.

This commit is contained in:
Cole Robinson 2008-03-14 13:18:44 -04:00
parent 061c29c246
commit 25c8c2acc5
9 changed files with 233 additions and 316 deletions

View File

@ -63,6 +63,10 @@ class vmmAddHardware(gobject.GObject):
self._dev = None
self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-add-hardware.glade", "vmm-add-hardware", domain="virt-manager")
self.topwin = self.window.get_widget("vmm-add-hardware")
self.err = vmmErrorDialog(self.topwin,
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
self.topwin.hide()
self.window.signal_autoconnect({
"on_create_pages_switch_page" : self.page_changed,
@ -224,7 +228,12 @@ class vmmAddHardware(gobject.GObject):
def forward(self, ignore=None):
notebook = self.window.get_widget("create-pages")
if(self.validate(notebook.get_current_page()) != True):
try:
if(self.validate(notebook.get_current_page()) != True):
return
except Exception, e:
self.err.show_err(_("Uncaught error validating hardware input: %s") % str(e),
"".join(traceback.format_exc()))
return
hwtype = self.get_config_hardware_type()
@ -423,12 +432,7 @@ class vmmAddHardware(gobject.GObject):
self.add_graphics()
if self.install_error is not None:
dg = vmmErrorDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
self.install_error,
self.install_details)
dg.run()
dg.hide()
dg.destroy()
self.err.show_err(self.install_error, self.install_details)
self.topwin.set_sensitive(True)
self.topwin.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.TOP_LEFT_ARROW))
# Don't close becase we allow user to go back in wizard & correct
@ -646,20 +650,17 @@ class vmmAddHardware(gobject.GObject):
def validate(self, page_num):
if page_num == PAGE_INTRO:
if self.get_config_hardware_type() == None:
self._validation_error_box(_("Hardware Type Required"), \
_("You must specify what type of hardware to add"))
return False
return self.err.val_err(_("Hardware Type Required"), \
_("You must specify what type of hardware to add"))
elif page_num == PAGE_DISK:
path = self.get_config_disk_image()
if path == None or len(path) == 0:
self._validation_error_box(_("Storage Path Required"), \
_("You must specify a partition or a file for disk storage."))
return False
return self.err.val_err(_("Storage Path Required"), \
_("You must specify a partition or a file for disk storage."))
if self.window.get_widget("target-device").get_active() == -1:
self._validation_error_box(_("Target Device Required"),
_("You must select a target device for the disk"))
return False
return self.err.val_err(_("Target Device Required"),
_("You must select a target device for the disk"))
node, nodemax, device = self.get_config_disk_target()
if self.window.get_widget("storage-partition").get_active():
@ -672,8 +673,8 @@ class vmmAddHardware(gobject.GObject):
if not os.path.exists(path):
dir = os.path.dirname(os.path.abspath(path))
if not os.path.exists(dir):
self._validation_error_box(_("Storage Path Does not exist"),
_("The directory %s containing the disk image does not exist") % dir)
self.err.val_err(_("Storage Path Does not exist"),
_("The directory %s containing the disk image does not exist") % dir)
return False
else:
vfs = os.statvfs(dir)
@ -681,14 +682,12 @@ class vmmAddHardware(gobject.GObject):
need = size * 1024 * 1024
if need > avail:
if self.is_sparse_file():
res = self._yes_no_box(_("Not Enough Free Space"),
_("The filesystem will not have enough free space to fully allocate the sparse file when the guest is running. Use this path anyway?"))
if not res:
if not self.err.yes_no(_("Not Enough Free Space"),
_("The filesystem will not have enough free space to fully allocate the sparse file when the guest is running. Use this path anyway?")):
return False
else:
self._validation_error_box(_("Not Enough Free Space"),
_("There is not enough free space to create the disk"))
return False
return self.err.val_err(_("Not Enough Free Space"),
_("There is not enough free space to create the disk"))
# Build disk object
filesize = self.get_config_disk_size()
@ -709,41 +708,35 @@ class vmmAddHardware(gobject.GObject):
not self.vm.is_hvm() and virtinst.util.is_blktap_capable():
self._dev.driver_name = virtinst.VirtualDisk.DRIVER_TAP
except ValueError, e:
self._validation_error_box(_("Invalid Storage Parameters"), \
str(e))
return False
return self.err.val_err(_("Invalid Storage Parameters"), str(e))
if self._dev.is_conflict_disk(self.vm.get_connection().vmm) is True:
res = self._yes_no_box(_('Disk "%s" is already in use by another guest!' % self._dev), \
_("Do you really want to use the disk ?"))
res = self.err.yes_no(_('Disk "%s" is already in use by another guest!' % self._dev), \
_("Do you really want to use the disk ?"))
return res
elif page_num == PAGE_NETWORK:
net = self.get_config_network()
if self.window.get_widget("net-type-network").get_active():
if self.window.get_widget("net-network").get_active() == -1:
self._validation_error_box(_("Virtual Network Required"),
_("You must select one of the virtual networks"))
return False
return self.err.val_err(_("Virtual Network Required"),
_("You must select one of the virtual networks"))
else:
if self.window.get_widget("net-device").get_active() == -1:
self._validation_error_box(_("Physical Device Required"),
_("You must select one of the physical devices"))
return False
return self.err.val_err(_("Physical Device Required"),
_("You must select one of the physical devices"))
mac = self.get_config_macaddr()
if self.window.get_widget("mac-address").get_active():
if mac is None or len(mac) == 0:
self._validation_error_box(_("Invalid MAC address"), \
_("No MAC address was entered. Please enter a valid MAC address."))
return False
return self.err.val_err(_("Invalid MAC address"), \
_("No MAC address was entered. Please enter a valid MAC address."))
try:
self._dev = virtinst.VirtualNetworkInterface(macaddr=mac)
except ValueError, e:
self._validation_error_box(_("Invalid MAC address"), \
str(e))
return False
return self.err.val_err(_("Invalid MAC address"), str(e))
try:
if net[0] == "bridge":
@ -757,46 +750,19 @@ class vmmAddHardware(gobject.GObject):
else:
raise ValueError, _("Unsupported networking type") + net[0]
except ValueError, e:
self._validation_error_box(_("Invalid Network Parameter"), \
str(e))
return False
return self.err.val_err(_("Invalid Network Parameter"), \
str(e))
conflict = self._dev.is_conflict_net(self.vm.get_connection().vmm)
if conflict[0]:
return self._validation_error_box(_("Mac address collision"),\
conflict[1])
return self.err.val_err(_("Mac address collision"),\
conflict[1])
elif conflict[1] is not None:
return self._yes_no_box(_("Mac address collision"),\
conflict[1] + " " + _("Are you sure you want to use this address?"))
return self.err.yes_no(_("Mac address collision"),\
conflict[1] + " " + _("Are you sure you want to use this address?"))
return True
def _validation_error_box(self, text1, text2=None):
message_box = gtk.MessageDialog(self.window.get_widget("vmm-add-hardware"), \
0, \
gtk.MESSAGE_ERROR, \
gtk.BUTTONS_OK, \
text1)
if text2 != None:
message_box.format_secondary_text(text2)
message_box.run()
message_box.destroy()
def _yes_no_box(self, text1, text2=None):
message_box = gtk.MessageDialog(self.window.get_widget("vmm-add-hardware"), \
0, \
gtk.MESSAGE_WARNING, \
gtk.BUTTONS_YES_NO, \
text1)
if text2 != None:
message_box.format_secondary_text(text2)
if message_box.run()== gtk.RESPONSE_YES:
res = True
else:
res = False
message_box.destroy()
return res
def populate_network_model(self, model):
model.clear()
for uuid in self.vm.get_connection().list_net_uuids():

View File

@ -22,6 +22,7 @@ import gobject
import logging
import virtinst
from virtManager.opticalhelper import vmmOpticalDriveHelper
from virtManager.error import vmmErrorDialog
class vmmChooseCD(gobject.GObject):
__gsignals__ = {"cdrom-chosen": (gobject.SIGNAL_RUN_FIRST,
@ -31,6 +32,10 @@ class vmmChooseCD(gobject.GObject):
def __init__(self, config, target):
self.__gobject_init__()
self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-choose-cd.glade", "vmm-choose-cd", domain="virt-manager")
self.err = vmmErrorDialog(self.window.get_widget("vmm-choose-cd"),
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
self.config = config
self.window.get_widget("vmm-choose-cd").hide()
self.target = target
@ -87,16 +92,13 @@ class vmmChooseCD(gobject.GObject):
path = model.get_value(cd.get_active_iter(), 0)
if path == "" or path == None:
self._validation_error_box(_("Invalid Media Path"), \
_("A media path must be specified."))
return
return self.err.val_err(_("Invalid Media Path"), \
_("A media path must be specified."))
try:
disk = virtinst.VirtualDisk(path=path, device=virtinst.VirtualDisk.DEVICE_CDROM, readOnly=True)
except Exception, e:
self._validation_error_box(_("Invalid Media Path"), str(e))
return
return self.err.val_err(_("Invalid Media Path"), str(e))
self.emit("cdrom-chosen", disk.type, disk.path, self.target)
self.close()
@ -141,16 +143,5 @@ class vmmChooseCD(gobject.GObject):
else:
fcdialog.destroy()
return None
def _validation_error_box(self, text1, text2=None):
message_box = gtk.MessageDialog(self.window.get_widget("vmm-choosecd"), \
0, \
gtk.MESSAGE_ERROR, \
gtk.BUTTONS_OK, \
text1)
if text2 != None:
message_box.format_secondary_text(text2)
message_box.run()
message_box.destroy()
gobject.type_register(vmmChooseCD)

View File

@ -30,8 +30,6 @@ import gtkvnc
import os
import socket
from virtManager.error import vmmErrorDialog
PAGE_UNAVAILABLE = 0
PAGE_SCREENSHOT = 1
PAGE_AUTHENTICATE = 2

View File

@ -85,6 +85,10 @@ class vmmCreate(gobject.GObject):
self.connection = connection
self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-create.glade", "vmm-create", domain="virt-manager")
self.topwin = self.window.get_widget("vmm-create")
self.err = vmmErrorDialog(self.topwin,
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
self.topwin.hide()
self.window.signal_autoconnect({
"on_create_pages_switch_page" : self.page_changed,
@ -288,7 +292,12 @@ class vmmCreate(gobject.GObject):
def forward(self, ignore=None):
notebook = self.window.get_widget("create-pages")
if(self.validate(notebook.get_current_page()) != True):
try:
if(self.validate(notebook.get_current_page()) != True):
return
except Exception, e:
self.err.show_err(_("Uncaught error validating input: %s") % str(e),
"".join(traceback.format_exc()))
return
if notebook.get_current_page() == PAGE_INST:
@ -547,14 +556,14 @@ class vmmCreate(gobject.GObject):
try:
guest.uuid = virtinst.util.uuidToString(virtinst.util.randomUUID())
except ValueError, E:
self._validation_error_box(_("UUID Error"), str(e))
return self.err.val_err(_("UUID Error"), str(e))
# HACK: If usermode, and no nic is setup, use usermode networking
if self.connection.get_uri() == "qemu:///session":
try:
self._net = virtinst.VirtualNetworkInterface(type="user")
except ValueError, e:
self._validation_error_box(_("Failed to set up usermode networking"), str(e))
return self.err.val_err(_("Failed to set up usermode networking"), str(e))
if self._disk is not None:
guest.disks = [self._disk]
@ -809,8 +818,7 @@ class vmmCreate(gobject.GObject):
try:
self._guest.name = name
except ValueError, e:
self._validation_error_box(_("Invalid System Name"), str(e))
return False
return self.err.val_err(_("Invalid System Name"), str(e))
elif page_num == PAGE_TYPE:
# Set up appropriate guest object dependent on selected type
@ -838,16 +846,14 @@ class vmmCreate(gobject.GObject):
logging.debug("OS Type: %s" % self.get_config_os_type())
self._guest.os_type = self.get_config_os_type()
except ValueError, e:
self._validation_error_box(_("Invalid FV OS Type"), str(e))
return False
return self.err.val_err(_("Invalid FV OS Type"), str(e))
try:
if self.get_config_os_variant() is not None \
and self.get_config_os_type() != "generic":
logging.debug("OS Variant: %s" % self.get_config_os_variant())
self._guest.os_variant = self.get_config_os_variant()
except ValueError, e:
self._validation_error_box(_("Invalid FV OS Variant"), str(e))
return False
return self.err.val_err(_("Invalid FV OS Variant"), str(e))
elif page_num == PAGE_INST_LOCAL:
if self.get_config_method() == VM_PARA_VIRT:
os_type = "xen"
@ -861,32 +867,28 @@ class vmmCreate(gobject.GObject):
try:
self._guest.cdrom = src
except ValueError, e:
self._validation_error_box(_("ISO Path Not Found"), str(e))
return False
return self.err.val_err(_("ISO Path Not Found"), str(e))
else:
cdlist = self.window.get_widget("cd-path")
src = self.get_config_install_source()
try:
self._guest.cdrom = src
except ValueError, e:
self._validation_error_box(_("CD-ROM Path Error"), str(e))
return False
return self.err.val_err(_("CD-ROM Path Error"), str(e))
elif page_num == PAGE_INST_TREE:
src = self.get_config_install_source()
try:
self._guest.location = src
except ValueError, e:
self._validation_error_box(_("Invalid Install URL"), str(e))
return False
return self.err.val_err(_("Invalid Install URL"), str(e))
ks = self.get_config_kickstart_source()
if ks is not None and len(ks) != 0:
if not (ks.startswith("http://") or ks.startswith("ftp://") \
or ks.startswith("nfs:")):
self._validation_error_box(_("Kickstart URL Error"), \
_("Kickstart location must be an NFS, HTTP or FTP source"))
return False
return self.err.val_err(_("Kickstart URL Error"), \
_("Kickstart location must be an NFS, HTTP or FTP source"))
else:
self._guest.extraargs = "ks=%s" % (ks,)
@ -902,9 +904,8 @@ class vmmCreate(gobject.GObject):
disk = self.get_config_disk_image()
if disk == None or len(disk) == 0:
self._validation_error_box(_("Storage Address Required"), \
_("You must specify a partition or a file for storage for the guest install"))
return False
return self.err.val_err(_("Storage Address Required"), \
_("You must specify a partition or a file for storage for the guest install"))
if not self.window.get_widget("storage-partition").get_active():
disk = self.get_config_disk_image()
@ -912,23 +913,21 @@ class vmmCreate(gobject.GObject):
if not os.path.exists(disk):
dir = os.path.dirname(os.path.abspath(disk))
if not os.path.exists(dir):
self._validation_error_box(_("Storage Path Does not exist"),
_("The directory %s containing the disk image does not exist") % dir)
return False
return self.err.val_err(_("Storage Path Does not exist"),
_("The directory %s containing the disk image does not exist") % dir)
else:
vfs = os.statvfs(dir)
avail = vfs[statvfs.F_FRSIZE] * vfs[statvfs.F_BAVAIL]
need = size * 1024 * 1024
if need > avail:
if self.is_sparse_file():
res = self._yes_no_box(_("Not Enough Free Space"),
_("The filesystem will not have enough free space to fully allocate the sparse file when the guest is running. Use this path anyway?"))
res = self.err.yes_no(_("Not Enough Free Space"),
_("The filesystem will not have enough free space to fully allocate the sparse file when the guest is running. Use this path anyway?"))
if not res:
return False
else:
self._validation_error_box(_("Not Enough Free Space"),
_("There is not enough free space to create the disk"))
return False
return self.err.val_err(_("Not Enough Free Space"),
_("There is not enough free space to create the disk"))
# Attempt to set disk
filesize = None
@ -957,35 +956,30 @@ class vmmCreate(gobject.GObject):
else:
self.non_sparse = False
except ValueError, e:
self._validation_error_box(_("Invalid Storage Address"), \
str(e))
return False
return self.err.val_err(_("Invalid Storage Address"), str(e))
if self._disk.is_conflict_disk(self.connection.vmm) is True:
res = self._yes_no_box(_('Disk "%s" is already in use by another guest!' % disk), _("Do you really want to use the disk ?"))
res = self.err.yes_no(_('Disk "%s" is already in use by another guest!' % disk), _("Do you really want to use the disk ?"))
return res
elif page_num == PAGE_NETWORK:
if self.window.get_widget("net-type-network").get_active():
if self.window.get_widget("net-network").get_active() == -1:
self._validation_error_box(_("Virtual Network Required"),
_("You must select one of the virtual networks"))
return False
return self.err.val_err(_("Virtual Network Required"),
_("You must select one of the virtual networks"))
else:
if self.window.get_widget("net-device").get_active() == -1:
self._validation_error_box(_("Physical Device Required"),
_("You must select one of the physical devices"))
return False
return self.err.val_err(_("Physical Device Required"),
_("You must select one of the physical devices"))
net = self.get_config_network()
if self.window.get_widget("mac-address").get_active():
mac = self.window.get_widget("create-mac-address").get_text()
if mac is None or len(mac) == 0:
self._validation_error_box(_("Invalid MAC address"), \
_("No MAC address was entered. Please enter a valid MAC address."))
return False
return self.err.val_err(_("Invalid MAC address"), \
_("No MAC address was entered. Please enter a valid MAC address."))
else:
mac = None
@ -1002,16 +996,13 @@ class vmmCreate(gobject.GObject):
self._net = virtinst.VirtualNetworkInterface(macaddr=mac, \
type=net[0])
except ValueError, e:
self._validation_error_box(_("Network Parameter Error"), \
str(e))
return False
return self.err.val_err(_("Network Parameter Error"), str(e))
conflict = self._net.is_conflict_net(self.connection.vmm)
if conflict[0]:
return self._validation_error_box(_("Mac address collision"),\
conflict[1])
return self.err.val_err(_("Mac address collision"), conflict[1])
elif conflict[1] is not None:
return self._yes_no_box(_("Mac address collision"),\
return self.err.yes_no(_("Mac address collision"),\
conflict[1] + " " + _("Are you sure you want to use this address?"))
elif page_num == PAGE_CPUMEM:
@ -1020,54 +1011,22 @@ class vmmCreate(gobject.GObject):
try:
self._guest.vcpus = int(self.get_config_virtual_cpus())
except ValueError, e:
self._validation_error_box(_("VCPU Count Error"), \
str(e))
return False
return self.err.val_err(_("VCPU Count Error"), str(e))
# Set Memory
try:
self._guest.memory = int(self.get_config_initial_memory())
except ValueError, e:
self._validation_error_box(_("Memory Amount Error"), \
str(e))
return False
return self.err.val_err(_("Memory Amount Error"), str(e))
# Set Max Memory
try:
self._guest.maxmemory = int(self.get_config_maximum_memory())
except ValueError, e:
self._validation_error_box(_("Max Memory Amount Error"), \
str(e))
return False
return self.err.val_err(_("Max Memory Amount Error"), str(e))
# do this always, since there's no "leaving a notebook page" event.
self.window.get_widget("create-back").set_sensitive(True)
return True
def _validation_error_box(self, text1, text2=None):
message_box = gtk.MessageDialog(self.window.get_widget("vmm-create"), \
0, \
gtk.MESSAGE_ERROR, \
gtk.BUTTONS_OK, \
text1)
if text2 != None:
message_box.format_secondary_text(text2)
message_box.run()
message_box.destroy()
def _yes_no_box(self, text1, text2=None):
#import pdb; pdb.set_trace()
message_box = gtk.MessageDialog(self.window.get_widget("vmm-create"), \
0, \
gtk.MESSAGE_WARNING, \
gtk.BUTTONS_YES_NO, \
text1)
if text2 != None:
message_box.format_secondary_text(text2)
if message_box.run()== gtk.RESPONSE_YES:
res = True
else:
res = False
message_box.destroy()
return res
def populate_url_model(self, model, urls):
model.clear()
for url in urls:

View File

@ -28,8 +28,10 @@ import os, sys
import logging
import dbus
import re
import traceback
from virtManager.IPy import IP
from virtManager.error import vmmErrorDialog
PAGE_INTRO = 0
PAGE_NAME = 1
@ -50,6 +52,10 @@ class vmmCreateNetwork(gobject.GObject):
self.conn = conn
self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-create-net.glade", "vmm-create-net", domain="virt-manager")
self.topwin = self.window.get_widget("vmm-create-net")
self.err = vmmErrorDialog(self.topwin,
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
self.topwin.hide()
self.window.signal_autoconnect({
"on_create_pages_switch_page" : self.page_changed,
@ -295,41 +301,40 @@ class vmmCreateNetwork(gobject.GObject):
logging.debug("About to create network " + xml)
self.conn.create_network(xml)
try:
self.conn.create_network(xml)
except Exception, e:
self.err.show_err(_("Error creating virtual network: %s" % str(e)),
"".join(traceback.format_exc()))
self.close()
def validate(self, page_num):
if page_num == PAGE_NAME:
name = self.window.get_widget("net-name").get_text()
if len(name) > 50 or len(name) == 0:
self._validation_error_box(_("Invalid Network Name"), \
_("Network name must be non-blank and less than 50 characters"))
return False
return self.err.val_err(_("Invalid Network Name"), \
_("Network name must be non-blank and less than 50 characters"))
if re.match("^[a-zA-Z0-9_]*$", name) == None:
self._validation_error_box(_("Invalid Network Name"), \
_("Network name may contain alphanumeric and '_' characters only"))
return False
return self.err.val_err(_("Invalid Network Name"), \
_("Network name may contain alphanumeric and '_' characters only"))
elif page_num == PAGE_IPV4:
ip = self.get_config_ip4()
if ip is None:
self._validation_error_box(_("Invalid Network Address"), \
_("The network address could not be understood"))
return False
return self.err.val_err(_("Invalid Network Address"), \
_("The network address could not be understood"))
if ip.version() != 4:
self._validation_error_box(_("Invalid Network Address"), \
_("The network must be an IPv4 address"))
return False
return self.err.val_err(_("Invalid Network Address"), \
_("The network must be an IPv4 address"))
if ip.len() < 16:
self._validation_error_box(_("Invalid Network Address"), \
_("The network prefix must be at least /4 (16 addresses)"))
return False
return self.err.val_err(_("Invalid Network Address"), \
_("The network prefix must be at least /4 (16 addresses)"))
if ip.iptype() != "PRIVATE":
res = self._yes_no_box(_("Check Network Address"), \
res = self.err.yes_no(_("Check Network Address"), \
_("The network should normally use a private IPv4 address. Use this non-private address anyway?"))
if not res:
return False
@ -339,60 +344,29 @@ class vmmCreateNetwork(gobject.GObject):
end = self.get_config_dhcp_end()
if start is None:
self._validation_error_box(_("Invalid DHCP Address"), \
_("The DHCP start address could not be understood"))
return False
return self.err.val_err(_("Invalid DHCP Address"), \
_("The DHCP start address could not be understood"))
if end is None:
self._validation_error_box(_("Invalid DHCP Address"), \
_("The DHCP end address could not be understood"))
return False
return self.err.val_err(_("Invalid DHCP Address"), \
_("The DHCP end address could not be understood"))
if not ip.overlaps(start):
self._validation_error_box(_("Invalid DHCP Address"), \
_("The DHCP start address is not with the network %s") % (str(ip)))
return False
return self.err.val_err(_("Invalid DHCP Address"), \
_("The DHCP start address is not with the network %s") % (str(ip)))
if not ip.overlaps(end):
self._validation_error_box(_("Invalid DHCP Address"), \
_("The DHCP end address is not with the network %s") % (str(ip)))
return False
return self.err.val_err(_("Invalid DHCP Address"), \
_("The DHCP end address is not with the network %s") % (str(ip)))
elif page_num == PAGE_FORWARDING:
if self.window.get_widget("net-forward-dev").get_active():
dev = self.window.get_widget("net-forward")
if dev.get_active() == -1:
self._validation_error_box(_("Invalid forwarding mode"), \
_("Please select where the traffic should be forwarded"))
return False
return self.err.val_err(_("Invalid forwarding mode"), \
_("Please select where the traffic should be forwarded"))
# do this always, since there's no "leaving a notebook page" event.
self.window.get_widget("create-back").set_sensitive(True)
return True
def _validation_error_box(self, text1, text2=None):
message_box = gtk.MessageDialog(self.window.get_widget("vmm-create-net"), \
0, \
gtk.MESSAGE_ERROR, \
gtk.BUTTONS_OK, \
text1)
if text2 != None:
message_box.format_secondary_text(text2)
message_box.run()
message_box.destroy()
def _yes_no_box(self, text1, text2=None):
message_box = gtk.MessageDialog(self.window.get_widget("vmm-create-net"), \
0, \
gtk.MESSAGE_WARNING, \
gtk.BUTTONS_YES_NO, \
text1)
if text2 != None:
message_box.format_secondary_text(text2)
if message_box.run()== gtk.RESPONSE_YES:
res = True
else:
res = False
message_box.destroy()
return res
def populate_opt_media(self, model):
# get a list of optical devices with data discs in, for FV installs
vollabel = {}

View File

@ -81,6 +81,10 @@ class vmmDetails(gobject.GObject):
self.vm = vm
topwin = self.window.get_widget("vmm-details")
self.err = vmmErrorDialog(topwin,
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
topwin.hide()
topwin.set_title(self.vm.get_name() + " " + topwin.get_title())
@ -587,16 +591,16 @@ class vmmDetails(gobject.GObject):
try:
self.vm.set_autostart(auto.get_active())
except Exception, e:
self._err_dialog(_("Error changing autostart value: %s") % \
str(e), "".join(traceback.format_exc()))
self.err.show_err(_("Error changing autostart value: %s") % \
str(e), "".join(traceback.format_exc()))
if boot.get_property("sensitive"):
try:
self.vm.set_boot_device(boot.get_model()[boot.get_active()][2])
self.window.get_widget("config-boot-options-apply").set_sensitive(False)
except Exception, e:
self._err_dialog(_("Error changing boot device: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error changing boot device: %s" % str(e)),
"".join(traceback.format_exc()))
return
def remove_disk(self, src):
@ -624,9 +628,9 @@ class vmmDetails(gobject.GObject):
else:
vnic = virtinst.VirtualNetworkInterface(type=netinfo[0], macaddr=netinfo[3])
except ValueError, e:
self.err_dialog(_("Error Removing Network: %s" % str(e)),
"".join(traceback.format_exc()))
return
self.err.show_err(_("Error Removing Network: %s" % str(e)),
"".join(traceback.format_exc()))
return False
xml = vnic.get_xml_config()
self.remove_device(xml)
@ -859,8 +863,8 @@ class vmmDetails(gobject.GObject):
try:
self.vm.disconnect_cdrom_device(self.window.get_widget("disk-target-device").get_text())
except Exception, e:
self._err_dialog(_("Error Removing CDROM: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error Removing CDROM: %s" % str(e)),
"".join(traceback.format_exc()))
return
else:
@ -876,21 +880,14 @@ class vmmDetails(gobject.GObject):
try:
self.vm.connect_cdrom_device(type, source, target)
except Exception, e:
self._err_dialog(_("Error Connecting CDROM: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error Connecting CDROM: %s" % str(e)),
"".join(traceback.format_exc()))
def remove_device(self, xml):
try:
self.vm.remove_device(xml)
except Exception, e:
self._err_dialog(_("Error Removing Device: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error Removing Device: %s" % str(e)),
"".join(traceback.format_exc()))
def _err_dialog(self, summary, details):
dg = vmmErrorDialog(None, 0, gtk.MESSAGE_ERROR,
gtk.BUTTONS_CLOSE, summary, details)
dg.run()
dg.hide()
dg.destroy()
gobject.type_register(vmmDetails)

View File

@ -55,6 +55,10 @@ class vmmEngine(gobject.GObject):
self.windowCreate = None
self.windowManager = None
self.connections = {}
self.err = vmmErrorDialog(None,
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
self.timer = None
self.last_timeout = 0
@ -298,17 +302,21 @@ class vmmEngine(gobject.GObject):
con = self.get_connection(uri)
if not(self.connections[uri]["windowDetails"].has_key(uuid)):
details = vmmDetails(self.get_config(),
con.get_vm(uuid))
details.connect("action-show-console", self._do_show_console)
details.connect("action-show-terminal", self._do_show_terminal)
details.connect("action-save-domain", self._do_save_domain)
details.connect("action-destroy-domain", self._do_destroy_domain)
details.connect("action-show-help", self._do_show_help)
details.connect("action-suspend-domain", self._do_suspend_domain)
details.connect("action-resume-domain", self._do_resume_domain)
details.connect("action-run-domain", self._do_run_domain)
details.connect("action-shutdown-domain", self._do_shutdown_domain)
try:
details = vmmDetails(self.get_config(),
con.get_vm(uuid))
details.connect("action-show-console", self._do_show_console)
details.connect("action-show-terminal", self._do_show_terminal)
details.connect("action-save-domain", self._do_save_domain)
details.connect("action-destroy-domain", self._do_destroy_domain)
details.connect("action-show-help", self._do_show_help)
details.connect("action-suspend-domain", self._do_suspend_domain)
details.connect("action-resume-domain", self._do_resume_domain)
details.connect("action-run-domain", self._do_run_domain)
details.connect("action-shutdown-domain", self._do_shutdown_domain)
except Exception, e:
self.err.show_err(_("Error bringing up domain details: %s") % str(e),
"".join(traceback.format_exc()))
self.connections[uri]["windowDetails"][uuid] = details
self.connections[uri]["windowDetails"][uuid].show()
return self.connections[uri]["windowDetails"][uuid]
@ -425,7 +433,7 @@ class vmmEngine(gobject.GObject):
self.fcdialog.destroy()
if self._save_callback_info != []:
self._err_dialog(_("Error saving domain: %s" % self._save_callback_info[0]), self._save_callback_info[1])
self.err.show_err(_("Error saving domain: %s" % self._save_callback_info[0]), self._save_callback_info[1])
self._save_callback_info = []
def _save_callback(self, vm, file_to_save, ignore1=None):
@ -455,7 +463,7 @@ class vmmEngine(gobject.GObject):
try:
vm.destroy()
except Exception, e:
self._err_dialog(_("Error shutting down domain: %s" % str(e)), "".join(traceback.format_exc()))
self.err.show_err(_("Error shutting down domain: %s" % str(e)), "".join(traceback.format_exc()))
def suspend_domain(self, src, uri, uuid):
con = self.get_connection(uri, False)
@ -471,8 +479,8 @@ class vmmEngine(gobject.GObject):
try:
vm.suspend()
except Exception, e:
self._err_dialog(_("Error pausing domain: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error pausing domain: %s" % str(e)),
"".join(traceback.format_exc()))
def resume_domain(self, src, uri, uuid):
con = self.get_connection(uri, False)
@ -486,8 +494,8 @@ class vmmEngine(gobject.GObject):
try:
vm.resume()
except Exception, e:
self._err_dialog(_("Error unpausing domain: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error unpausing domain: %s" % str(e)),
"".join(traceback.format_exc()))
else:
logging.warning("Resume requested, but machine is already running")
@ -501,8 +509,8 @@ class vmmEngine(gobject.GObject):
try:
vm.startup()
except Exception, e:
self._err_dialog(_("Error starting domain: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error starting domain: %s" % str(e)),
"".join(traceback.format_exc()))
def shutdown_domain(self, src, uri, uuid):
con = self.get_connection(uri, False)
@ -514,16 +522,9 @@ class vmmEngine(gobject.GObject):
try:
vm.shutdown()
except Exception, e:
self._err_dialog(_("Error shutting down domain: %s" % str(e)),
"".join(traceback.format_exc()))
self.err.show_err(_("Error shutting down domain: %s" % str(e)),
"".join(traceback.format_exc()))
else:
logging.warning("Shutdown requested, but machine is already shutting down / shutoff")
def _err_dialog(self, summary, details):
dg = vmmErrorDialog(None, 0, gtk.MESSAGE_ERROR,
gtk.BUTTONS_CLOSE, summary, details)
dg.run()
dg.hide()
dg.destroy()
gobject.type_register(vmmEngine)

View File

@ -24,21 +24,27 @@ import pango
class vmmErrorDialog (gtk.MessageDialog):
def __init__ (self, parent=None, flags=0, type=gtk.MESSAGE_INFO,
buttons=gtk.BUTTONS_NONE, message_format=None,
message_details=None):
message_details=None, default_title=_("Error")):
gtk.MessageDialog.__init__ (self,
parent, flags, type, buttons,
message_format)
self.message_format = message_format
self.message_details = message_details
self.buffer = None
self.default_title = default_title
self.set_title(self.default_title)
self.set_property("text", self.message_format)
if not message_details is None:
# Expander section with details.
expander = gtk.Expander (_("Details"))
buffer = gtk.TextBuffer ()
buffer.set_text (message_details)
self.buffer = gtk.TextBuffer ()
self.buffer.set_text (self.message_details)
sw = gtk.ScrolledWindow ()
sw.set_shadow_type (gtk.SHADOW_IN)
sw.set_size_request (400, 240)
sw.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
details = gtk.TextView (buffer)
details = gtk.TextView (self.buffer)
details.set_editable (False)
details.set_overwrite (False)
details.set_cursor_visible (False)
@ -49,3 +55,37 @@ class vmmErrorDialog (gtk.MessageDialog):
sw.show ()
self.vbox.pack_start (expander)
expander.show ()
def show_err(self, summary, details, title=None):
if title is None:
title = self.default_title
self.set_title(title)
self.set_property("text", summary)
self.buffer.set_text(details)
self.run()
self.hide()
def val_err(self, text1, text2=None, title=None):
message_box = gtk.MessageDialog(self.parent, 0, gtk.MESSAGE_ERROR,\
gtk.BUTTONS_OK, text1)
if title is None:
title = _("Input Error")
message_box.set_title(title)
if text2 is not None:
message_box.format_secondary_text(text2)
message_box.run()
message_box.destroy()
return False
def yes_no(self, text1, text2=None):
message_box = gtk.MessageDialog(self.parent, 0, gtk.MESSAGE_WARNING, \
gtk.BUTTONS_YES_NO, text1)
if text2 != None:
message_box.format_secondary_text(text2)
if message_box.run()== gtk.RESPONSE_YES:
res = True
else:
res = False
message_box.destroy()
return res

View File

@ -100,6 +100,10 @@ class vmmManager(gobject.GObject):
def __init__(self, config, engine):
self.__gobject_init__()
self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-manager.glade", "vmm-manager", domain="virt-manager")
self.err = vmmErrorDialog(self.window.get_widget("vmm-manager"),
0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
_("Unexpected Error"),
_("An unexpected error occurred"))
self.config = config
self.engine = engine
self.connections = {}
@ -775,8 +779,8 @@ class vmmManager(gobject.GObject):
try:
vm.delete()
except Exception, e:
self._err_dialog(_("Error deleting domain: %s" % str(e)),\
"".join(traceback.format_exc()))
self.err.show_err(_("Error deleting domain: %s" % str(e)),\
"".join(traceback.format_exc()))
conn.tick(noStatsUpdate=True)
def show_about(self, src):
@ -1036,30 +1040,17 @@ class vmmManager(gobject.GObject):
def _connect_error(self, conn, details):
if conn.get_driver() == "xen" and not conn.is_remote():
dg = vmmErrorDialog (None, 0, gtk.MESSAGE_ERROR,
gtk.BUTTONS_CLOSE,
_("Unable to open a connection to the Xen hypervisor/daemon.\n\n" +
"Verify that:\n" +
" - A Xen host kernel was booted\n" +
" - The Xen service has been started\n"),
details)
self.err.show_err(_("Unable to open a connection to the Xen hypervisor/daemon.\n\n" +
"Verify that:\n" +
" - A Xen host kernel was booted\n" +
" - The Xen service has been started\n"),
details,
title=_("Virtual Machine Manager Connection Failure"))
else:
dg = vmmErrorDialog (None, 0, gtk.MESSAGE_ERROR,
gtk.BUTTONS_CLOSE,
_("Unable to open a connection to the libvirt management daemon.\n\n" +
"Verify that:\n" +
" - The 'libvirtd' daemon has been started\n"),
details)
dg.set_title(_("Virtual Machine Manager Connection Failure"))
dg.run()
dg.hide()
dg.destroy()
def _err_dialog(self, summary, details):
dg = vmmErrorDialog(None, 0, gtk.MESSAGE_ERROR,
gtk.BUTTONS_CLOSE, summary, details)
dg.run()
dg.hide()
dg.destroy()
self.err.show_err(_("Unable to open a connection to the libvirt management daemon.\n\n" +
"Verify that:\n" +
" - The 'libvirtd' daemon has been started\n"),
details,
title=_("Virtual Machine Manager Connection Failure"))
gobject.type_register(vmmManager)