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)