A method to verify guest kernel panics can be very useful for a number of tests. Adapted from a function present on virtio_console test, create VM.verify_kernel_crash() and use it on unattended_install. Signed-off-by: Lucas Meneghel Rodrigues <lmr@xxxxxxxxxx> --- client/tests/kvm/kvm_vm.py | 32 ++++++++++++++++++++++++++ client/tests/kvm/tests/unattended_install.py | 1 + 2 files changed, 33 insertions(+), 0 deletions(-) diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py index 41f7491..ab60f71 100755 --- a/client/tests/kvm/kvm_vm.py +++ b/client/tests/kvm/kvm_vm.py @@ -105,6 +105,15 @@ class VMDeadError(VMError): (self.status, self.output)) +class VMDeadKernelCrashError(VMError): + def __init__(self, kernel_crash): + VMError.__init__(self, kernel_crash) + self.kernel_crash = kernel_crash + + def __str__(self): + return ("VM is dead due to a kernel crash: %s" % self.kernel_crash) + + class VMAddressError(VMError): pass @@ -1471,6 +1480,29 @@ class VM: return self.serial_login(internal_timeout) + def verify_kernel_crash(self, timeout=2): + """ + Find kernel crash message on serial console. + + @param timeout: Timeout used to verify expected output. + + @raise: VMDeadKernelCrashError, in case a kernel crash message was + found. + """ + data = self.serial_console.read_nonblocking() + match = re.search("BUG:", data, re.MULTILINE) + if match is not None: + match = re.search(r"BUG:.*---\[ end trace .* \]---", + data, re.DOTALL |re.MULTILINE) + if match is None: + data += self.serial_console.read_until_last_line_matches( + ["---\[ end trace .* \]---"], + timeout) + match = re.search(r"(BUG:.*---\[ end trace .* \]---)", + data, re.DOTALL |re.MULTILINE) + raise VMDeadKernelCrashError(match.group(0)) + + @error.context_aware def migrate(self, timeout=3600, protocol="tcp", cancel_delay=None, offline=False, stable_check=False, clean=True, diff --git a/client/tests/kvm/tests/unattended_install.py b/client/tests/kvm/tests/unattended_install.py index 7c6d845..955f8d6 100644 --- a/client/tests/kvm/tests/unattended_install.py +++ b/client/tests/kvm/tests/unattended_install.py @@ -33,6 +33,7 @@ def run_unattended_install(test, params, env): start_time = time.time() while (time.time() - start_time) < install_timeout: vm.verify_alive() + vm.verify_kernel_crash() client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: client.connect((vm.get_address(), port)) -- 1.7.4 -- 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