Bad status on rally_sanity
[functest.git] / ci / run_tests.py
index 050ef0c..cb05d43 100755 (executable)
@@ -9,6 +9,7 @@
 #
 
 import argparse
+import datetime
 import os
 import re
 import sys
@@ -44,6 +45,10 @@ EXEC_SCRIPT = ("%sci/exec_test.sh" % FUNCTEST_REPO)
 CLEAN_FLAG = True
 REPORT_FLAG = False
 
+# This will be the return code of this script. If any of the tests fails,
+# this variable will change to -1
+OVERALL_RESULT = 0
+
 
 def print_separator(str, count=45):
     line = ""
@@ -57,7 +62,7 @@ def source_rc_file():
     if not os.path.isfile(rc_file):
         logger.error("RC file %s does not exist..." % rc_file)
         sys.exit(1)
-    logger.info("Sourcing the OpenStack RC file...")
+    logger.debug("Sourcing the OpenStack RC file...")
     os_utils.source_credentials(rc_file)
 
 
@@ -70,13 +75,17 @@ def cleanup():
 
 
 def run_test(test):
+    global OVERALL_RESULT
+    start = datetime.datetime.now()
     test_name = test.get_name()
+    logger.info("\n")  # blank line
     print_separator("=")
     logger.info("Running test case '%s'..." % test_name)
     print_separator("=")
     logger.debug("\n%s" % test)
 
-    generate_os_snapshot()
+    if CLEAN_FLAG:
+        generate_os_snapshot()
 
     flags = (" -t %s" % (test_name))
     if REPORT_FLAG:
@@ -87,23 +96,37 @@ def run_test(test):
 
     result = ft_utils.execute_command(cmd, logger, exit_on_error=False)
 
-    if result != 0:
-        logger.error("The test case '%s' failed. Cleaning and exiting."
-                     % test_name)
-        if CLEAN_FLAG:
-            cleanup()
-        sys.exit(1)
-
     if CLEAN_FLAG:
         cleanup()
 
+    end = datetime.datetime.now()
+    duration = (end - start).seconds
+    str = ("%02d:%02d" % divmod(duration, 60))
+    logger.info("Test execution time: %s" % str)
+
+    if result != 0:
+        logger.error("The test case '%s' failed. " % test_name)
+        OVERALL_RESULT = -1
+
+        if test.get_blocking():
+            logger.info("This test case is blocking. Exiting...")
+            sys.exit(OVERALL_RESULT)
+
+    return result
+
 
 def run_tier(tier):
+    tests = tier.get_tests()
+    if tests is None or len(tests) == 0:
+        logger.info("There are no supported test cases in this tier "
+                    "for the given scenario")
+        return 0
+    logger.info("\n\n")  # blank line
     print_separator("#")
     logger.info("Running tier '%s'" % tier.get_name())
     print_separator("#")
     logger.debug("\n%s" % tier)
-    for test in tier.get_tests():
+    for test in tests:
         run_test(test)
 
 
@@ -118,14 +141,14 @@ def run_all(tiers):
     tiers_to_run = []
 
     for tier in tiers.get_tiers():
-        if re.search(CI_LOOP, tier.get_ci_loop()) is not None:
+        if (len(tier.get_tests()) != 0 and
+                re.search(CI_LOOP, tier.get_ci_loop()) is not None):
             tiers_to_run.append(tier)
-            summary += ("\n    - %s. %s:\n\t   %s"
-                        % (tier.get_order(),
-                           tier.get_name(),
+            summary += ("\n    - %s:\n\t   %s"
+                        % (tier.get_name(),
                            tier.get_test_names()))
 
-    logger.info("Tiers to be executed:%s" % summary)
+    logger.info("Tests to be executed:%s" % summary)
 
     for tier in tiers_to_run:
         run_tier(tier)
@@ -167,7 +190,7 @@ def main():
     else:
         run_all(_tiers)
 
-    sys.exit(0)
+    sys.exit(OVERALL_RESULT)
 
 if __name__ == '__main__':
     main()