dovetail tool: check push_to_db success or fail 63/32463/4
authorxudan <xudan16@huawei.com>
Thu, 30 Mar 2017 10:23:01 +0000 (10:23 +0000)
committerxudan <xudan16@huawei.com>
Fri, 31 Mar 2017 02:29:51 +0000 (02:29 +0000)
JIRA: DOVETAIL-380

If Functest fails to push results to db, there is just an error log in functest.log
Dovetail needs to know the failure.
Dovetail will get the results from db with keys, build_tag and testcase.
If it can get the results data, it means push_to_db success.

Fix the duration time wrong.

Change-Id: If03bdf0ceb2f1a9d422381cdf06e1fd207358bd5
Signed-off-by: xudan <xudan16@huawei.com>
dovetail/run.py
dovetail/utils/dovetail_utils.py

index 828a2b7..78e085e 100755 (executable)
@@ -44,6 +44,7 @@ def run_test(testsuite, testarea, logger):
             testarea_list.append(value)
 
     duration = 0
+    start_time = time.time()
     for testcase_name in testarea_list:
         logger.info('>>[testcase]: %s', testcase_name)
         testcase = Testcase.get(testcase_name)
@@ -60,21 +61,33 @@ def run_test(testsuite, testarea, logger):
             run_testcase = False
 
         if run_testcase:
-            start_time = time.time()
             testcase.run()
-            end_time = time.time()
-            duration = end_time - start_time
 
-        if dt_cfg.dovetail_config['report_dest'].startswith("http"):
-            logger.info("Results has been pushed to database.")
-        if dt_cfg.dovetail_config['report_dest'] == "file":
-            logger.info("Results has been stored with files.")
-            result = Report.get_result(testcase)
-            Report.check_result(testcase, result)
+        check_tc_result(testcase, logger)
 
+    end_time = time.time()
+    duration = end_time - start_time
     return duration
 
 
+def check_tc_result(testcase, logger):
+    if dt_cfg.dovetail_config['report_dest'].startswith("http"):
+        if testcase.validate_type() == 'yardstick':
+            logger.info("Results have been stored with files.")
+        else:
+            if dt_utils.check_db_results(dt_cfg.dovetail_config['report_dest'],
+                                         dt_cfg.dovetail_config['build_tag'],
+                                         testcase.validate_testcase(),
+                                         logger):
+                logger.info("Results have been pushed to database.")
+            else:
+                logger.error("Fail to push results to database.")
+    if dt_cfg.dovetail_config['report_dest'] == "file":
+        logger.info("Results have been stored with files.")
+        result = Report.get_result(testcase)
+        Report.check_result(testcase, result)
+
+
 def validate_input(input_dict, check_dict, logger):
     # for 'func_tag' and 'yard_tag' options
     func_tag = input_dict['func_tag']
index 32d334e..e72a37c 100644 (file)
@@ -14,6 +14,8 @@ import os
 import re
 import subprocess
 from collections import Mapping, Set, Sequence
+import json
+import urllib2
 
 
 def exec_log(verbose, logger, msg, level, flush=False):
@@ -123,6 +125,20 @@ def get_ext_net_name(env_file, logger=None):
     return None
 
 
+def check_db_results(db_url, build_tag, testcase, logger):
+    url = "%s/results?build_tag=%s&case=%s" % (db_url, build_tag, testcase)
+    logger.debug("Query to rest api: %s", url)
+    try:
+        data = json.load(urllib2.urlopen(url))
+        if data['results']:
+            return True
+        else:
+            return False
+    except Exception as e:
+        logger.error("Cannot read content from %s, exception: %s", url, e)
+        return False
+
+
 def show_progress_bar(length):
     max_len = 50
     length %= max_len