From patchwork Tue Dec 8 02:59:05 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas Meneghel Rodrigues X-Patchwork-Id: 65616 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id nB82xj1p007289 for ; Tue, 8 Dec 2009 02:59:45 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934278AbZLHC7h (ORCPT ); Mon, 7 Dec 2009 21:59:37 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S933714AbZLHC7f (ORCPT ); Mon, 7 Dec 2009 21:59:35 -0500 Received: from mx1.redhat.com ([209.132.183.28]:14797 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934086AbZLHC72 (ORCPT ); Mon, 7 Dec 2009 21:59:28 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nB82xYQ8026588 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Dec 2009 21:59:34 -0500 Received: from localhost.localdomain (vpn-11-165.rdu.redhat.com [10.11.11.165]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nB82xBsq014907; Mon, 7 Dec 2009 21:59:32 -0500 From: Lucas Meneghel Rodrigues To: autotest@test.kernel.org Cc: kvm@vger.kernel.org, mgoldish@redhat.com, Lucas Meneghel Rodrigues Subject: [PATCH 5/5] KVM test: Major control file cleanup Date: Tue, 8 Dec 2009 00:59:05 -0200 Message-Id: <1260241145-19029-5-git-send-email-lmr@redhat.com> In-Reply-To: <1260241145-19029-4-git-send-email-lmr@redhat.com> References: <1260241145-19029-1-git-send-email-lmr@redhat.com> <1260241145-19029-2-git-send-email-lmr@redhat.com> <1260241145-19029-3-git-send-email-lmr@redhat.com> <1260241145-19029-4-git-send-email-lmr@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org 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 @@ 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)) 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)) +