Index: client/tests/kvm/tests/migration_with_file_transfer.py |
diff --git a/client/tests/kvm/tests/migration_with_file_transfer.py b/client/tests/kvm/tests/migration_with_file_transfer.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..044c0c85c17132de45ebbb1ead9d914bc9e964e5 |
--- /dev/null |
+++ b/client/tests/kvm/tests/migration_with_file_transfer.py |
@@ -0,0 +1,85 @@ |
+import logging, time, os |
+from autotest_lib.client.common_lib import utils, error |
+from autotest_lib.client.bin import utils as client_utils |
+import kvm_utils |
+ |
+ |
+@error.context_aware |
+def run_migration_with_file_transfer(test, params, env): |
+ """ |
+ KVM migration test: |
+ 1) Get a live VM and clone it. |
+ 2) Verify that the source VM supports migration. If it does, proceed with |
+ the test. |
+ 3) Reboot the VM |
+ 4) Send a migration command to the source VM and wait until it's finished. |
+ 5) Kill off the source VM. |
+ 6) Log into the destination VM after the migration is finished. |
+ |
+ @param test: kvm test object. |
+ @param params: Dictionary with test parameters. |
+ @param env: Dictionary with the test environment. |
+ """ |
+ vm = env.get_vm(params["main_vm"]) |
+ vm.verify_alive() |
+ login_timeout = int(params.get("login_timeout", 360)) |
+ session = vm.wait_for_login(timeout=login_timeout) |
+ |
+ mig_timeout = float(params.get("mig_timeout", "3600")) |
+ mig_protocol = params.get("migration_protocol", "tcp") |
+ mig_cancel_delay = int(params.get("mig_cancel") == "yes") * 2 |
+ |
+ host_path = "/tmp/file-%s" % kvm_utils.generate_random_string(6) |
+ host_path_returned = "%s-returned" % host_path |
+ guest_path = params.get("guest_path", "/tmp/file") |
+ file_size = params.get("file_size", "500") |
+ transfer_timeout = int(params.get("transfer_timeout", "240")) |
+ |
+ try: |
+ utils.run("dd if=/dev/urandom of=%s bs=1M count=%s" % (host_path, |
+ file_size)) |
+ |
+ def run_and_migrate(bg): |
+ bg.start() |
+ try: |
+ while bg.isAlive(): |
+ logging.info("File transfer not ended, starting a round of " |
+ "migration...") |
+ vm.migrate(mig_timeout, mig_protocol, mig_cancel_delay) |
+ except: |
+ # If something bad happened in the main thread, ignore |
+ # exceptions raised in the background thread |
+ bg.join(suppress_exception=True) |
+ raise |
+ else: |
+ bg.join() |
+ |
+ error.context("transferring file to guest while migrating", |
+ logging.info) |
+ bg = kvm_utils.Thread(vm.copy_files_to, (host_path, guest_path), |
+ dict(verbose=True, timeout=transfer_timeout)) |
+ run_and_migrate(bg) |
+ |
+ error.context("transferring file back to host while migrating", |
+ logging.info) |
+ bg = kvm_utils.Thread(vm.copy_files_from, |
+ (guest_path, host_path_returned), |
+ dict(verbose=True, timeout=transfer_timeout)) |
+ run_and_migrate(bg) |
+ |
+ # Make sure the returned file is identical to the original one |
+ error.context("comparing hashes", logging.info) |
+ orig_hash = client_utils.hash_file(host_path) |
+ returned_hash = client_utils.hash_file(host_path_returned) |
+ if orig_hash != returned_hash: |
+ raise error.TestFail("Returned file hash (%s) differs from " |
+ "original one (%s)" % (returned_hash, |
+ orig_hash)) |
+ error.context() |
+ |
+ finally: |
+ session.close() |
+ if os.path.isfile(host_path): |
+ os.remove(host_path) |
+ if os.path.isfile(host_path_returned): |
+ os.remove(host_path_returned) |