137 lines
5.4 KiB
Python
137 lines
5.4 KiB
Python
import os, logging, imp
|
|
from autotest_lib.client.bin import test
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.virt import virt_utils, virt_env_process
|
|
|
|
|
|
class kvm(test.test):
|
|
"""
|
|
Suite of KVM virtualization functional tests.
|
|
Contains tests for testing both KVM kernel code and userspace code.
|
|
|
|
@copyright: Red Hat 2008-2009
|
|
@author: Uri Lublin (uril@redhat.com)
|
|
@author: Dror Russo (drusso@redhat.com)
|
|
@author: Michael Goldish (mgoldish@redhat.com)
|
|
@author: David Huff (dhuff@redhat.com)
|
|
@author: Alexey Eromenko (aeromenk@redhat.com)
|
|
@author: Mike Burns (mburns@redhat.com)
|
|
|
|
@see: http://www.linux-kvm.org/page/KVM-Autotest/Client_Install
|
|
(Online doc - Getting started with KVM testing)
|
|
"""
|
|
version = 1
|
|
env_version = 1
|
|
|
|
|
|
def initialize(self, params):
|
|
# Change the value of the preserve_srcdir attribute according to
|
|
# the value present on the configuration file (defaults to yes)
|
|
if params.get("preserve_srcdir", "yes") == "yes":
|
|
self.preserve_srcdir = True
|
|
|
|
|
|
def run_once(self, params):
|
|
# Convert params to a Params object
|
|
params = virt_utils.Params(params)
|
|
|
|
# If a dependency test prior to this test has failed, let's fail
|
|
# it right away as TestNA.
|
|
if params.get("dependency_failed") == 'yes':
|
|
raise error.TestNAError("Test dependency failed")
|
|
|
|
# Report the parameters we've received and write them as keyvals
|
|
logging.debug("Test parameters:")
|
|
keys = params.keys()
|
|
keys.sort()
|
|
for key in keys:
|
|
logging.debug(" %s = %s", key, params[key])
|
|
self.write_test_keyval({key: params[key]})
|
|
|
|
# Set the log file dir for the logging mechanism used by kvm_subprocess
|
|
# (this must be done before unpickling env)
|
|
virt_utils.set_log_file_dir(self.debugdir)
|
|
|
|
# Open the environment file
|
|
env_filename = os.path.join(self.bindir, params.get("env", "env"))
|
|
env = virt_utils.Env(env_filename, self.env_version)
|
|
|
|
test_passed = False
|
|
|
|
try:
|
|
try:
|
|
try:
|
|
# Get the test routine corresponding to the specified
|
|
# test type
|
|
t_type = params.get("type")
|
|
# Verify if we have the correspondent source file for it
|
|
virt_dir = os.path.dirname(virt_utils.__file__)
|
|
subtest_dir_virt = os.path.join(virt_dir, "tests")
|
|
subtest_dir_kvm = os.path.join(self.bindir, "tests")
|
|
subtest_dir = None
|
|
for d in [subtest_dir_kvm, subtest_dir_virt]:
|
|
module_path = os.path.join(d, "%s.py" % t_type)
|
|
if os.path.isfile(module_path):
|
|
subtest_dir = d
|
|
break
|
|
if subtest_dir is None:
|
|
raise error.TestError("Could not find test file %s.py "
|
|
"on either %s or %s directory" %
|
|
(t_type, subtest_dir_kvm,
|
|
subtest_dir_virt))
|
|
# Load the test module
|
|
f, p, d = imp.find_module(t_type, [subtest_dir])
|
|
test_module = imp.load_module(t_type, f, p, d)
|
|
f.close()
|
|
|
|
# Preprocess
|
|
try:
|
|
virt_env_process.preprocess(self, params, env)
|
|
finally:
|
|
env.save()
|
|
# Run the test function
|
|
run_func = getattr(test_module, "run_%s" % t_type)
|
|
try:
|
|
run_func(self, params, env)
|
|
finally:
|
|
env.save()
|
|
test_passed = True
|
|
|
|
except Exception, e:
|
|
logging.error("Test failed: %s: %s",
|
|
e.__class__.__name__, e)
|
|
try:
|
|
virt_env_process.postprocess_on_error(
|
|
self, params, env)
|
|
finally:
|
|
env.save()
|
|
raise
|
|
|
|
finally:
|
|
# Postprocess
|
|
try:
|
|
try:
|
|
virt_env_process.postprocess(self, params, env)
|
|
except Exception, e:
|
|
if test_passed:
|
|
raise
|
|
logging.error("Exception raised during "
|
|
"postprocessing: %s", e)
|
|
finally:
|
|
env.save()
|
|
|
|
except Exception, e:
|
|
if params.get("abort_on_error") != "yes":
|
|
raise
|
|
# Abort on error
|
|
logging.info("Aborting job (%s)", e)
|
|
for vm in env.get_all_vms():
|
|
if vm.is_dead():
|
|
continue
|
|
logging.info("VM '%s' is alive.", vm.name)
|
|
for m in vm.monitors:
|
|
logging.info("'%s' has a %s monitor unix socket at: %s",
|
|
vm.name, m.protocol, m.filename)
|
|
logging.info("The command line used to start '%s' was:\n%s",
|
|
vm.name, vm.make_qemu_command())
|
|
raise error.JobError("Abort requested (%s)" % e)
|