diff mbox

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

Message ID 1245282473.5874.13.camel@yogi-laptop (mailing list archive)
State New, archived
Headers show

Commit Message

yogi June 17, 2009, 11:47 p.m. UTC
Hello Everyone


> I went trough the discussion about this patch and I also agree we should
> be implementing this test as a server side test. However I thought it
> would be good having this patch rebased to the new kvm test code just in
> case we need it in the future. This is part of the patch queue work.
> 

I have rebased the patch to the new kvm test code.

The same set of parameters should be added to  kvm_tests.cfg file,as the
previous patch

        hostip = 192.168.1.2        #ur host machine ip
        remoteip = 192.168.1.2      #can use same ip for local migration
        remuser = root              #remote machine user
        rempassword = 123456        #passwd for remote user
        remote_dst = yes       #could be enabled for local migration too
        qemu_path_dst = /tmp/kvm_autotest_root1/qemu 
        image_dir_dst = /tmp/kvm_autotest_root1/images
        

Thanks and Regards
Yogi

Comments

Lucas Meneghel Rodrigues June 18, 2009, 2:01 p.m. UTC | #1
On Thu, 2009-06-18 at 05:17 +0530, yogi wrote:
> Hello Everyone
> 
> 
> > I went trough the discussion about this patch and I also agree we should
> > be implementing this test as a server side test. However I thought it
> > would be good having this patch rebased to the new kvm test code just in
> > case we need it in the future. This is part of the patch queue work.
> > 
> 
> I have rebased the patch to the new kvm test code.
> 
> The same set of parameters should be added to  kvm_tests.cfg file,as the
> previous patch
> 
>         hostip = 192.168.1.2        #ur host machine ip
>         remoteip = 192.168.1.2      #can use same ip for local migration
>         remuser = root              #remote machine user
>         rempassword = 123456        #passwd for remote user
>         remote_dst = yes       #could be enabled for local migration too
>         qemu_path_dst = /tmp/kvm_autotest_root1/qemu 
>         image_dir_dst = /tmp/kvm_autotest_root1/images
>         
> 
> Thanks and Regards
> Yogi

Thank you very much Yogi! As I have said, your patch was stored for
future reference.
diff mbox

Patch

 kvm_tests.py |    2 -
 kvm_vm.py    |   60 +++++++++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 45 insertions(+), 17 deletions(-)

Signed-off-by: Yogananth Subramanian <anantyog@in.ibm.com>
---
diff -aurp kvm-autotest-old//client/tests/kvm/kvm_tests.py kvm-autotest-new//client/tests/kvm/kvm_tests.py
--- kvm-autotest-old//client/tests/kvm/kvm_tests.py	2009-06-17 18:18:31.000000000 +0000
+++ kvm-autotest-new//client/tests/kvm/kvm_tests.py	2009-06-17 18:24:11.000000000 +0000
@@ -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 -aurp kvm-autotest-old//client/tests/kvm/kvm_vm.py kvm-autotest-new//client/tests/kvm/kvm_vm.py
--- kvm-autotest-old//client/tests/kvm/kvm_vm.py	2009-06-17 18:18:31.000000000 +0000
+++ kvm-autotest-new//client/tests/kvm/kvm_vm.py	2009-06-17 18:46:19.000000000 +0000
@@ -1,6 +1,7 @@ 
 #!/usr/bin/python
 import time, socket, os, logging, fcntl
 import kvm_utils
+import re
 
 """
 Utility classes and functions to handle Virtual Machine creation using qemu.
@@ -114,6 +115,7 @@  class VM:
         self.image_dir = image_dir
         self.iso_dir = iso_dir
 
+        self.remote = False
 
         # Find available monitor filename
         while True:
@@ -170,8 +172,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 +234,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)
@@ -321,6 +319,18 @@  class VM:
         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")
         if iso:
@@ -376,10 +386,29 @@  class VM:
                 self.migration_port = kvm_utils.find_free_port(5200, 6000)
                 # 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,".*[#$].*")
+                qemu_command +=" &"
+                logging.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:
+                logging.debug("Running qemu command:\n%s" % qemu_command)
+                (status, pid, output) = kvm_utils.run_bg(qemu_command, None, logging.debug, "(qemu) ")
 
             if status:
                 logging.debug("qemu exited with status %d", status)
@@ -404,7 +433,7 @@  class VM:
             lockfile.close()
 
 
-    def send_monitor_cmd(self, command, block=True, timeout=20.0):
+    def send_monitor_cmd(self, command, block=True, timeout=30.0):
         """
         Send command to the QEMU monitor.
 
@@ -450,9 +479,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 +570,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:
@@ -574,8 +603,7 @@  class VM:
         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):
         """