blob: 7c6331712375f67b186025f9c27b40f7079c155e [file] [log] [blame]
AUTHOR = "Yolkfull Chow <yzhou@redhat.com>"
TIME = "SHORT"
NAME = "Migration across multiple hosts"
TEST_CATEGORY = "Functional"
TEST_CLASS = "Virtualization"
TEST_TYPE = "Server"
DOC = """
Migrate KVM guest between two hosts. It parses the base config file, restricts
it with appropriate parameters, generates the test dicts, modify the test_dicts
so there's a distinction between the migration roles ('dest' or 'source').
"""
import sys, os, commands, glob, shutil, logging, random
from autotest_lib.server import utils
from autotest_lib.client.common_lib import cartesian_config
# Specify the directory of autotest before you start this test
AUTOTEST_DIR = '/usr/local/autotest'
# Specify the root directory that on client machines
rootdir = '/tmp/kvm_autotest_root'
KVM_DIR = os.path.join(AUTOTEST_DIR, 'client/tests/kvm')
def generate_mac_address():
r = random.SystemRandom()
mac = "9a:%02x:%02x:%02x:%02x:%02x" % (r.randint(0x00, 0xff),
r.randint(0x00, 0xff),
r.randint(0x00, 0xff),
r.randint(0x00, 0xff),
r.randint(0x00, 0xff))
return mac
def run(pair):
logging.info("KVM migration running on source host [%s] and destination "
"host [%s]\n", pair[0], pair[1])
source = hosts.create_host(pair[0])
dest = hosts.create_host(pair[1])
source_at = autotest.Autotest(source)
dest_at = autotest.Autotest(dest)
cfg_file = os.path.join(KVM_DIR, "tests_base.cfg")
if not os.path.exists(cfg_file):
raise error.JobError("Config file %s was not found", cfg_file)
# Get test set (dictionary list) from the configuration file
parser = cartesian_config.Parser()
test_variants = """
image_name(_.*)? ?<= /tmp/kvm_autotest_root/images/
cdrom(_.*)? ?<= /tmp/kvm_autotest_root/
floppy ?<= /tmp/kvm_autotest_root/
Linux:
unattended_install:
kernel ?<= /tmp/kvm_autotest_root/
initrd ?<= /tmp/kvm_autotest_root/
qemu_binary = /usr/libexec/qemu-kvm
qemu_img_binary = /usr/bin/qemu-img
only qcow2
only virtio_net
only virtio_blk
only smp2
only no_pci_assignable
only smallpages
only Fedora.14.64
only migrate_multi_host
nic_mode = tap
nic_mac_nic1 = %s
""" % (generate_mac_address())
parser.parse_file(cfg_file)
parser.parse_string(test_variants)
test_dicts = parser.get_dicts()
source_control_file = dest_control_file = """
kvm_test_dir = os.path.join(os.environ['AUTODIR'],'tests/kvm')
sys.path.append(kvm_test_dir)\n
"""
for params in test_dicts:
params['srchost'] = source.ip
params['dsthost'] = dest.ip
params['rootdir'] = rootdir
source_params = params.copy()
source_params['role'] = "source"
dest_params = params.copy()
dest_params['role'] = "destination"
dest_params['migration_mode'] = "tcp"
# Report the parameters we've received
print "Test parameters:"
keys = params.keys()
keys.sort()
for key in keys:
logging.debug(" %s = %s", key, params[key])
source_control_file += ("job.run_test('kvm', tag='%s', params=%s)" %
(source_params['shortname'], source_params))
dest_control_file += ("job.run_test('kvm', tag='%s', params=%s)" %
(dest_params['shortname'], dest_params))
logging.info('Source control file:\n%s', source_control_file)
logging.info('Destination control file:\n%s', dest_control_file)
dest_command = subcommand(dest_at.run,
[dest_control_file, dest.hostname])
source_command = subcommand(source_at.run,
[source_control_file, source.hostname])
parallel([dest_command, source_command])
# Grab the pairs (and failures)
(pairs, failures) = utils.form_ntuples_from_machines(machines, 2)
# Log the failures
for failure in failures:
job.record("FAIL", failure[0], "kvm", failure[1])
# Now run through each pair and run
job.parallel_simple(run, pairs, log=False)