On 03/02/2011 07:30 AM, Jason Wang wrote: > Lucas Meneghel Rodrigues writes: > > 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. > > > > How about using a thread to monitor the serial console, so other test can also > benefit from this? If an exception is raised in a background thread, it won't kill the main thread, so it's not obvious how a background thread can help here. Or maybe I misunderstood your suggestion? > > 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 > -- > 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 -- 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