AUTHOR = """ uril@redhat.com (Uri Lublin) drusso@redhat.com (Dror Russo) mgoldish@redhat.com (Michael Goldish) dhuff@redhat.com (David Huff) aeromenk@redhat.com (Alexey Eromenko) mburns@redhat.com (Mike Burns) """ TIME = 'SHORT' NAME = 'KVM test' TEST_TYPE = 'client' TEST_CLASS = 'Virtualization' TEST_CATEGORY = 'Functional' DOC = """ Executes the KVM test framework on a given host. This module is separated in minor functions, that execute different tests for doing Quality Assurance on KVM (both kernelspace and userspace) code. """ import sys, os, commands, re #----------------------------------------------------------------------------- # 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 # ---------------------------------------------------------- from autotest_lib.client.common_lib import cartesian_config str = """ # This string will be parsed after tests.cfg. Make any desired changes to the # test configuration here. For example: #install, setup: timeout_multiplier = 3 #display = sdl """ parser = cartesian_config.Parser() parser.parse_file(os.path.join(pwd, "tests.cfg")) parser.parse_string(str) tests = list(parser.get_dicts()) # ------------- # Run the tests # ------------- from autotest_lib.client.virt import virt_scheduler from autotest_lib.client.bin import utils # total_cpus defaults to the number of CPUs reported by /proc/cpuinfo total_cpus = utils.count_cpus() # total_mem defaults to 3/4 of the total memory reported by 'free' total_mem = int(commands.getoutput("free -m").splitlines()[1].split()[1]) * 3/4 # We probably won't need more workers than CPUs num_workers = total_cpus # Start the scheduler and workers s = virt_scheduler.scheduler(tests, num_workers, total_cpus, total_mem, pwd) job.parallel([s.scheduler], *[(s.worker, i, job.run_test) for i in range(num_workers)]) # 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))