As pointed out before, the KVM reference control files
could use a little clean up. This patch implements severe
cleanup of the main control file by:

* Refactoring the code present there, moving it to the
kvm_utils.py library
* Treat the build test exactly the same way as other
tests, moving the config stuff that used to be in the
control file realm out to its own configuration file,
for the sake of consistency.

This way the control file becomes way shorter, fairly
well organized, and we have a consistent configuration
schema across the board, based on configuration files.

If people are OK with this change, final patch will
change the control.parallel file as well.

2nd try: Implemented pretty much all Michael's suggestions
for this patchset.

Signed-off-by: Lucas Meneghel Rodrigues <l...@redhat.com>
---
 client/tests/kvm/control      |  219 +++++++----------------------------------
 client/tests/kvm/kvm_utils.py |   51 ++++++++++
 2 files changed, 86 insertions(+), 184 deletions(-)

diff --git a/client/tests/kvm/control b/client/tests/kvm/control
index a526cc0..163286e 100644
--- a/client/tests/kvm/control
+++ b/client/tests/kvm/control
@@ -6,7 +6,7 @@ dh...@redhat.com (David Huff)
 aerom...@redhat.com (Alexey Eromenko)
 mbu...@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))
diff --git a/client/tests/kvm/kvm_utils.py b/client/tests/kvm/kvm_utils.py
index bf25900..b6f4d22 100644
--- a/client/tests/kvm/kvm_utils.py
+++ b/client/tests/kvm/kvm_utils.py
@@ -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))
+
-- 
1.6.5.2

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to