[virt-tools-list] [RFC Patch] Support job cancellation for migration, save functions
Wen Congyang
wency at cn.fujitsu.com
Tue Nov 30 03:54:29 UTC 2010
# HG changeset patch
# User Wen Congyang <wency at cn.fujitsu.com>
# Date 1291088831 -28800
# Node ID 5cb32ed0871c72cd715214e83df8725d74ba9e9e
# Parent b81696db7c272544f20dd62709ced7bdc9aea0a8
Support job cancellation for migration, save functions
If we cancel migration or save function, we receive a error.
I don't know how to avoid this...
diff -r b81696db7c27 -r 5cb32ed0871c src/virtManager/asyncjob.py
--- a/src/virtManager/asyncjob.py Mon Nov 29 15:00:41 2010 +0800
+++ b/src/virtManager/asyncjob.py Tue Nov 30 11:47:11 2010 +0800
@@ -40,6 +40,7 @@
class vmmAsyncJob(gobject.GObject):
def __init__(self, config, callback, args=None,
+ cancel_back=None, cancel_args=None,
text=_("Please wait a few moments..."),
title=_("Operation in progress"),
run_main=True):
@@ -50,6 +51,16 @@
self.window = gtk.glade.XML(config.get_glade_dir() + \
"/vmm-progress.glade",
"vmm-progress", domain="virt-manager")
+ self.window.signal_autoconnect({
+ "on_async_job_delete_event" : self.cancel,
+ "on_async_job_cancel_clicked" : self.cancel,
+ })
+ self.cancel_job = cancel_back
+ self.cancel_args = cancel_args
+ if self.cancel_job:
+ self.window.get_widget("cancel-async-job").set_sensitive(True)
+ else:
+ self.window.get_widget("cancel-async-job").set_sensitive(False)
self.window.get_widget("pbar-text").set_text(text)
self.topwin = self.window.get_widget("vmm-progress")
@@ -91,6 +102,10 @@
self.topwin.destroy()
+ def cancel(self, ignore1=None, ignore2=None):
+ if self.cancel_job:
+ self.cancel_job(*self.cancel_args)
+
def pulse_pbar(self, progress="", stage=None):
gtk.gdk.threads_enter()
try:
diff -r b81696db7c27 -r 5cb32ed0871c src/virtManager/domain.py
--- a/src/virtManager/domain.py Mon Nov 29 15:00:41 2010 +0800
+++ b/src/virtManager/domain.py Tue Nov 30 11:47:11 2010 +0800
@@ -1001,6 +1001,9 @@
if self.get_autostart() != val:
self._backend.setAutostart(val)
+ def abort_job(self):
+ self._backend.abortJob()
+
def migrate_set_max_downtime(self, max_downtime, flag=0):
self._backend.migrateSetMaxDowntime(max_downtime, flag)
diff -r b81696db7c27 -r 5cb32ed0871c src/virtManager/engine.py
--- a/src/virtManager/engine.py Mon Nov 29 15:00:41 2010 +0800
+++ b/src/virtManager/engine.py Tue Nov 30 11:47:11 2010 +0800
@@ -829,7 +829,7 @@
return
progWin = vmmAsyncJob(self.config, self._save_callback,
- [vm, path],
+ [vm, path], self._save_cancel, [vm],
_("Saving Virtual Machine"))
progWin.run()
error, details = progWin.get_error()
@@ -837,6 +837,10 @@
if error is not None:
src.err.show_err(_("Error saving domain: %s") % error, details)
+ def _save_cancel(self, vm):
+ vm.abort_job()
+ return
+
def _save_callback(self, vm, file_to_save, asyncjob):
try:
conn = util.dup_conn(self.config, vm.connection,
diff -r b81696db7c27 -r 5cb32ed0871c src/virtManager/migrate.py
--- a/src/virtManager/migrate.py Mon Nov 29 15:00:41 2010 +0800
+++ b/src/virtManager/migrate.py Tue Nov 30 11:47:11 2010 +0800
@@ -450,7 +450,7 @@
progWin = vmmAsyncJob(self.config, self._async_migrate,
[self.vm, destconn, uri, rate, live, secure,
- max_downtime],
+ max_downtime], self.cancel_migration, [self.vm],
title=_("Migrating VM '%s'" % self.vm.get_name()),
text=(_("Migrating VM '%s' from %s to %s. "
"This may take awhile.") %
@@ -484,6 +484,10 @@
logging.warning("Error setting migrate downtime: %s" % e)
return False
+ def cancel_migration(self, vm):
+ vm.abort_job()
+ return
+
def _async_migrate(self, origvm, origdconn, migrate_uri, rate, live,
secure, max_downtime, asyncjob):
errinfo = None
diff -r b81696db7c27 -r 5cb32ed0871c src/vmm-progress.glade
--- a/src/vmm-progress.glade Mon Nov 29 15:00:41 2010 +0800
+++ b/src/vmm-progress.glade Tue Nov 30 11:47:11 2010 +0800
@@ -12,6 +12,7 @@
<property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property>
<property name="urgency_hint">True</property>
+ <signal name="delete_event" handler="on_async_job_delete_event"/>
<child>
<widget class="GtkAlignment" id="alignment134">
<property name="visible">True</property>
@@ -82,6 +83,40 @@
<property name="position">2</property>
</packing>
</child>
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">12</property>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="cancel-async-job">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_async_job_cancel_clicked"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
</widget>
</child>
</widget>
More information about the virt-tools-list
mailing list