kvm_tests.py | 2 -
kvm_vm.py | 60 +++++++++++++++++++++++++++++++++++++++++++----------------
2 files changed, 45 insertions(+), 17 deletions(-)
Signed-off-by: Yogananth Subramanian <anantyog@in.ibm.com>
---
@@ -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
@@ -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):
"""