Fix up the server-side sysinfo collection (again) to make sure all
temp directories and installs on the host machine are removed. Since
the install->run collection->remove pattern seems to be pretty common,
I extracted it out into a dectorator.

Risk: Low
Visibility: Should eliminate more sysinfo collection junk eagerly.

Signed-off-by: John Admanski <[email protected]>



git-svn-id: http://test.kernel.org/svn/autotest/trunk@2938 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/server/test.py b/server/test.py
index a555b62..88d2d37 100755
--- a/server/test.py
+++ b/server/test.py
@@ -52,6 +52,18 @@
 """
 
 
+def install_autotest_and_run(func):
+    def wrapper(self, mytest):
+        try:
+            host, at = self._install()
+            outputdir = host.get_tmp_dir()
+            func(self, mytest, host, at, outputdir)
+        finally:
+            at.uninstall()
+            host.delete_tmp_dir(outputdir)
+    return wrapper
+
+
 class _sysinfo_logger(object):
     def __init__(self, job):
         self.job = job
@@ -105,23 +117,18 @@
 
 
     @log.log_and_ignore_errors("pre-test server sysinfo error:")
-    def before_hook(self, mytest):
-        host, at = self._install()
-        outputdir = host.get_tmp_dir()
-
+    @install_autotest_and_run
+    def before_hook(self, mytest, host, at, outputdir):
         # run the pre-test sysinfo script
         at.run(_sysinfo_before_test_script % outputdir,
                results_dir=self.job.resultdir)
 
         self._pull_pickle(host, outputdir)
-        host.delete_tmp_dir(outputdir)
 
 
     @log.log_and_ignore_errors("pre-test iteration server sysinfo error:")
-    def before_iteration_hook(self, mytest):
-        host, at = self._install()
-        outputdir = host.get_tmp_dir()
-
+    @install_autotest_and_run
+    def before_iteration_hook(self, mytest, host, at, outputdir):
         # this function is called after before_hook() se we have sysinfo state
         # to push to the server
         self._push_pickle(host, outputdir);
@@ -133,14 +140,11 @@
 
         # get the new sysinfo state from the client
         self._pull_pickle(host, outputdir)
-        host.delete_tmp_dir(outputdir)
 
 
     @log.log_and_ignore_errors("post-test iteration server sysinfo error:")
-    def after_iteration_hook(self, mytest):
-        host, at = self._install()
-        outputdir = host.get_tmp_dir()
-
+    @install_autotest_and_run
+    def after_iteration_hook(self, mytest, host, at, outputdir):
         # push latest sysinfo state to the client
         self._push_pickle(host, outputdir);
         # run the post-test iteration sysinfo script
@@ -152,21 +156,17 @@
         # get the new sysinfo state from the client
         self._pull_pickle(host, outputdir)
         self._pull_sysinfo_keyval(host, outputdir, mytest)
-        host.delete_tmp_dir(outputdir)
 
 
     @log.log_and_ignore_errors("post-test server sysinfo error:")
-    def after_hook(self, mytest):
-        host, at = self._install()
-        outputdir = host.get_tmp_dir()
-
+    @install_autotest_and_run
+    def after_hook(self, mytest, host, at, outputdir):
         self._push_pickle(host, outputdir);
         # run the post-test sysinfo script
         at.run(_sysinfo_after_test_script % outputdir,
                results_dir=self.job.resultdir)
 
         self._pull_sysinfo_keyval(host, outputdir, mytest)
-        host.delete_tmp_dir(outputdir)
 
 
 def runtest(job, url, tag, args, dargs):