From patchwork Wed Jun 17 23:47:53 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: yogi X-Patchwork-Id: 31018 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n5HNm3tR001361 for ; Wed, 17 Jun 2009 23:48:03 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753771AbZFQXr5 (ORCPT ); Wed, 17 Jun 2009 19:47:57 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753749AbZFQXr5 (ORCPT ); Wed, 17 Jun 2009 19:47:57 -0400 Received: from e31.co.us.ibm.com ([32.97.110.149]:40319 "EHLO e31.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752978AbZFQXr5 (ORCPT ); Wed, 17 Jun 2009 19:47:57 -0400 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by e31.co.us.ibm.com (8.13.1/8.13.1) with ESMTP id n5HNhYQs030823 for ; Wed, 17 Jun 2009 17:43:34 -0600 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v9.2) with ESMTP id n5HNlxi6104712 for ; Wed, 17 Jun 2009 17:47:59 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n5HNlwj1025497 for ; Wed, 17 Jun 2009 17:47:59 -0600 Received: from [9.124.158.52] (yogi-laptop.in.ibm.com [9.124.158.52]) by d03av01.boulder.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n5HNlukY025432; Wed, 17 Jun 2009 17:47:56 -0600 Subject: Re: [KVM-AUTOTEST PATCH] kvm test: Adding remote migration support From: yogi To: Lucas Meneghel Rodrigues Cc: autotest@test.kernel.org, kvm@vger.kernel.org, Yogananth Subramanian In-Reply-To: <1245199980.2943.15.camel@freedom> References: <1245199610-6338-1-git-send-email-lmr@redhat.com> <1245199980.2943.15.camel@freedom> Date: Thu, 18 Jun 2009 05:17:53 +0530 Message-Id: <1245282473.5874.13.camel@yogi-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.26.1 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org 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 kvm_tests.py | 2 - kvm_vm.py | 60 +++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 17 deletions(-) Signed-off-by: Yogananth Subramanian --- 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): """