[PATCH] KVM test: Fixes on autotest subtest

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 * Make it possible to run any generic control file inside
the guest. The reason is that we might want to try
any arbitrary combination of tests instead of just one
single test. Due to this, the test_name parameter isn't
necessary anymore.
 * Also, if the autotest test times out, try to bring back
logs for the tests that eventually might have passed,
as well as get the assessment of the test statuses at the
time the control file run timed out.

Signed-off-by: Lucas Meneghel Rodrigues <lmr@xxxxxxxxxx>
---
 client/tests/kvm/kvm_test_utils.py     |  109 ++++++++++++++++----------------
 client/tests/kvm/tests/autotest.py     |    4 +-
 client/tests/kvm/tests_base.cfg.sample |   14 ----
 3 files changed, 55 insertions(+), 72 deletions(-)

diff --git a/client/tests/kvm/kvm_test_utils.py b/client/tests/kvm/kvm_test_utils.py
index f512044..699601e 100644
--- a/client/tests/kvm/kvm_test_utils.py
+++ b/client/tests/kvm/kvm_test_utils.py
@@ -241,15 +241,14 @@ def get_memory_info(lvms):
     return meminfo
 
 
-def run_autotest(vm, session, control_path, timeout, test_name, outputdir):
+def run_autotest(vm, session, control_path, timeout, outputdir):
     """
     Run an autotest control file inside a guest (linux only utility).
 
     @param vm: VM object.
     @param session: A shell session on the VM provided.
-    @param control: An autotest control file.
-    @param timeout: Timeout under which the autotest test must complete.
-    @param test_name: Autotest client test name.
+    @param control_path: A path to an autotest control file.
+    @param timeout: Timeout under which the autotest control file must complete.
     @param outputdir: Path on host where we should copy the guest autotest
             results to.
     """
@@ -305,22 +304,49 @@ def run_autotest(vm, session, control_path, timeout, test_name, outputdir):
             logging.error("Uncompress output:\n%s" % output)
             raise error.TestFail("Could not extract %s on guest" % basename)
 
+
+    def get_results():
+        """
+        Copy autotest results present on the guest back to the host.
+        """
+        logging.info("Trying to copy autotest results from guest")
+        guest_results_dir = os.path.join(outputdir, "guest_autotest_results")
+        if not os.path.exists(guest_results_dir):
+            os.mkdir(guest_results_dir)
+        if not vm.copy_files_from("%s/results/default/*" % autotest_path,
+                                  guest_results_dir):
+            logging.error("Could not copy autotest results from guest")
+
+
+    def get_results_summary():
+        """
+        Get the status of the tests that were executed on the host and close
+        the session where autotest was being executed.
+        """
+        output = session.get_command_output("cat results/*/status")
+        results = scan_results.parse_results(output)
+        # Report test results
+        logging.info("Results (test, status, duration, info):")
+        for result in results:
+            logging.info(str(result))
+        session.close()
+        return results
+
+
     if not os.path.isfile(control_path):
         raise error.TestError("Invalid path to autotest control file: %s" %
                               control_path)
 
-    tarred_autotest_path = "/tmp/autotest.tar.bz2"
-    tarred_test_path = "/tmp/%s.tar.bz2" % test_name
+    compressed_autotest_path = "/tmp/autotest.tar.bz2"
 
     # To avoid problems, let's make the test use the current AUTODIR
     # (autotest client path) location
     autotest_path = os.environ['AUTODIR']
-    tests_path = os.path.join(autotest_path, 'tests')
-    test_path = os.path.join(tests_path, test_name)
 
     # tar the contents of bindir/autotest
-    cmd = "tar cvjf %s %s/*" % (tarred_autotest_path, autotest_path)
-    cmd += " --exclude=%s/tests" % autotest_path
+    cmd = "tar cvjf %s %s/*" % (compressed_autotest_path, autotest_path)
+    # Until we have nested virtualization, we don't need the kvm test :)
+    cmd += " --exclude=%s/tests/kvm" % autotest_path
     cmd += " --exclude=%s/results" % autotest_path
     cmd += " --exclude=%s/tmp" % autotest_path
     cmd += " --exclude=%s/control" % autotest_path
@@ -329,34 +355,18 @@ def run_autotest(vm, session, control_path, timeout, test_name, outputdir):
     cmd += " --exclude=*.git"
     utils.run(cmd)
 
-    # tar the contents of bindir/autotest/tests/<test_name>
-    cmd = "tar cvjf %s %s/*" % (tarred_test_path, test_path)
-    cmd += " --exclude=*.pyc"
-    cmd += " --exclude=*.svn"
-    cmd += " --exclude=*.git"
-    utils.run(cmd)
-
     # Copy autotest.tar.bz2
-    copy_if_size_differs(vm, tarred_autotest_path, tarred_autotest_path)
-
-    # Copy <test_name>.tar.bz2
-    copy_if_size_differs(vm, tarred_test_path, tarred_test_path)
+    copy_if_size_differs(vm, compressed_autotest_path, compressed_autotest_path)
 
     # Extract autotest.tar.bz2
