[KVM-AUTOTEST PATCH] kvm test: Adding remote migration support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Make the current migration test handle remote migration. In order to
use remote migration, the following four parameters should be added
to the existing migration test:

       remote = dst
       hostip = <localhost ip or name>
       remoteip = <remote host ip or name>
       remuser = root
       rempassword = <password>

The field remote=dst indicates the VM "dst" should be created on remote
machine. For example:

   - migrate:      install setup
       type = migration
       vms += " dst"
       migration_test_command = help
       kill_vm_on_error = yes
       remote = dst
       hostip = 192.168.1.2
       remoteip = 192.168.1.3
       remuser = root
       rempassword = 123456
       variants:

Signed-off-by: Yogananth Subramanian <anantyog@xxxxxxxxxx>
---
 client/tests/kvm/kvm_tests.cfg.sample |    6 +++
 client/tests/kvm/kvm_tests.py         |    2 +-
 client/tests/kvm/kvm_vm.py            |   61 +++++++++++++++++++++++++--------
 3 files changed, 53 insertions(+), 16 deletions(-)

diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
index 931f748..ca7f1d0 100644
--- a/client/tests/kvm/kvm_tests.cfg.sample
+++ b/client/tests/kvm/kvm_tests.cfg.sample
@@ -54,6 +54,12 @@ variants:
         vms += " dst"
         migration_test_command = help
         kill_vm_on_error = yes
+        remote = dst
+        hostip = 192.168.1.2
+        remoteip = 192.168.1.3
+        remuser = root
+        rempassword = 123456
+        kill_vm_on_error = yes
         variants:
             - 1:
                 start_vm_for_migration_dst = yes
diff --git a/client/tests/kvm/kvm_tests.py b/client/tests/kvm/kvm_tests.py
index 4270cae..32b1ba4 100644
--- a/client/tests/kvm/kvm_tests.py
+++ b/client/tests/kvm/kvm_tests.py
@@ -113,7 +113,7 @@ def run_migration(test, params, env):
     session.close()
 
     # Define the migration command
-    cmd = "migrate -d tcp:localhost:%d" % dest_vm.migration_port
+    cmd = "migrate -d tcp:%s:%d" % (dest_vm.hostip, dest_vm.migration_port)
     logging.debug("Migration command: %s" % cmd)
 
     # Migrate
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index 5028161..c15d0a1 100644
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-import time, socket, os, logging, fcntl
+import time, socket, os, logging, fcntl, re
 import kvm_utils
 
 """
@@ -113,6 +113,7 @@ class VM:
         self.qemu_path = qemu_path
         self.image_dir = image_dir
         self.iso_dir = iso_dir
+        self.remote = False
 
 
         # Find available monitor filename
@@ -170,8 +171,6 @@ class VM:
         file.close()
         if not self.qemu_path in cmdline:
             return False
-        if not self.monitor_file_name in cmdline:
-            return False
         return True
 
 
@@ -234,8 +233,6 @@ class VM:
         qemu_cmd += qemu_path
         # Add the VM's name
         qemu_cmd += " -name '%s'" % name
-        # Add the monitor socket parameter
-        qemu_cmd += " -monitor unix:%s,server,nowait" % self.monitor_file_name
 
         for image_name in kvm_utils.get_sub_dict_names(params, "images"):
             image_params = kvm_utils.get_sub_dict(params, image_name)
@@ -320,6 +317,18 @@ class VM:
         qemu_path = self.qemu_path
         image_dir = self.image_dir
         iso_dir = self.iso_dir
+        # If VM is remote, set hostip to ip of the remote machine
+        # If VM is local set hostip to localhost or hostip param
+        if params.get("remote") == "yes":
+            self.remote = True
+            self.hostip = params.get("remoteip")
+            self.qemu_path = params.get("qemu_path",qemu_path)
+            qemu_path = self.qemu_path
+            self.image_dir = params.get("image_dir",image_dir)
+            image_dir = self.image_dir
+        else:
+            self.remote = False
+            self.hostip = params.get("hostip","localhost")
 
         # Verify the md5sum of the ISO image
         iso = params.get("cdrom")
@@ -377,9 +386,32 @@ class VM:
                 # Add -incoming option to the qemu command
                 qemu_command += " -incoming tcp:0:%d" % self.migration_port
 
-            logging.debug("Running qemu command:\n%s", qemu_command)
-            (status, pid, output) = kvm_utils.run_bg(qemu_command, None,
-                                                     logging.debug, "(qemu) ")
+            self.monitor_port = kvm_utils.find_free_port(5400, 6000)
+            qemu_command += (" -monitor tcp:0:%d,server,nowait" %
+                             self.monitor_port)
+
+            # If the VM is remote, get the username and password of remote host
+            # and lanch qemu command on the remote machine.
+            if self.remote:
+                remuser = params.get("remuser")
+                rempassword = params.get("rempassword")
+                sub = kvm_utils.ssh(self.hostip, 22, remuser, rempassword,
+                                    self.params.get("ssh_prompt", "[\#\$]"))
+                qemu_command +=" &"
+                kvm_log.debug("Running qemu command:\n%s" % qemu_command)
+                sub.sendline(qemu_command)
+
+                (status,output) = sub.read_up_to_prompt()
+                if "Exit " in output:
+                    status = int(re.findall("Exit\s(\d+)",output)[0])
+                else:
+                    pid = int(re.findall(".*] (\d+)",output)[0])
+                    status = 0
+            else:
+                kvm_log.debug("Running qemu command:\n%s" % qemu_command)
+                (status, pid, output) = kvm_utils.run_bg(qemu_command, None,
+                                                         kvm_log.debug,
+                                                         "(qemu) ")
 
             if status:
                 logging.debug("qemu exited with status %d", status)
@@ -450,9 +482,8 @@ class VM:
         # Connect to monitor
         logging.debug("Sending monitor command: %s" % command)
         try:
-            s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
-            s.setblocking(False)
-            s.connect(self.monitor_file_name)
+            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+            s.connect((self.hostip, self.monitor_port))
         except:
             logging.debug("Could not connect to monitor socket")
             return (1, "")
@@ -542,8 +573,9 @@ class VM:
         Return True if the VM's monitor is responsive.
         """
         # Check if the process exists
-        if not kvm_utils.pid_exists(self.pid):
-            return False
+        if not self.remote:
+            if not kvm_utils.pid_exists(self.pid):
+                return False
         # Try sending a monitor command
         (status, output) = self.send_monitor_cmd("help")
         if status:
@@ -573,8 +605,7 @@ class VM:
         If port redirection is used, return 'localhost' (the guest has no IP
         address of its own).  Otherwise return the guest's IP address.
         """
-        # Currently redirection is always used, so return 'localhost'
-        return "localhost"
+        return self.hostip
 
 
     def get_port(self, port):
-- 
1.6.2.2

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

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux