summaryrefslogtreecommitdiffstats
path: root/testcases/Dashboard
diff options
context:
space:
mode:
authorMorgan Richomme <morgan.richomme@orange.com>2015-10-01 11:03:09 +0200
committerMorgan Richomme <morgan.richomme@orange.com>2015-10-01 11:03:09 +0200
commit19c7d0ecfd453d5e631466401e454d4da3314f9b (patch)
treec1dac5451af1760f963d709772b5062ba2741983 /testcases/Dashboard
parent5901dd9a47b08c162acb631bf5acaeeb1b7ce745 (diff)
parent96bf9abe9b1b26a79dcc86900e8eb33d8544e773 (diff)
Merge branch 'master' into stable/arnoarno.2015.2.0
Diffstat (limited to 'testcases/Dashboard')
-rw-r--r--testcases/Dashboard/dashboard_utils.py251
-rw-r--r--testcases/Dashboard/functest2Dashboard.py81
-rw-r--r--testcases/Dashboard/odl2Dashboard.py52
-rw-r--r--testcases/Dashboard/rally2Dashboard.py52
-rw-r--r--testcases/Dashboard/tempest2Dashboard.py52
-rw-r--r--testcases/Dashboard/vPing2Dashboard.py94
6 files changed, 582 insertions, 0 deletions
diff --git a/testcases/Dashboard/dashboard_utils.py b/testcases/Dashboard/dashboard_utils.py
new file mode 100644
index 000000000..90562855a
--- /dev/null
+++ b/testcases/Dashboard/dashboard_utils.py
@@ -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
index 000000000..c03ddbd14
--- /dev/null
+++ b/testcases/Dashboard/functest2Dashboard.py
@@ -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
index 000000000..12247663e
--- /dev/null
+++ b/testcases/Dashboard/odl2Dashboard.py
@@ -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
index 000000000..20e597468
--- /dev/null
+++ b/testcases/Dashboard/rally2Dashboard.py
@@ -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
index 000000000..8cbecbbc8
--- /dev/null
+++ b/testcases/Dashboard/tempest2Dashboard.py
@@ -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")
diff --git a/testcases/Dashboard/vPing2Dashboard.py b/testcases/Dashboard/vPing2Dashboard.py
new file mode 100644
index 000000000..f799e280f
--- /dev/null
+++ b/testcases/Dashboard/vPing2Dashboard.py
@@ -0,0 +1,94 @@
+#!/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 vPing 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_vPing_for_dashboard(criteria):
+
+ # Get 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
+
+ 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'],
+ 'y': data['details']['duration']})
+
+ test_data.append({'name': "vPing duration",
+ 'info': {'type': "graph",
+ 'xlabel': 'time',
+ 'ylabel': 'duration (s)'},
+ 'data_set': new_element})
+
+ # Graph 2: bar
+ # ************
+ nbTest = 0
+ nbTestOk = 0
+
+ for data in myDataResults:
+ nbTest += 1
+ if data['details']['status'] == "OK":
+ nbTestOk += 1
+
+ test_data.append({'name': "vPing status",
+ 'info': {"type": "bar"},
+ 'data_set': [{'Nb tests': nbTest,
+ 'Nb Success': nbTestOk}]})
+
+ # 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)