On Fri, 2010-11-26 at 21:01 -0200, Lucas Meneghel Rodrigues wrote: > Sometimes, we need to run a test when doing operations on a running VM > (such as migrate the vm during its rebooting ). So this patch introduces > a simple warpper BackgroundTest to run a specified test in the background > through a dedicated thread, it also records the exception raised in the > thead and raise it when master call join(). Since we've spent some time looking into this and noone came up with a better solution, I'm applying Jason's series. In order to run the tests in parallel, on your test set you can put either: only migrate.with_file_transfer or only migrate.with_reboot Provided, of course, that you already had a vm installed with autotest. If you don't you probably want to include the unattended_install.cdrom test before. Cheers! Lucas > Changes from v1: > - Rebase against latest upstream > > Signed-off-by: Jason Wang <jasowang@xxxxxxxxxx> > --- > client/tests/kvm/kvm_test_utils.py | 49 +++++++++++++++++++++++++++++++++++- > 1 files changed, 48 insertions(+), 1 deletions(-) > > diff --git a/client/tests/kvm/kvm_test_utils.py b/client/tests/kvm/kvm_test_utils.py > index e7c8d33..218bf31 100644 > --- a/client/tests/kvm/kvm_test_utils.py > +++ b/client/tests/kvm/kvm_test_utils.py > @@ -21,7 +21,7 @@ More specifically: > @copyright: 2008-2009 Red Hat Inc. > """ > > -import time, os, logging, re, commands, signal > +import time, os, logging, re, commands, signal, threading > from autotest_lib.client.common_lib import error > from autotest_lib.client.bin import utils > import kvm_utils, kvm_vm, kvm_subprocess, scan_results > @@ -564,6 +564,53 @@ def run_autotest(vm, session, control_path, timeout, outputdir): > raise error.TestFail(e_msg) > > > +class BackgroundTest(object): > + """ > + This class would run a test in background through a dedicated thread. > + """ > + > + def __init__(self, func, params): > + """ > + Initialize the object and set a few attributes. > + """ > + self.thread = threading.Thread(target=self.launch, > + args=(func, params)) > + self.exception = None > + > + > + def launch(self, func, params): > + """ > + Catch and record the exception. > + """ > + try: > + func(*params) > + except Exception, e: > + self.exception = e > + > + > + def start(self): > + """ > + Run func(params) in a dedicated thread > + """ > + self.thread.start() > + > + > + def join(self): > + """ > + Wait for the join of thread and raise its exception if any. > + """ > + self.thread.join() > + if self.exception: > + raise self.exception > + > + > + def is_alive(self): > + """ > + Check whether the test is still alive. > + """ > + return self.thread.is_alive() > + > + > def get_loss_ratio(output): > """ > Get the packet loss ratio from the output of ping -- 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