creation of scripts to generate Dashboard compatible json result files 05/1705/3
authorMorgan Richomme <morgan.richomme@orange.com>
Thu, 17 Sep 2015 16:31:08 +0000 (18:31 +0200)
committerMorgan Richomme <morgan.richomme@orange.com>
Tue, 22 Sep 2015 06:45:21 +0000 (08:45 +0200)
JIRA: FUNCTEST-45

Change-Id: I2336b830d3b5079f45c96bbb69061c8020ea637a
Signed-off-by: Morgan Richomme <morgan.richomme@orange.com>
testcases/Dashboard/dashboard_utils.py [new file with mode: 0644]
testcases/Dashboard/functest2Dashboard.py [new file with mode: 0644]
testcases/Dashboard/odl2Dashboard.py [new file with mode: 0644]
testcases/Dashboard/rally2Dashboard.py [new file with mode: 0644]
testcases/Dashboard/tempest2Dashboard.py [new file with mode: 0644]
testcases/Dashboard/vPing2Dashboard.py
testcases/config_functest.yaml
testcases/vPing/CI/libraries/vPing.py

diff --git a/testcases/Dashboard/dashboard_utils.py b/testcases/Dashboard/dashboard_utils.py
new file mode 100644 (file)
index 0000000..9056285
--- /dev/null
@@ -0,0 +1,251 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2015 Orange
+# morgan.richomme@orange.com
+#
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# This script is used to get data from test DB
+# and format them into a json format adapted for a dashboard
+#
+# v0.1: basic example
+#
+import json
+import requests
+from vPing2Dashboard import format_vPing_for_dashboard
+
+
+class TestCriteria:
+
+    """ describes the test criteria platform """
+    def __init__(self):
+        self.project = ''
+        self.testcase = ''
+        self.pod_id = -1
+        self.duration = 'all'
+        self.version = 'all'
+        self.installer = 'all'
+
+    def setCriteria(self, project, testcase, pod_id,
+                    duration, version, installer):
+        self.project = project
+        self.testcase = testcase
+        self.pod_id = pod_id
+        self.duration = duration
+        self.version = version
+        self.installer = installer
+
+    def format_criteria(self, name):
+        if(name == 'all' or name == 0):
+            return ""
+        else:
+            if(type(name) == int):
+                return "-" + str(name)
+            else:
+                return "-" + name
+
+    def format(self):
+        pod_name = self.format_criteria(self.pod_id)
+        version_name = self.format_criteria(self.version)
+        installer_name = self.format_criteria(self.installer)
+        duration_name = self.format_criteria(self.duration)
+        try:
+            fileName = "result-" + self.project + "-" + self.testcase + \
+                       pod_name + version_name + installer_name + \
+                       duration_name + ".json"
+        except:
+            print "Impossible to format json file name"
+        return fileName
+
+
+def get_pods(db_url):
+    # retrieve the list of pods
+    url = db_url + "/pods"
+    # Build headers
+    headers = {'Content-Type': 'application/json'}
+
+    try:
+        db_data = requests.get(url, headers=headers)
+        # Get result as a json object
+        pods_data = json.loads(db_data.text)
+        # Get results
+        pods = pods_data['pods']
+        pods_table = []
+        for pod in pods:
+            # cast int becase otherwise API retrieve 1.0
+            # TODO check format with API
+            pods_table.append(int(pod['_id']))
+
+        pods_table.append(0)  # 0 means all the pods here
+        return pods_table
+    except:
+        print "Error retrieving the list of PODs"
+        return None
+
+
+def get_versions(db_url):
+    # retrieve the list of versions
+    # TODO not supported in API yet
+    url = db_url + "/versions"
+    # Build headers
+    headers = {'Content-Type': 'application/json'}
+
+    try:
+        db_data = requests.get(url, headers=headers)
+        # Get result as a json object
+        versions_data = json.loads(db_data.text)
+        # Get results
+        versions = versions_data['versions']
+
+        versions_table = []
+        for version in versions:
+            versions_table.append(version['version'])
+
+        versions_table.append('all')
+
+        return versions_table
+    except:
+        print "Error retrieving the list of OPNFV versions"
+        return None
+
+
+def get_installers(db_url):
+    # retrieve the list of installers
+    # TODO not supported in API yet
+    url = db_url + "/installers"
+    # Build headers
+    headers = {'Content-Type': 'application/json'}
+
+    try:
+        db_data = requests.get(url, headers=headers)
+        # Get result as a json object
+        installers_data = json.loads(db_data.text)
+        # Get results
+        installers = installers_data['installers']
+
+        installers_table = []
+        for installer in installers:
+            installers_table.append(installer['installer'])
+
+        installers_table.append('all')
+
+        return installers
+    except:
+        print "Error retrieving the list of OPNFV installers"
+        return None
+
+
+def get_testcases(db_url, project):
+    # retrieve the list of pods
+    url = db_url + "/test_projects/" + project + "/cases"
+    # Build headers
+    headers = {'Content-Type': 'application/json'}
+
+    try:
+        db_data = requests.get(url, headers=headers)
+        # Get result as a json object
+        testcases_data = json.loads(db_data.text)
+        # Get results
+        testcases = testcases_data['test_cases']
+        testcases_table = []
+        for testcase in testcases:
+            testcases_table.append(testcase['name'])
+
+        testcases_table.append('all')
+
+        return testcases_table
+    except:
+        print "Error retrieving the list of testcases"
+        return None
+
+
+def get_results(db_url, test_criteria):
+
+    # use param to filter request to result DB
+    # if not precised => no filter
+    # filter criteria:
+    # - POD
+    # - versions
+    # - installers
+    # - testcase
+    # - test projects
+    # - timeframe (last 30 days, 365 days, since beginning of the project)
+    # e.g.
+    # - vPing tests since 2 months
+    # - Tempest tests on LF POD2 fuel based / Arno stable since the beginning
+    # - yardstick tests on any POD since 30 days
+    # - Qtip tests on dell-test1 POD
+    #
+    # params = {"pod_id":pod_id, "testcase":testcase}
+    # filter_date = days # data from now - days
+
+    # test_project = test_criteria.project
+    testcase = test_criteria.testcase
+    # duration_frame = test_criteria.duration
+    # version = test_criteria.version
+    # installer_type = test_criteria.installer
+    pod_id = test_criteria.pod_id
+
+    pod_criteria = ""
+    if (pod_id > 0):
+        pod_criteria = "&pod=" + str(pod_id)
+
+    # TODO complete params (installer type, testcase, version )
+    # need API to be up to date
+    # we assume that criteria could be used at the API level
+    # no need to processing on date for instance
+    params = {"pod_id": pod_id}
+
+    # Build headers
+    headers = {'Content-Type': 'application/json'}
+
+    url = db_url + "/results?case=" + testcase + pod_criteria
+
+    # Send Request to Test DB
+    myData = requests.get(url, data=json.dumps(params), headers=headers)
+    # Get result as a json object
+    myNewData = json.loads(myData.text)
+
+    # Get results
+    myDataResults = myNewData['test_results']
+
+    return myDataResults
+
+
+def generateJson(test_name, test_case, db_url):
+    # pod_id = 1
+    # test_version = 'Arno master'
+    # test_installer = 'fuel'
+    # test_retention = 30
+
+    pods = get_pods(db_url)
+    versions = ['ArnoR1', 'ArnoSR1', 'all']  # not available in the API yet
+    installers = ['fuel', 'foreman', 'all']  # not available in the API yet
+    test_durations = [90, 365, 'all']  # not available through the API yet
+
+    # For all the PoDs
+    for pod in pods:
+        # all the versions
+        for version in versions:
+            # all the installers
+            for installer in installers:
+                # all the retention time
+                for test_duration in test_durations:
+
+                    criteria = TestCriteria()
+                    criteria.setCriteria(test_name, test_case, pod,
+                                         test_duration, version, installer)
+                    format_data_for_dashboard(criteria)
+
+
+def format_data_for_dashboard(criteria):
+
+    # Depending on the use case, json for dashboarding is customized
+    # depending on the graph you want to show
+
+    if (criteria.testcase == "vPing"):
+        format_vPing_for_dashboard(criteria)
diff --git a/testcases/Dashboard/functest2Dashboard.py b/testcases/Dashboard/functest2Dashboard.py
new file mode 100644 (file)
index 0000000..c03ddbd
--- /dev/null
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2015 Orange
+# morgan.richomme@orange.com
+#
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# This script is used to get data from test DB
+# and format them into a json format adapted for a dashboard
+#
+# v0.1: basic example
+#
+import logging
+import argparse
+import pprint
+import dashboard_utils
+import os
+import yaml
+
+pp = pprint.PrettyPrinter(indent=4)
+
+parser = argparse.ArgumentParser()
+parser.add_argument("repo_path", help="Path to the repository")
+parser.add_argument("-d", "--debug", help="Debug mode",  action="store_true")
+args = parser.parse_args()
+
+""" logging configuration """
+logger = logging.getLogger('config_functest')
+logger.setLevel(logging.DEBUG)
+
+ch = logging.StreamHandler()
+if args.debug:
+    ch.setLevel(logging.DEBUG)
+else:
+    ch.setLevel(logging.INFO)
+
+formatter = logging.Formatter('%(asctime)s - %(name)s -\
+                                 %(levelname)s - %(message)s')
+ch.setFormatter(formatter)
+logger.addHandler(ch)
+
+if not os.path.exists(args.repo_path):
+    logger.error("Repo directory not found '%s'" % args.repo_path)
+    exit(-1)
+
+with open(args.repo_path+"testcases/config_functest.yaml") as f:
+    functest_yaml = yaml.safe_load(f)
+f.close()
+
+""" global variables """
+# Directories
+HOME = os.environ['HOME']+"/"
+REPO_PATH = args.repo_path
+TEST_DB = functest_yaml.get("results").get("test_db_url")
+
+
+def main():
+    try:
+        logger.info("Functest test result generation for dashboard")
+
+        # TODO create the loop to provide all the json files
+        logger.debug("Retrieve all the testcases from DB")
+        test_cases = dashboard_utils.get_testcases(TEST_DB, "functest")
+
+        # TODO to be refactor once graph for Tempest, rally and ODL ready
+        # Do it only for vPing in first stage
+        for case in test_cases:
+            logger.debug("Generate " + case + " json files")
+            dashboard_utils.generateJson('functest', case, TEST_DB)
+
+        logger.info("Functest json files for dashboard successfully generated")
+    except:
+        logger.error("Impossible to generate json files for dashboard")
+
+
+if __name__ == '__main__':
+    main()
diff --git a/testcases/Dashboard/odl2Dashboard.py b/testcases/Dashboard/odl2Dashboard.py
new file mode 100644 (file)
index 0000000..1224766
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2015 Orange
+# morgan.richomme@orange.com
+#
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# This script is used to build json files for the dashboard
+# for the ODL test case
+#
+# v0.1: basic example
+#
+import logging
+import argparse
+import pprint
+# import json
+# import dashboard_utils
+import os
+import yaml
+
+pp = pprint.PrettyPrinter(indent=4)
+
+parser = argparse.ArgumentParser()
+parser.add_argument("repo_path", help="Path to the repository")
+parser.add_argument("-d", "--debug", help="Debug mode",  action="store_true")
+args = parser.parse_args()
+
+""" logging configuration """
+logger = logging.getLogger('config_functest')
+logger.setLevel(logging.DEBUG)
+
+if not os.path.exists(args.repo_path):
+    logger.error("Repo directory not found '%s'" % args.repo_path)
+    exit(-1)
+
+with open(args.repo_path+"testcases/config_functest.yaml") as f:
+    functest_yaml = yaml.safe_load(f)
+f.close()
+
+""" global variables """
+# Directories
+HOME = os.environ['HOME']+"/"
+REPO_PATH = args.repo_path
+TEST_DB = functest_yaml.get("results").get("test_db_url")
+
+
+def format_tempest_for_dashboard(criteria):
+    logger.debug("generate dashboard json files for ODL suite")
diff --git a/testcases/Dashboard/rally2Dashboard.py b/testcases/Dashboard/rally2Dashboard.py
new file mode 100644 (file)
index 0000000..20e5974
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2015 Orange
+# morgan.richomme@orange.com
+#
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# This script is used to build json files for the dashboard
+# for the rally test case
+#
+# v0.1: basic example
+#
+import logging
+import argparse
+import pprint
+# import json
+# import dashboard_utils
+import os
+import yaml
+
+pp = pprint.PrettyPrinter(indent=4)
+
+parser = argparse.ArgumentParser()
+parser.add_argument("repo_path", help="Path to the repository")
+parser.add_argument("-d", "--debug", help="Debug mode",  action="store_true")
+args = parser.parse_args()
+
+""" logging configuration """
+logger = logging.getLogger('config_functest')
+logger.setLevel(logging.DEBUG)
+
+if not os.path.exists(args.repo_path):
+    logger.error("Repo directory not found '%s'" % args.repo_path)
+    exit(-1)
+
+with open(args.repo_path+"testcases/config_functest.yaml") as f:
+    functest_yaml = yaml.safe_load(f)
+f.close()
+
+""" global variables """
+# Directories
+HOME = os.environ['HOME']+"/"
+REPO_PATH = args.repo_path
+TEST_DB = functest_yaml.get("results").get("test_db_url")
+
+
+def format_tempest_for_dashboard(criteria):
+    logger.debug("generate dashboard json files for rally")
diff --git a/testcases/Dashboard/tempest2Dashboard.py b/testcases/Dashboard/tempest2Dashboard.py
new file mode 100644 (file)
index 0000000..8cbecbb
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2015 Orange
+# morgan.richomme@orange.com
+#
+# This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# This script is used to build json files for the dashboard
+# for the tempest test case
+#
+# v0.1: basic example
+#
+import logging
+import argparse
+import pprint
+# import json
+# import dashboard_utils
+import os
+import yaml
+
+pp = pprint.PrettyPrinter(indent=4)
+
+parser = argparse.ArgumentParser()
+parser.add_argument("repo_path", help="Path to the repository")
+parser.add_argument("-d", "--debug", help="Debug mode",  action="store_true")
+args = parser.parse_args()
+
+""" logging configuration """
+logger = logging.getLogger('config_functest')
+logger.setLevel(logging.DEBUG)
+
+if not os.path.exists(args.repo_path):
+    logger.error("Repo directory not found '%s'" % args.repo_path)
+    exit(-1)
+
+with open(args.repo_path+"testcases/config_functest.yaml") as f:
+    functest_yaml = yaml.safe_load(f)
+f.close()
+
+""" global variables """
+# Directories
+HOME = os.environ['HOME']+"/"
+REPO_PATH = args.repo_path
+TEST_DB = functest_yaml.get("results").get("test_db_url")
+
+
+def format_tempest_for_dashboard(criteria):
+    logger.debug("generate dashboard json files for Tempest")
index d32187a..f799e28 100644 (file)
@@ -9,8 +9,8 @@
 #
 # http://www.apache.org/licenses/LICENSE-2.0
 #