-    extract(vm, tarred_autotest_path, "/")
-
-    # mkdir autotest/tests
-    session.get_command_output("mkdir -p %s" % tests_path)
-
-    # Extract <test_name>.tar.bz2 into autotest/tests
-    extract(vm, tarred_test_path, "/")
+    extract(vm, compressed_autotest_path, "/")
 
     if not vm.copy_files_to(control_path,
                             os.path.join(autotest_path, 'control')):
         raise error.TestFail("Could not copy the test control file to guest")
 
     # Run the test
-    logging.info("Running test '%s'...", test_name)
+    logging.info("Running autotest control file %s on guest", control_path)
     session.get_command_output("cd %s" % autotest_path)
     session.get_command_output("rm -f control.state")
     session.get_command_output("rm -rf results/*")
@@ -366,39 +376,28 @@ def run_autotest(vm, session, control_path, timeout, test_name, outputdir):
                                         print_func=logging.info)
     logging.info("------------- End of test output ------------")
     if status is None:
+        get_results_summary()
+        get_results()
         raise error.TestFail("Timeout elapsed while waiting for autotest to "
                              "complete")
 
-    # Get the results generated by autotest
-    output = session.get_command_output("cat results/*/status")
-    results = scan_results.parse_results(output)
-    session.close
-
-    # Copy test results to the local bindir/guest_results
-    logging.info("Copying results back from guest...")
-    guest_results_dir = os.path.join(outputdir, "guest_autotest_results")
-    if not os.path.exists(guest_results_dir):
-        os.mkdir(guest_results_dir)
-    if not vm.copy_files_from("%s/results/default/*" % autotest_path,
-                              guest_results_dir):
-        logging.error("Could not copy results back from guest")
-
-    # Report test results
-    logging.info("Results (test, status, duration, info):")
-    for result in results:
-        logging.info(str(result))
+    results = get_results_summary()
+    get_results()
 
     # Make a list of FAIL/ERROR/ABORT results (make sure FAIL results appear
     # before ERROR results, and ERROR results appear before ABORT results)
-    bad_results = [r for r in results if r[1] == "FAIL"]
-    bad_results += [r for r in results if r[1] == "ERROR"]
-    bad_results += [r for r in results if r[1] == "ABORT"]
+    bad_results = [r[0] for r in results if r[1] == "FAIL"]
+    bad_results += [r[0] for r in results if r[1] == "ERROR"]
+    bad_results += [r[0] for r in results if r[1] == "ABORT"]
 
     # Fail the test if necessary
     if not results:
-        raise error.TestFail("Test '%s' did not produce any recognizable "
-                             "results" % test_name)
+        raise error.TestFail("Autotest control file run did not produce any "
+                             "recognizable results")
     if bad_results:
-        result = bad_results[0]
-        raise error.TestFail("Test '%s' ended with %s (reason: '%s')"
-                             % (result[0], result[1], result[3]))
+        if len(bad_results) == 1:
+            e_msg = "Test %s failed during control file execution" % r[0]
+        else:
+            e_msg = ("Tests %s failed during control file execution" %
+                     " ".join(bad_results))
+        raise error.TestFail(e_msg)
diff --git a/client/tests/kvm/tests/autotest.py b/client/tests/kvm/tests/autotest.py
index 1be99db..31e36cf 100644
--- a/client/tests/kvm/tests/autotest.py
+++ b/client/tests/kvm/tests/autotest.py
@@ -17,10 +17,8 @@ def run_autotest(test, params, env):
 
     # Collect test parameters
     timeout = int(params.get("test_timeout", 300))
-    test_name = params.get("test_name")
     control_path = os.path.join(test.bindir, "autotest_control",
                                 params.get("test_control_file"))
     outputdir = test.outputdir
 
-    kvm_test_utils.run_autotest(vm, session, control_path, timeout, test_name,
-                                outputdir)
+    kvm_test_utils.run_autotest(vm, session, control_path, timeout, outputdir)
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index 17be3f2..dda3412 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -110,50 +110,36 @@ variants:
         test_timeout = 1800
         variants:
             - sleeptest:
-                test_name = sleeptest
                 test_timeout = 120
                 test_control_file = sleeptest.control
             - dbench:
-                test_name = dbench
                 test_control_file = dbench.control
             - bonnie:
-                test_name = bonnie
                 test_control_file = bonnie.control
             - ebizzy:
-                test_name = ebizzy
                 test_control_file = ebizzy.control
             - stress:
-                test_name = stress
                 test_control_file = stress.control
             - disktest:
-                test_name = disktest
                 test_control_file = disktest.control
             - ctcs2:
-                test_name = cerberus
                 # If you think this is too lengthy, please change the cerberus
                 # control file and set this timeout appropriately.
                 test_timeout = 3900
                 test_control_file = cerberus.control
             - npb:
-                test_name = npb
                 test_control_file = npb.control
             - hackbench:
-                test_name = hackbench
                 test_control_file = hackbench.control
             - cpu_hotplug:
-                test_name = cpu_hotplug
                 test_control_file = cpu_hotplug.control
             - monotonic_time:
-                test_name = monotonic_time
                 test_control_file = monotonic_time.control
             - tsc:
-                test_name = tsc
                 test_control_file = tsc.control
             - scrashme:
-                test_name = scrashme
                 test_control_file = scrashme.control
             - hwclock:
-                test_name = hwclock
                 test_control_file = hwclock.control
 
     - linux_s3:     install setup unattended_install
-- 
1.6.6.1

--
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

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux