| Index: client/tests/kvm/tests/vmstop.py
|
| diff --git a/client/tests/kvm/tests/vmstop.py b/client/tests/kvm/tests/vmstop.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..74ecb23c1fcfdc1cc1233fda75d5cef2c37d0bef
|
| --- /dev/null
|
| +++ b/client/tests/kvm/tests/vmstop.py
|
| @@ -0,0 +1,83 @@
|
| +import logging, time, os
|
| +from autotest_lib.client.common_lib import error
|
| +from autotest_lib.client.bin import utils
|
| +import kvm_utils
|
| +
|
| +
|
| +def run_vmstop(test, params, env):
|
| + """
|
| + KVM guest stop test:
|
| + 1) Log into a guest
|
| + 2) Copy a file into guest
|
| + 3) Stop guest
|
| + 4) Check the status through monitor
|
| + 5) Check the session
|
| + 6) Migrat the vm to a file twice and compare them.
|
| +
|
| + @param test: kvm test object
|
| + @param params: Dictionary with the test parameters
|
| + @param env: Dictionary with test environment.
|
| + """
|
| + vm = env.get_vm(params["main_vm"])
|
| + vm.verify_alive()
|
| + timeout = float(params.get("login_timeout", 240))
|
| + session = vm.wait_for_login(timeout=timeout)
|
| +
|
| + save_path = params.get("save_path", "/tmp")
|
| + clean_save = params.get("clean_save") == "yes"
|
| + save1 = os.path.join(save_path, "save1")
|
| + save2 = os.path.join(save_path, "save2")
|
| +
|
| + guest_path = params.get("guest_path", "/tmp")
|
| + file_size = params.get("file_size", "1000")
|
| +
|
| + try:
|
| + utils.run("dd if=/dev/zero of=/tmp/file bs=1M count=%s" % file_size)
|
| + # Transfer file from host to guest, we didn't expect the finish of
|
| + # transfer, we just let it to be a kind of stress in guest.
|
| + bg = kvm_utils.Thread(vm.copy_files_to, ("/tmp/file", guest_path),
|
| + dict(verbose=True, timeout=60))
|
| + logging.info("Start the background transfer")
|
| + bg.start()
|
| +
|
| + try:
|
| + # wait for the transfer start
|
| + time.sleep(5)
|
| + logging.info("Stop the VM")
|
| + vm.monitor.cmd("stop")
|
| +
|
| + # check with monitor
|
| + logging.info("Check the status through monitor")
|
| + if "paused" not in vm.monitor.info("status"):
|
| + raise error.TestFail("Guest did not pause after sending stop")
|
| +
|
| + # check through session
|
| + logging.info("Check the session")
|
| + if session.is_responsive():
|
| + raise error.TestFail("Session still alive after sending stop")
|
| +
|
| + # Check with the migration file
|
| + logging.info("Save and check the state files")
|
| + for p in [save1, save2]:
|
| + vm.save_to_file(p)
|
| + time.sleep(1)
|
| + if not os.path.isfile(p):
|
| + raise error.TestFail("VM failed to save state file %s" % p)
|
| +
|
| + # Fail if we see deltas
|
| + md5_save1 = utils.hash_file(save1)
|
| + md5_save2 = utils.hash_file(save2)
|
| + if md5_save1 != md5_save2:
|
| + raise error.TestFail("The produced state files differ")
|
| + finally:
|
| + bg.join(suppress_exception=True)
|
| +
|
| + finally:
|
| + session.close()
|
| + if clean_save:
|
| + logging.debug("Clean the state files")
|
| + if os.path.isfile(save1):
|
| + os.remove(save1)
|
| + if os.path.isfile(save2):
|
| + os.remove(save2)
|
| + vm.monitor.cmd("cont")
|
|
|