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)