@@ -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:\n%s" % self.kernel_crash)
+
+
class VMAddressError(VMError):
pass
@@ -1158,6 +1167,26 @@ class VM:
return not self.process or not self.process.is_alive()
+ 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.get_output()
+ match = re.search("BUG:", data, re.MULTILINE)
+ if match is not None:
+ # Let's raise an exception only if we get a full trace
+ # (which will probably happen on the next verification)
+ match = re.search(r"BUG:.*---\[ end trace .* \]---",
+ data, re.DOTALL |re.MULTILINE)
+ if match is not None:
+ raise VMDeadKernelCrashError(match.group(0))
+
+
def get_params(self):
"""
Return the VM's params dict. Most modified params take effect only