From patchwork Wed Jun 17 00:46:50 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas Meneghel Rodrigues X-Patchwork-Id: 30745 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 n5H0l6pA022814 for ; Wed, 17 Jun 2009 00:47:06 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758066AbZFQArA (ORCPT ); Tue, 16 Jun 2009 20:47:00 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751690AbZFQArA (ORCPT ); Tue, 16 Jun 2009 20:47:00 -0400 Received: from mx2.redhat.com ([66.187.237.31]:48292 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751206AbZFQAq7 (ORCPT ); Tue, 16 Jun 2009 20:46:59 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n5H0kwDs025319; Tue, 16 Jun 2009 20:46:58 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n5H0ktdp023762; Tue, 16 Jun 2009 20:46:57 -0400 Received: from localhost.localdomain (vpn-10-60.bos.redhat.com [10.16.10.60]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n5H0kqWM025433; Tue, 16 Jun 2009 20:46:53 -0400 From: Lucas Meneghel Rodrigues To: autotest@test.kernel.org Cc: kvm@vger.kernel.org, Lucas Meneghel Rodrigues , Yogananth Subramanian Subject: [KVM-AUTOTEST PATCH] kvm test: Adding remote migration support Date: Tue, 16 Jun 2009 21:46:50 -0300 Message-Id: <1245199610-6338-1-git-send-email-lmr@redhat.com> X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org 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 = remoteip = remuser = root rempassword = 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 --- 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):