mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
If managed restore fails, offer to remove broken state
This commit is contained in:
parent
68e78244e8
commit
c3f08fe09a
@ -104,7 +104,7 @@ def cb_wrapper(callback, asyncjob, *args, **kwargs):
|
||||
asyncjob.set_error(str(e), "".join(traceback.format_exc()))
|
||||
|
||||
def _simple_async(callback, args, title, text, parent, errorintro,
|
||||
show_progress, simplecb):
|
||||
show_progress, simplecb, errorcb):
|
||||
"""
|
||||
@show_progress: Whether to actually show a progress dialog
|
||||
@simplecb: If true, build a callback wrapper that ignores the asyncjob
|
||||
@ -124,6 +124,9 @@ def _simple_async(callback, args, title, text, parent, errorintro,
|
||||
if error is None:
|
||||
return
|
||||
|
||||
if errorcb:
|
||||
errorcb(error, details)
|
||||
else:
|
||||
error = errorintro + ": " + error
|
||||
parent.err.show_err(error,
|
||||
details=details)
|
||||
@ -138,14 +141,15 @@ class vmmAsyncJob(vmmGObjectUI):
|
||||
|
||||
@staticmethod
|
||||
def simple_async(callback, args, title, text, parent, errorintro,
|
||||
simplecb=True):
|
||||
simplecb=True, errorcb=None):
|
||||
_simple_async(callback, args, title, text, parent, errorintro, True,
|
||||
simplecb)
|
||||
simplecb, errorcb)
|
||||
|
||||
@staticmethod
|
||||
def simple_async_noshow(callback, args, parent, errorintro, simplecb=True):
|
||||
def simple_async_noshow(callback, args, parent, errorintro,
|
||||
simplecb=True, errorcb=None):
|
||||
_simple_async(callback, args, "", "", parent, errorintro, False,
|
||||
simplecb)
|
||||
simplecb, errorcb)
|
||||
|
||||
|
||||
def __init__(self, callback, args, title, text, parent,
|
||||
@ -164,8 +168,7 @@ class vmmAsyncJob(vmmGObjectUI):
|
||||
self.async = bool(async)
|
||||
self.show_progress = bool(show_progress)
|
||||
self.cancel_job = cancel_back
|
||||
self.cancel_args = cancel_args or []
|
||||
self.cancel_args = [self] + self.cancel_args
|
||||
self.cancel_args = [self] + (cancel_args or [])
|
||||
self.job_canceled = False
|
||||
|
||||
self._error_info = None
|
||||
|
@ -1095,9 +1095,8 @@ class vmmDomain(vmmLibvirtObject):
|
||||
self.idle_add(self.force_update_status)
|
||||
|
||||
def delete(self):
|
||||
if self.hasSavedImage():
|
||||
try:
|
||||
self._backend.managedSaveRemove(0)
|
||||
self.removeSavedImage()
|
||||
except:
|
||||
logging.exception("Failed to remove managed save state")
|
||||
self._backend.undefine()
|
||||
@ -1115,6 +1114,11 @@ class vmmDomain(vmmLibvirtObject):
|
||||
return False
|
||||
return self._backend.hasManagedSaveImage(0)
|
||||
|
||||
def removeSavedImage(self):
|
||||
if not self.hasSavedImage():
|
||||
return
|
||||
self._backend.managedSaveRemove(0)
|
||||
|
||||
def save(self, filename=None, meter=None):
|
||||
self._install_abort = True
|
||||
|
||||
|
@ -873,14 +873,34 @@ class vmmEngine(vmmGObject):
|
||||
logging.debug("Starting vm '%s'", vm.get_name())
|
||||
|
||||
if vm.hasSavedImage():
|
||||
# VM will be restored, which can take some time, so show a
|
||||
# progress dialog.
|
||||
errorintro = _("Error restoring domain")
|
||||
def errorcb(error, details):
|
||||
# This is run from the main thread
|
||||
res = src.err.show_err(
|
||||
_("Error restoring domain") + ": " + error,
|
||||
details=details,
|
||||
text2=_(
|
||||
"The domain could not be restored. Would you like\n"
|
||||
"to remove the saved state and perform a regular\n"
|
||||
"start up?"),
|
||||
dialog_type=gtk.MESSAGE_WARNING,
|
||||
buttons=gtk.BUTTONS_YES_NO,
|
||||
async=False)
|
||||
|
||||
if not res:
|
||||
return
|
||||
|
||||
try:
|
||||
vm.removeSavedImage()
|
||||
self._do_run_domain(src, uri, uuid)
|
||||
except Exception, e:
|
||||
src.err.show_err(_("Error removing domain state: %s")
|
||||
% str(e))
|
||||
|
||||
# VM will be restored, which can take some time, so show progress
|
||||
title = _("Restoring Virtual Machine")
|
||||
text = _("Restoring virtual machine memory from disk")
|
||||
vmmAsyncJob.simple_async(vm.startup,
|
||||
[], title, text, src,
|
||||
errorintro)
|
||||
[], title, text, src, "", errorcb=errorcb)
|
||||
|
||||
else:
|
||||
# Regular startup
|
||||
|
Loading…
Reference in New Issue
Block a user