When using QMP monitor as the sole monitor on KVM autotest
(something that we sadly did not exercise on our test farms),
starting qemu with -S and then issuing 'cont' will cause
errors, since the error treatment with QMP monitors is more
strict [1]. Take advantage of the fact that error treatment
with the QMP json structures is much easier, and handle
failures during migration accordingly.

With this patch, migration works properly using only QMP
monitors.

[1] This means we probably should be more rigorous treating
Human Monitor errors, but that's going to be handled later.

CC: Qingtang Zhou <qz...@redhat.com>
CC: Gerd Hoffmann <kra...@redhat.com>
Signed-off-by: Lucas Meneghel Rodrigues <l...@redhat.com>
---
 client/virt/kvm_monitor.py |  8 +++++++-
 client/virt/kvm_vm.py      | 10 +++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/client/virt/kvm_monitor.py b/client/virt/kvm_monitor.py
index 8b5e251..9d8ed87 100644
--- a/client/virt/kvm_monitor.py
+++ b/client/virt/kvm_monitor.py
@@ -1152,7 +1152,13 @@ class QMPMonitor(Monitor):
         args = {"uri": uri,
                 "blk": full_copy,
                 "inc": incremental_copy}
-        return self.cmd("migrate", args)
+        try:
+            return self.cmd("migrate", args)
+        except QMPCmdError, e:
+            if e.data['class'] == 'SockConnectInprogress':
+                logging.debug("Migrate socket connection still 
initializing...")
+            else:
+                raise e
 
 
     def migrate_set_speed(self, value):
diff --git a/client/virt/kvm_vm.py b/client/virt/kvm_vm.py
index 871b824..19d018d 100644
--- a/client/virt/kvm_vm.py
+++ b/client/virt/kvm_vm.py
@@ -1743,7 +1743,15 @@ class VM(virt_vm.BaseVM):
                     output_params=(outfile,))
 
             # start guest
-            self.monitor.cmd("cont")
+            if self.monitor.verify_status("paused"):
+                try:
+                    self.monitor.cmd("cont")
+                except kvm_monitor.QMPCmdError, e:
+                    if ((e.data['class'] == "MigrationExpected") and
+                        (migration_mode is not None)):
+                        logging.debug("Migration did not start yet...")
+                    else:
+                        raise e
 
         finally:
             fcntl.lockf(lockfile, fcntl.LOCK_UN)
-- 
1.7.11.4

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to