Home | History | Annotate | Download | only in tests
      1 import logging
      2 from autotest_lib.client.common_lib import error
      3 from autotest_lib.client.virt import virt_utils
      4 
      5 
      6 def run_kdump(test, params, env):
      7     """
      8     KVM reboot test:
      9     1) Log into a guest
     10     2) Check and enable the kdump
     11     3) For each vcpu, trigger a crash and check the vmcore
     12 
     13     @param test: kvm test object
     14     @param params: Dictionary with the test parameters
     15     @param env: Dictionary with test environment.
     16     """
     17     vm = env.get_vm(params["main_vm"])
     18     vm.verify_alive()
     19     timeout = float(params.get("login_timeout", 240))
     20     crash_timeout = float(params.get("crash_timeout", 360))
     21     session = vm.wait_for_login(timeout=timeout)
     22     def_kernel_param_cmd = ("grubby --update-kernel=`grubby --default-kernel`"
     23                             " --args=crashkernel=128M")
     24     kernel_param_cmd = params.get("kernel_param_cmd", def_kernel_param_cmd)
     25     def_kdump_enable_cmd = "chkconfig kdump on && service kdump start"
     26     kdump_enable_cmd = params.get("kdump_enable_cmd", def_kdump_enable_cmd)
     27     def_crash_kernel_prob_cmd = "grep -q 1 /sys/kernel/kexec_crash_loaded"
     28     crash_kernel_prob_cmd = params.get("crash_kernel_prob_cmd",
     29                                        def_crash_kernel_prob_cmd)
     30 
     31     def crash_test(vcpu):
     32         """
     33         Trigger a crash dump through sysrq-trigger
     34 
     35         @param vcpu: vcpu which is used to trigger a crash
     36         """
     37         session = vm.wait_for_login(timeout=timeout)
     38         session.cmd_output("rm -rf /var/crash/*")
     39 
     40         logging.info("Triggering crash on vcpu %d ...", vcpu)
     41         crash_cmd = "taskset -c %d echo c > /proc/sysrq-trigger" % vcpu
     42         session.sendline(crash_cmd)
     43 
     44         if not virt_utils.wait_for(lambda: not session.is_responsive(), 240, 0,
     45                                   1):
     46             raise error.TestFail("Could not trigger crash on vcpu %d" % vcpu)
     47 
     48         logging.info("Waiting for kernel crash dump to complete")
     49         session = vm.wait_for_login(timeout=crash_timeout)
     50 
     51         logging.info("Probing vmcore file...")
     52         session.cmd("ls -R /var/crash | grep vmcore")
     53         logging.info("Found vmcore.")
     54 
     55         session.cmd_output("rm -rf /var/crash/*")
     56 
     57     try:
     58         logging.info("Checking the existence of crash kernel...")
     59         try:
     60             session.cmd(crash_kernel_prob_cmd)
     61         except:
     62             logging.info("Crash kernel is not loaded. Trying to load it")
     63             session.cmd(kernel_param_cmd)
     64             session = vm.reboot(session, timeout=timeout)
     65 
     66         logging.info("Enabling kdump service...")
     67         # the initrd may be rebuilt here so we need to wait a little more
     68         session.cmd(kdump_enable_cmd, timeout=120)
     69 
     70         nvcpu = int(params.get("smp", 1))
     71         for i in range (nvcpu):
     72             crash_test(i)
     73 
     74     finally:
     75         session.close()
     76