mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-10 23:45:49 -06:00
Centralize all generic error raising routines to vmmError. Add some error catching cases.
This commit is contained in:
parent
061c29c246
commit
25c8c2acc5
@ -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():
|
||||
|
@ -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)
|
||||
|
@ -30,8 +30,6 @@ import gtkvnc
|
||||
import os
|
||||
import socket
|
||||
|
||||
from virtManager.error import vmmErrorDialog
|
||||
|
||||
PAGE_UNAVAILABLE = 0
|
||||
PAGE_SCREENSHOT = 1
|
||||
PAGE_AUTHENTICATE = 2
|
||||
|
@ -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:
|
||||
|
@ -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 = {}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user