1AUTHOR = """ 2uril@redhat.com (Uri Lublin) 3drusso@redhat.com (Dror Russo) 4mgoldish@redhat.com (Michael Goldish) 5dhuff@redhat.com (David Huff) 6aeromenk@redhat.com (Alexey Eromenko) 7mburns@redhat.com (Mike Burns) 8""" 9TIME = 'SHORT' 10NAME = 'KVM test' 11TEST_TYPE = 'client' 12TEST_CLASS = 'Virtualization' 13TEST_CATEGORY = 'Functional' 14 15DOC = """ 16Executes the KVM test framework on a given host. This module is separated in 17minor functions, that execute different tests for doing Quality Assurance on 18KVM (both kernelspace and userspace) code. 19""" 20 21 22import sys, os, commands, re 23 24#----------------------------------------------------------------------------- 25# set English environment (command output might be localized, need to be safe) 26#----------------------------------------------------------------------------- 27os.environ['LANG'] = 'en_US.UTF-8' 28 29#--------------------------------------------------------- 30# Enable modules import from current directory (tests/kvm) 31#--------------------------------------------------------- 32pwd = os.path.join(os.environ['AUTODIR'],'tests/kvm') 33sys.path.append(pwd) 34 35# ------------------------ 36# create required symlinks 37# ------------------------ 38# When dispatching tests from autotest-server the links we need do not exist on 39# the host (the client). The following lines create those symlinks. Change 40# 'rootdir' here and/or mount appropriate directories in it. 41# 42# When dispatching tests on local host (client mode) one can either setup kvm 43# links, or same as server mode use rootdir and set all appropriate links and 44# mount-points there. For example, guest installation tests need to know where 45# to find the iso-files. 46# 47# We create the links only if not already exist, so if one already set up the 48# links for client/local run we do not touch the links. 49rootdir='/tmp/kvm_autotest_root' 50iso=os.path.join(rootdir, 'iso') 51images=os.path.join(rootdir, 'images') 52qemu=os.path.join(rootdir, 'qemu') 53qemu_img=os.path.join(rootdir, 'qemu-img') 54 55 56def link_if_not_exist(ldir, target, link_name): 57 t = target 58 l = os.path.join(ldir, link_name) 59 if not os.path.exists(l): 60 os.system('ln -s %s %s' % (t, l)) 61 62# Create links only if not already exist 63link_if_not_exist(pwd, '../../', 'autotest') 64link_if_not_exist(pwd, iso, 'isos') 65link_if_not_exist(pwd, images, 'images') 66link_if_not_exist(pwd, qemu, 'qemu') 67link_if_not_exist(pwd, qemu_img, 'qemu-img') 68 69# -------------------------------------------------------- 70# Params that will be passed to the KVM install/build test 71# -------------------------------------------------------- 72params = { 73 "name": "build", 74 "shortname": "build", 75 "type": "build", 76 #"mode": "release", 77 #"mode": "snapshot", 78 #"mode": "localtar", 79 #"mode": "localsrc", 80 #"mode": "git", 81 "mode": "noinstall", 82 #"mode": "koji", 83 84 ## Are we going to load modules built by this test? 85 ## Defaults to 'yes', so if you are going to provide only userspace code to 86 ## be built by this test, please set load_modules to 'no', and make sure 87 ## the kvm and kvm-[vendor] module is already loaded by the time you start 88 ## it. 89 #"load_modules": "no", 90 91 ## Install from a kvm release ("mode": "release"). You can optionally 92 ## specify a release tag. If you omit it, the test will get the latest 93 ## release tag available. 94 #"release_tag": '84', 95 #"release_dir": 'http://downloads.sourceforge.net/project/kvm/', 96 # This is the place that contains the sourceforge project list of files 97 #"release_listing": 'http://sourceforge.net/projects/kvm/files/', 98 99 ## Install from a kvm snapshot location ("mode": "snapshot"). You can 100 ## optionally specify a snapshot date. If you omit it, the test will get 101 ## yesterday's snapshot. 102 #"snapshot_date": '20090712' 103 #"snapshot_dir": 'http://foo.org/kvm-snapshots/', 104 105 ## Install from a tarball ("mode": "localtar") 106 #"tarball": "/tmp/kvm-84.tar.gz", 107 108 ## Install from a local source code dir ("mode": "localsrc") 109 #"srcdir": "/path/to/source-dir" 110 111 ## Install from koji build server ("mode": "koji") 112 ## Koji is the Fedora Project buildserver. It is possible to install 113 ## packages right from Koji if you provide a release tag or a build. 114 ## Tag (if available) 115 #"koji_tag": 'dist-f11', 116 ## Build (if available, is going to override tag). 117 #"koji_build": 'qemu-0.10-16.fc11', 118 ## Command to interact with the build server 119 #"koji_cmd": '/usr/bin/koji', 120 ## The name of the source package that's being built 121 #"src_pkg": 'qemu', 122 ## Name of the rpms we need installed 123 #"pkg_list": ['qemu-kvm', 'qemu-kvm-tools', 'qemu-system-x86', 'qemu-common', 'qemu-img'], 124 ## Paths of the qemu relevant executables that should be checked 125 #"qemu_bin_paths": ['/usr/bin/qemu-kvm', '/usr/bin/qemu-img'], 126 127 ## Install from git ("mode": "git") 128 ## If you provide only "git_repo" and "user_git_repo", the build test 129 ## will assume it will perform all build from the userspace dir, building 130 ## modules trough make -C kernel LINUX=%s sync. As of today (07-13-2009) 131 ## we need 3 git repos, "git_repo" (linux sources), "user_git_repo" and 132 ## "kmod_repo" to build KVM userspace + kernel modules. 133 #"git_repo": 'git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm.git', 134 #"kernel_branch": 'kernel_branch_name', 135 #"kernel_lbranch": 'kernel_lbranch_name', 136 #"kernel_tag": 'kernel_tag_name', 137 #"user_git_repo": 'git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git', 138 #"user_branch": 'user_branch_name', 139 #"user_lbranch": 'user_lbranch_name', 140 #"user_tag": 'user_tag_name', 141 #"kmod_repo": 'git://git.kernel.org/pub/scm/virt/kvm/kvm-kmod.git', 142 #"kmod_branch": 'kmod_branch_name', 143 #"kmod_lbranch": 'kmod_lbranch_name', 144 #"kmod_tag": 'kmod_tag_name', 145} 146 147# If you don't want to execute the build stage, just use 'noinstall' as the 148# install type. If you run the tests from autotest-server, make sure that 149# /tmp/kvm-autotest-root/qemu is a link to your existing executable. Note that 150# if kvm_install is chose to run, it overwrites existing qemu and qemu-img 151# links to point to the newly built executables. 152 153if not params.get("mode") == "noinstall": 154 if not job.run_test("kvm", params=params, tag=params.get("shortname")): 155 print 'kvm_installation failed ... exiting' 156 sys.exit(1) 157 158# ---------------------------------------------------------- 159# Get test set (dictionary list) from the configuration file 160# ---------------------------------------------------------- 161from autotest_lib.client.common_lib import cartesian_config 162 163str = """ 164# This string will be parsed after tests.cfg. Make any desired changes to the 165# test configuration here. For example: 166#install, setup: timeout_multiplier = 3 167#display = sdl 168""" 169 170parser = cartesian_config.Parser() 171parser.parse_file(os.path.join(pwd, "tests.cfg")) 172parser.parse_string(str) 173 174tests = list(parser.get_dicts()) 175 176# ------------- 177# Run the tests 178# ------------- 179from autotest_lib.client.virt import virt_scheduler 180from autotest_lib.client.bin import utils 181 182# total_cpus defaults to the number of CPUs reported by /proc/cpuinfo 183total_cpus = utils.count_cpus() 184# total_mem defaults to 3/4 of the total memory reported by 'free' 185total_mem = int(commands.getoutput("free -m").splitlines()[1].split()[1]) * 3/4 186# We probably won't need more workers than CPUs 187num_workers = total_cpus 188 189# Start the scheduler and workers 190s = virt_scheduler.scheduler(tests, num_workers, total_cpus, total_mem, pwd) 191job.parallel([s.scheduler], 192 *[(s.worker, i, job.run_test) for i in range(num_workers)]) 193 194# create the html report in result dir 195reporter = os.path.join(pwd, 'make_html_report.py') 196html_file = os.path.join(job.resultdir,'results.html') 197os.system('%s -r %s -f %s -R'%(reporter, job.resultdir, html_file)) 198