| import logging |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.virt import virt_utils |
| |
| |
| def run_kdump(test, params, env): |
| """ |
| KVM reboot test: |
| 1) Log into a guest |
| 2) Check and enable the kdump |
| 3) For each vcpu, trigger a crash and check the vmcore |
| |
| @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)) |
| crash_timeout = float(params.get("crash_timeout", 360)) |
| session = vm.wait_for_login(timeout=timeout) |
| def_kernel_param_cmd = ("grubby --update-kernel=`grubby --default-kernel`" |
| " --args=crashkernel=128M") |
| kernel_param_cmd = params.get("kernel_param_cmd", def_kernel_param_cmd) |
| def_kdump_enable_cmd = "chkconfig kdump on && service kdump start" |
| kdump_enable_cmd = params.get("kdump_enable_cmd", def_kdump_enable_cmd) |
| def_crash_kernel_prob_cmd = "grep -q 1 /sys/kernel/kexec_crash_loaded" |
| crash_kernel_prob_cmd = params.get("crash_kernel_prob_cmd", |
| def_crash_kernel_prob_cmd) |
| |
| def crash_test(vcpu): |
| """ |
| Trigger a crash dump through sysrq-trigger |
| |
| @param vcpu: vcpu which is used to trigger a crash |
| """ |
| session = vm.wait_for_login(timeout=timeout) |
| session.cmd_output("rm -rf /var/crash/*") |
| |
| logging.info("Triggering crash on vcpu %d ...", vcpu) |
| crash_cmd = "taskset -c %d echo c > /proc/sysrq-trigger" % vcpu |
| session.sendline(crash_cmd) |
| |
| if not virt_utils.wait_for(lambda: not session.is_responsive(), 240, 0, |
| 1): |
| raise error.TestFail("Could not trigger crash on vcpu %d" % vcpu) |
| |
| logging.info("Waiting for kernel crash dump to complete") |
| session = vm.wait_for_login(timeout=crash_timeout) |
| |
| logging.info("Probing vmcore file...") |
| session.cmd("ls -R /var/crash | grep vmcore") |
| logging.info("Found vmcore.") |
| |
| session.cmd_output("rm -rf /var/crash/*") |
| |
| try: |
| logging.info("Checking the existence of crash kernel...") |
| try: |
| session.cmd(crash_kernel_prob_cmd) |
| except: |
| logging.info("Crash kernel is not loaded. Trying to load it") |
| session.cmd(kernel_param_cmd) |
| session = vm.reboot(session, timeout=timeout) |
| |
| logging.info("Enabling kdump service...") |
| # the initrd may be rebuilt here so we need to wait a little more |
| session.cmd(kdump_enable_cmd, timeout=120) |
| |
| nvcpu = int(params.get("smp", 1)) |
| for i in range (nvcpu): |
| crash_test(i) |
| |
| finally: |
| session.close() |