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 <[email protected]>
---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html