import logging, os, sys, fcntl
kvm_test_dir = "/usr/local/autotest/client/tests/kvm"
from autotest_lib.client.common_lib import cartesian_config

def get_control(params, custom_cfg):
    control = '''
import sys, os, logging
os.environ['LANG'] = 'en_US.UTF-8'
kvm_test_dir = os.path.join(os.environ['AUTODIR'],'tests', 'kvm')
sys.path.append(kvm_test_dir)
from autotest_lib.client.common_lib import cartesian_config
from autotest_lib.client.virt import virt_utils

kernel_install_params = %s
custom_cfg = %s

def step_init():
    job.next_step([step_test])
    virt_utils.install_host_kernel(job, kernel_install_params)

def step_test():
    parser = cartesian_config.Parser()
    parser.parse_file(os.path.join(kvm_test_dir, "redhat.cfg"))
    for line in custom_cfg:
        parser.parse_string(line)
    virt_utils.run_tests(parser, job)
''' % (params, custom_cfg)
    return control

def run(machine):
    parser = cartesian_config.Parser()
    parser.parse_file(os.path.join(kvm_test_dir, "redhat.cfg"))
    custom_cfg = $custom_job_cfg
    for line in custom_cfg:
        parser.parse_string(line)
    generator = parser.get_dicts()
    params = generator.next()
    host = hosts.create_host(machine)
    profile = params.get('host_install_profile')
    timeout = int(params.get('host_install_timeout', 3600))
    if profile:
        host.install(profile=profile, timeout=timeout)
    at = autotest.Autotest(host)
    control = get_control(params, custom_cfg)
    at.run(control)

job.parallel_simple(run, machines)
