@@ -6,7 +6,7 @@ dhuff@redhat.com (David Huff)
aeromenk@redhat.com (Alexey Eromenko)
mburns@redhat.com (Mike Burns)
"""
-TIME = 'SHORT'
+TIME = 'MEDIUM'
NAME = 'KVM test'
TEST_TYPE = 'client'
TEST_CLASS = 'Virtualization'
@@ -20,194 +20,45 @@ KVM (both kernelspace and userspace) code.
For online docs, please refer to http://www.linux-kvm.org/page/KVM-Autotest
"""
+import sys, os, logging
+# Add the KVM tests dir to the python path
+kvm_test_dir = os.path.join(os.environ['AUTODIR'],'tests/kvm')
+sys.path.append(kvm_test_dir)
+# Now we can import modules inside the KVM tests dir
+import kvm_utils, kvm_config
-import sys, os
-
-#-----------------------------------------------------------------------------
# set English environment (command output might be localized, need to be safe)
-#-----------------------------------------------------------------------------
os.environ['LANG'] = 'en_US.UTF-8'
-#---------------------------------------------------------
-# Enable modules import from current directory (tests/kvm)
-#---------------------------------------------------------
-pwd = os.path.join(os.environ['AUTODIR'],'tests/kvm')
-sys.path.append(pwd)
-
-# ------------------------
-# create required symlinks
-# ------------------------
-# When dispatching tests from autotest-server the links we need do not exist on
-# the host (the client). The following lines create those symlinks. Change
-# 'rootdir' here and/or mount appropriate directories in it.
-#
-# When dispatching tests on local host (client mode) one can either setup kvm
-# links, or same as server mode use rootdir and set all appropriate links and
-# mount-points there. For example, guest installation tests need to know where
-# to find the iso-files.
-#
-# We create the links only if not already exist, so if one already set up the
-# links for client/local run we do not touch the links.
-rootdir='/tmp/kvm_autotest_root'
-iso=os.path.join(rootdir, 'iso')
-images=os.path.join(rootdir, 'images')
-qemu=os.path.join(rootdir, 'qemu')
-qemu_img=os.path.join(rootdir, 'qemu-img')
-
-
-def link_if_not_exist(ldir, target, link_name):
- t = target
- l = os.path.join(ldir, link_name)
- if not os.path.exists(l):
- os.system('ln -s %s %s' % (t, l))
-
-# Create links only if not already exist
-link_if_not_exist(pwd, '../../', 'autotest')
-link_if_not_exist(pwd, iso, 'isos')
-link_if_not_exist(pwd, images, 'images')
-link_if_not_exist(pwd, qemu, 'qemu')
-link_if_not_exist(pwd, qemu_img, 'qemu-img')
-
-# --------------------------------------------------------
-# Params that will be passed to the KVM install/build test
-# --------------------------------------------------------
-params = {
- "name": "build",
- "shortname": "build",
- "type": "build",
- #"mode": "release",
- #"mode": "snapshot",
- #"mode": "localtar",
- #"mode": "localsrc",
- #"mode": "git",
- "mode": "noinstall",
- #"mode": "koji",
-
- ## Are we going to load modules built by this test?
- ## Defaults to 'yes', so if you are going to provide only userspace code to
- ## be built by this test, please set load_modules to 'no', and make sure
- ## the kvm and kvm-[vendor] module is already loaded by the time you start
- ## it.
- #"load_modules": "no",
-
- ## Install from a kvm release ("mode": "release"). You can optionally
- ## specify a release tag. If you omit it, the test will get the latest
- ## release tag available.
- #"release_tag": '84',
- #"release_dir": 'http://downloads.sourceforge.net/project/kvm/',
- # This is the place that contains the sourceforge project list of files
- #"release_listing": 'http://sourceforge.net/projects/kvm/files/',
-
- ## Install from a kvm snapshot location ("mode": "snapshot"). You can
- ## optionally specify a snapshot date. If you omit it, the test will get
- ## yesterday's snapshot.
- #"snapshot_date": '20090712'
- #"snapshot_dir": 'http://foo.org/kvm-snapshots/',
-
- ## Install from a tarball ("mode": "localtar")
- #"tarball": "/tmp/kvm-84.tar.gz",
-
- ## Install from a local source code dir ("mode": "localsrc")
- #"srcdir": "/path/to/source-dir"
-
- ## Install from koji build server ("mode": "koji")
- ## Koji is the Fedora Project buildserver. It is possible to install
- ## packages right from Koji if you provide a release tag or a build.
- ## Tag (if available)
- #"koji_tag": 'dist-f11',
- ## Build (if available, is going to override tag).
- #"koji_build": 'qemu-0.10-16.fc11',
- ## Command to interact with the build server
- #"koji_cmd": '/usr/bin/koji',
- ## The name of the source package that's being built
- #"src_pkg": 'qemu',
- ## Name of the rpms we need installed
- #"pkg_list": ['qemu-kvm', 'qemu-kvm-tools', 'qemu-system-x86', 'qemu-common', 'qemu-img'],
- ## Paths of the qemu relevant executables that should be checked
- #"qemu_bin_paths": ['/usr/bin/qemu-kvm', '/usr/bin/qemu-img'],
-
- ## Install from git ("mode": "git")
- ## If you provide only "git_repo" and "user_git_repo", the build test
- ## will assume it will perform all build from the userspace dir, building
- ## modules trough make -C kernel LINUX=%s sync. As of today (07-13-2009)
- ## we need 3 git repos, "git_repo" (linux sources), "user_git_repo" and
- ## "kmod_repo" to build KVM userspace + kernel modules.
- #"git_repo": 'git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm.git',
- #"kernel_branch": 'kernel_branch_name',
- #"kernel_lbranch": 'kernel_lbranch_name',
- #"kernel_tag": 'kernel_tag_name',
- #"user_git_repo": 'git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git',
- #"user_branch": 'user_branch_name',
- #"user_lbranch": 'user_lbranch_name',
- #"user_tag": 'user_tag_name',
- #"kmod_repo": 'git://git.kernel.org/pub/scm/virt/kvm/kvm-kmod.git',
- #"kmod_branch": 'kmod_branch_name',
- #"kmod_lbranch": 'kmod_lbranch_name',
- #"kmod_tag": 'kmod_tag_name',
-}
-
-# If you don't want to execute the build stage, just use 'noinstall' as the
-# install type. If you run the tests from autotest-server, make sure that
-# /tmp/kvm-autotest-root/qemu is a link to your existing executable. Note that
-# if kvm_install is chose to run, it overwrites existing qemu and qemu-img
-# links to point to the newly built executables.
-
-if not params.get("mode") == "noinstall":
- if not job.run_test("kvm", params=params, tag=params.get("shortname")):
- print 'kvm_installation failed ... exiting'
- sys.exit(1)
-
-# ----------------------------------------------------------
-# Get test set (dictionary list) from the configuration file
-# ----------------------------------------------------------
-import kvm_config
-
-filename = os.path.join(pwd, "kvm_tests.cfg")
-cfg = kvm_config.config(filename)
-
-# If desirable, make changes to the test configuration here. For example:
-# cfg.parse_string("install|setup: timeout_multiplier = 2")
-# cfg.parse_string("only fc8_quick")
-# cfg.parse_string("display = sdl")
-
-filename = os.path.join(pwd, "kvm_address_pools.cfg")
-if os.path.exists(filename):
- cfg.parse_file(filename)
- hostname = os.uname()[1].split(".")[0]
- if cfg.filter("^" + hostname):
- cfg.parse_string("only ^%s" % hostname)
- else:
- cfg.parse_string("only ^default_host")
-
-list = cfg.get_list()
-
+build_cfg_path = os.path.join(kvm_test_dir, "build.cfg")
+build_cfg = kvm_config.config(build_cfg_path)
+# Make any desired changes to the build configuration here. For example:
+#build_cfg.parse_string("""
+#release_tag = 84
+#""")
+if not kvm_utils.run_tests(build_cfg.get_list(), job):
+ logging.error("KVM build step failed, exiting.")
+ sys.exit(1)
+
+tests_cfg_path = os.path.join(kvm_test_dir, "tests.cfg")
+tests_cfg = kvm_config.config(tests_cfg_path)
+# Make any desired changes to the test configuration here. For example:
+#tests_cfg.parse_string("""
+#display = sdl
+#install|setup: timeout_multiplier = 3
+#""")
+
+pools_cfg_path = os.path.join(kvm_test_dir, "address_pools.cfg")
+tests_cfg.parse_file(pools_cfg_path)
+hostname = os.uname()[1].split(".")[0]
+if tests_cfg.filter("^" + hostname):
+ tests_cfg.parse_string("only ^%s" % hostname)
+else:
+ tests_cfg.parse_string("only ^default_host")
-# -------------
# Run the tests
-# -------------
-status_dict = {}
+kvm_utils.run_tests(tests_cfg.get_list(), job)
-for dict in list:
- if dict.get("skip") == "yes":
- continue
- dependencies_satisfied = True
- for dep in dict.get("depend"):
- for test_name in status_dict.keys():
- if not dep in test_name:
- continue
- if not status_dict[test_name]:
- dependencies_satisfied = False
- break
- if dependencies_satisfied:
- test_iterations = int(dict.get("iterations", 1))
- current_status = job.run_test("kvm", params=dict,
- tag=dict.get("shortname"),
- iterations=test_iterations)
- else:
- current_status = False
- status_dict[dict.get("name")] = current_status
+# Generate a nice HTML report inside the job's results dir
+kvm_utils.create_report(kvm_test_dir, job.resultdir)
-# create the html report in result dir
-reporter = os.path.join(pwd, 'make_html_report.py')
-html_file = os.path.join(job.resultdir,'results.html')
-os.system('%s -r %s -f %s -R'%(reporter, job.resultdir, html_file))
@@ -874,3 +874,54 @@ def unmap_url_cache(cachedir, url, expected_hash, method="md5"):
file_path = utils.unmap_url(cachedir, src, cachedir)
return file_path
+
+
+def run_tests(test_list, job):
+ """
+ Runs the sequence of KVM tests based on the list of dictionaries
+ generated by the configuration system, handling dependencies.
+
+ @param test_list: List with all dictionary test parameters.
+ @param job: Autotest job object.
+
+ @return: True, if all tests ran passed, False if any of them failed.
+ """
+ status_dict = {}
+
+ failed = False
+ for dict in test_list:
+ if dict.get("skip") == "yes":
+ continue
+ dependencies_satisfied = True
+ for dep in dict.get("depend"):
+ for test_name in status_dict.keys():
+ if not dep in test_name:
+ continue
+ if not status_dict[test_name]:
+ dependencies_satisfied = False
+ break
+ if dependencies_satisfied:
+ test_iterations = int(dict.get("iterations", 1))
+ current_status = job.run_test("kvm", params=dict,
+ tag=dict.get("shortname"),
+ iterations=test_iterations)
+ if not current_status:
+ failed = True
+ else:
+ current_status = False
+ status_dict[dict.get("name")] = current_status
+
+ return not failed
+
+
+def create_report(report_dir, results_dir):
+ """
+ Creates a neatly arranged HTML results report in the results dir.
+
+ @param report_dir: Directory where the report script is located.
+ @param results_dir: Directory where the results will be output.
+ """
+ reporter = os.path.join(report_dir, 'html_report.py')
+ html_file = os.path.join(results_dir, 'results.html')
+ os.system('%s -r %s -f %s -R' % (reporter, results_dir, html_file))
+