Move the reboot code from the boot test (tests/boot.py) to kvm_test_utils.py in order to make it reusable. Signed-off-by: Michael Goldish <mgoldish@xxxxxxxxxx> --- client/tests/kvm/kvm_test_utils.py | 44 ++++++++++++++++++++++++++++++++++++ client/tests/kvm/tests/boot.py | 33 +++++--------------------- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/client/tests/kvm/kvm_test_utils.py b/client/tests/kvm/kvm_test_utils.py index db9f666..4d7b1c3 100644 --- a/client/tests/kvm/kvm_test_utils.py +++ b/client/tests/kvm/kvm_test_utils.py @@ -61,6 +61,50 @@ def wait_for_login(vm, nic_index=0, timeout=240): return session +def reboot(vm, session, method="shell", sleep_before_reset=10, nic_index=0, + timeout=240): + """ + Reboot the VM and wait for it to come back up by trying to log in until + timeout expires. + + @param vm: VM object. + @param session: A shell session object. + @param method: Reboot method. Can be "shell" (send a shell reboot + command) or "system_reset" (send a system_reset monitor command). + @param nic_index: Index of NIC to access in the VM, when logging in after + rebooting. + @param timeout: Time to wait before giving up (after rebooting). + @return: A new shell session object. + """ + if method == "shell": + # Send a reboot command to the guest's shell + session.sendline(vm.get_params().get("reboot_command")) + logging.info("Reboot command sent; waiting for guest to go down...") + elif method == "system_reset": + # Sleep for a while before sending the command + time.sleep(sleep_before_reset) + # Send a system_reset monitor command + vm.send_monitor_cmd("system_reset") + logging.info("system_reset monitor command sent; waiting for guest to " + "go down...") + else: + logging.error("Unknown reboot method: %s" % method) + + # Wait for the session to become unresponsive and close it + if not kvm_utils.wait_for(lambda: not session.is_responsive(), 120, 0, 1): + raise error.TestFail("Guest refuses to go down") + session.close() + + # Try logging into the guest until timeout expires + logging.info("Guest is down; waiting for it to go up again...") + session = kvm_utils.wait_for(lambda: vm.remote_login(nic_index=nic_index), + timeout, 0, 2) + if not session: + raise error.TestFail("Could not log into guest after reboot") + logging.info("Guest is up again") + return session + + def migrate(vm, env=None): """ Migrate a VM locally and re-register it in the environment. diff --git a/client/tests/kvm/tests/boot.py b/client/tests/kvm/tests/boot.py index 282efda..cd1f1d4 100644 --- a/client/tests/kvm/tests/boot.py +++ b/client/tests/kvm/tests/boot.py @@ -19,33 +19,14 @@ def run_boot(test, params, env): session = kvm_test_utils.wait_for_login(vm) try: - if params.get("reboot_method") == "shell": - # Send a reboot command to the guest's shell - session.sendline(vm.get_params().get("reboot_command")) - logging.info("Reboot command sent; waiting for guest to go " - "down...") - elif params.get("reboot_method") == "system_reset": - # Sleep for a while -- give the guest a chance to finish booting - time.sleep(float(params.get("sleep_before_reset", 10))) - # Send a system_reset monitor command - vm.send_monitor_cmd("system_reset") - logging.info("system_reset monitor command sent; waiting for " - "guest to go down...") - else: return + if not params.get("reboot_method"): + return - # Wait for the session to become unresponsive - if not kvm_utils.wait_for(lambda: not session.is_responsive(), - 120, 0, 1): - raise error.TestFail("Guest refuses to go down") + # Reboot the VM + session = kvm_test_utils.reboot(vm, session, + params.get("reboot_method"), + float(params.get("sleep_before_reset", + 10))) finally: session.close() - - logging.info("Guest is down; waiting for it to go up again...") - - session = kvm_utils.wait_for(vm.remote_login, 240, 0, 2) - if not session: - raise error.TestFail("Could not log into guest after reboot") - session.close() - - logging.info("Guest is up again") -- 1.5.4.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html