bug fix: consider pagination when retrieveing results for reporting
[releng.git] / utils / test / reporting / utils / reporting_utils.py
index fc5d188..0a178ba 100644 (file)
@@ -10,6 +10,7 @@ from urllib2 import Request, urlopen, URLError
 import logging
 import json
 import os
+import requests
 import pdfkit
 import yaml
 
@@ -101,26 +102,44 @@ def getApiResults(case, installer, scenario, version):
 
 def getScenarios(case, installer, version):
 
-    case = case.getName()
+    try:
+        case = case.getName()
+    except:
+        # if case is not an object test case, try the string
+        if type(case) == str:
+            case = case
+        else:
+            raise ValueError("Case cannot be evaluated")
+
     period = get_config('general.period')
     url_base = get_config('testapi.url')
 
     url = ("http://" + url_base + "?case=" + case +
            "&period=" + str(period) + "&installer=" + installer +
            "&version=" + version)
-    request = Request(url)
 
     try:
+        request = Request(url)
         response = urlopen(request)
         k = response.read()
         results = json.loads(k)
         test_results = results['results']
-    except URLError as e:
-        print('Got an error code:', e)
+
+        page = results['pagination']['total_pages']
+        if page > 1:
+            test_results = []
+            for i in range(1, page + 1):
+                url_page = url + "&page=" + str(i)
+                request = Request(url_page)
+                response = urlopen(request)
+                k = response.read()
+                results = json.loads(k)
+                test_results += results['results']
+    except URLError as err:
+        print('Got an error code:', err)
 
     if test_results is not None:
         test_results.reverse()
-
         scenario_results = {}
 
         for r in test_results:
@@ -148,7 +167,6 @@ def getScenarioStats(scenario_results):
     return scenario_stats
 
 
-# TODO convergence with above function getScenarios
 def getScenarioStatus(installer, version):
     period = get_config('general.period')
     url_base = get_config('testapi.url')
@@ -190,6 +208,35 @@ def getScenarioStatus(installer, version):
     return result_dict
 
 
+def getQtipResults(version, installer):
+    period = get_config('qtip.period')
+    url_base = get_config('testapi.url')
+
+    url = ("http://" + url_base + "?project=qtip" +
+           "&installer=" + installer +
+           "&version=" + version + "&period=" + str(period))
+    request = Request(url)
+
+    try:
+        response = urlopen(request)
+        k = response.read()
+        response.close()
+        results = json.loads(k)['results']
+    except URLError as err:
+        print('Got an error code:', err)
+
+    result_dict = {}
+    if results:
+        for r in results:
+            key = '{}/{}'.format(r['pod_name'], r['scenario'])
+            if key not in result_dict.keys():
+                result_dict[key] = []
+            result_dict[key].append(r['details']['score'])
+
+    # return scenario_results
+    return result_dict
+
+
 def getNbtestOk(results):
     nb_test_ok = 0
     for r in results:
@@ -269,11 +316,15 @@ def getJenkinsUrl(build_tag):
     url_base = get_config('functest.jenkins_url')
     try:
         build_id = [int(s) for s in build_tag.split("-") if s.isdigit()]
-        url_id = build_tag[8:-(len(build_id) + 3)] + "/" + str(build_id[0])
+        url_id = (build_tag[8:-(len(str(build_id[0])) + 1)] +
+                  "/" + str(build_id[0]))
         jenkins_url = url_base + url_id + "/console"
     except:
         print('Impossible to get jenkins url:')
 
+    if "jenkins-" not in build_tag:
+        jenkins_url = None
+
     return jenkins_url
 
 
@@ -286,6 +337,44 @@ def getScenarioPercent(scenario_score, scenario_criteria):
     return score
 
 
+# *********
+# Functest
+# *********
+def getFunctestConfig(version=""):
+    config_file = get_config('functest.test_conf') + version
+    response = requests.get(config_file)
+    return yaml.safe_load(response.text)
+
+
+def getArchitectures(scenario_results):
+    supported_arch = ['x86']
+    if (len(scenario_results) > 0):
+        for scenario_result in scenario_results.values():
+            for value in scenario_result:
+                if ("armband" in value['build_tag']):
+                    supported_arch.append('aarch64')
+                    return supported_arch
+    return supported_arch
+
+
+def filterArchitecture(results, architecture):
+    filtered_results = {}
+    for name, results in results.items():
+        filtered_values = []
+        for value in results:
+            if (architecture is "x86"):
+                # drop aarch64 results
+                if ("armband" not in value['build_tag']):
+                    filtered_values.append(value)
+            elif(architecture is "aarch64"):
+                # drop x86 results
+                if ("armband" in value['build_tag']):
+                    filtered_values.append(value)
+        if (len(filtered_values) > 0):
+            filtered_results[name] = filtered_values
+    return filtered_results
+
+
 # *********
 # Yardstick
 # *********
@@ -347,14 +436,22 @@ def export_csv(scenario_file_name, installer, version):
                                     "/functest/scenario_history_" +
                                     installer + ".csv")
     scenario_installer_file = open(scenario_installer_file_name, "a")
-    with open(scenario_file_name, "r") as f:
+    with open(scenario_file_name, "r") as scenario_file:
         scenario_installer_file.write("date,scenario,installer,detail,score\n")
-        for line in f:
+        for line in scenario_file:
             if installer in line:
                 scenario_installer_file.write(line)
         scenario_installer_file.close
 
 
+def generate_csv(scenario_file):
+    import shutil
+    # csv
+    # generate sub files based on scenario_history.txt
+    csv_file = scenario_file.replace('txt', 'csv')
+    shutil.copy2(scenario_file, csv_file)
+
+
 def export_pdf(pdf_path, pdf_doc_name):
     try:
         pdfkit.from_file(pdf_path, pdf_doc_name)