-# This script is used to get data from test DB
-# and format them into a json format adapted for a dashboard
+# This script is used to build json files for the dashboard
+# for the vPing test case
 #
 # v0.1: basic example
 #
@@ -18,65 +18,40 @@ import logging
 import argparse
 import pprint
 import json
-import requests
+import dashboard_utils
+import os
+import yaml
 
 pp = pprint.PrettyPrinter(indent=4)
 
 parser = argparse.ArgumentParser()
+parser.add_argument("repo_path", help="Path to the repository")
 parser.add_argument("-d", "--debug", help="Debug mode",  action="store_true")
 args = parser.parse_args()
 
 """ logging configuration """
-logger = logging.getLogger('vPing2DashBoard')
+logger = logging.getLogger('config_functest')
 logger.setLevel(logging.DEBUG)
 
-ch = logging.StreamHandler()
-if args.debug:
-    ch.setLevel(logging.DEBUG)
-else:
-    ch.setLevel(logging.INFO)
-
-formatter = logging.Formatter  # retrieve info from DB
-('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-ch.setFormatter(formatter)
-logger.addHandler(ch)
-
-
-def get_data(test_project, testcase, pod_id, days, version, installerType):
-    # ugly hard coding => TODO use yaml config file
-    url = "http://213.77.62.197:80/results"
-
-    # use param to filter request to result DB
-    # if not precised => no filter
-    # filter criteria:
-    # - POD
-    # - versions
-    # - installers
-    # - testcase
-    # - test projects
-    # - timeframe (last 30 days, 365 days, since beginning of the project)
-    # e.g.
-    # - vPing tests since 2 months
-    # - Tempest tests on LF POD2 fuel based / Arno stable since the beginning
-    # - yardstick tests on any POD since 30 days
-    # - Qtip tests on dell-test1 POD
-    #
-    # params = {"pod_id":pod_id, "testcase":testcase}
-    # filter_date = days # data from now - days
-
-    # TODO complete params (installer type, testcase, version )
-    params = {"pod_id": 1}
-
-    # Build headers
-    headers = {'Content-Type': 'application/json'}
-
-    # Send Request to Test DB
-    myData = requests.get(url, data=json.dumps(params), headers=headers)
-    # Get result as a json object
-    myNewData = json.loads(myData.text)
+if not os.path.exists(args.repo_path):
+    logger.error("Repo directory not found '%s'" % args.repo_path)
+    exit(-1)
+
+with open(args.repo_path+"testcases/config_functest.yaml") as f:
+    functest_yaml = yaml.safe_load(f)
+f.close()
+
+""" global variables """
+# Directories
+HOME = os.environ['HOME']+"/"
+REPO_PATH = args.repo_path
+TEST_DB = functest_yaml.get("results").get("test_db_url")
+
+
+def format_vPing_for_dashboard(criteria):
 
     # Get results
-    myDataResults = myNewData['test_results']
+    myDataResults = dashboard_utils.get_results(TEST_DB, criteria)
 
     # Depending on the use case, json for dashboarding is customized
     # depending on the graph you want to show
@@ -84,6 +59,7 @@ def get_data(test_project, testcase, pod_id, days, version, installerType):
     test_data = [{'description': 'vPing results for Dashboard'}]
 
     # Graph 1: Duration = f(time)
+    # ***************************
     new_element = []
     for data in myDataResults:
         new_element.append({'x': data['creation_date'],
@@ -96,6 +72,7 @@ def get_data(test_project, testcase, pod_id, days, version, installerType):
                       'data_set': new_element})
 
     # Graph 2: bar
+    # ************
     nbTest = 0
     nbTestOk = 0
 
@@ -104,24 +81,14 @@ def get_data(test_project, testcase, pod_id, days, version, installerType):
         if data['details']['status'] == "OK":
             nbTestOk += 1
 
-    # Generate json file
-    # TODO complete with other criteria
-    fileName = "result-" + test_project + "-" + testcase + "-" + str(days) + "-" + str(pod_id) + "-status.json"
-
     test_data.append({'name': "vPing status",
                       'info': {"type": "bar"},
                       'data_set': [{'Nb tests': nbTest,
                                     'Nb Success': nbTestOk}]})
 
-    fileName = "result-" + test_project + "-" + testcase + ".json"
+    # Generate json file
+    fileName = criteria.format()
+    logger.debug("Generate json file:" + fileName)
 
     with open(fileName, "w") as outfile:
         json.dump(test_data, outfile, indent=4)
-
-
-def main():
-    get_data('functest', 'vPing', 1, 30, 'Arno master', 'fuel')
-
-
-if __name__ == '__main__':
-    main()
index 484d66e..c38b460 100644 (file)
@@ -39,4 +39,4 @@ vping:
     ip_2: 192.168.120.40
 
 results:
-    test_db_url: http://213.77.62.197:80/results
+    test_db_url: http://213.77.62.197
index 56f4fc5..5d68f22 100644 (file)
@@ -246,7 +246,7 @@ def cleanup(nova, neutron, network_dic):
 def push_results_to_db(payload):
 
     # TODO move DB creds into config file
-    url = TEST_DB
+    url = TEST_DB + "/results"
     params = {"project_name": "functest", "case_name": "vPing", "pod_id": 1,
               "details": payload}
     headers = {'Content-Type': 'application/json'}