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))
