aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRadek Zetik <radekx.zetik@intel.com>2015-11-12 20:07:40 +0000
committerMaryam Tahhan <maryam.tahhan@intel.com>2015-12-08 10:30:03 +0000
commitde65a5105f62c56371249d9128e7b9a28759b40f (patch)
treeba7bb8f1f9c5b24a779b90bd1aa6e647165f3192
parent1c4d17533029cac0b3ec4770ab1d9c3817b646e7 (diff)
Results: Integrate with opnfv_test_dashboard
All the test projects generate results in different format. The goal of a testing dashboard is to provide a consistent view of the different tests from the different projects. We need to enable the data collection for VSPERF, in other words VSPERF pushes data using a REST API. The feature is enabled by --opnfvpod parameter on vsperf command line. The value of the parameter sets POD name. Example: --opnfvpod <pod_name> or --opnfvpod=<pod_name> You need to specify installer name. It can be set in conf-file default value: OPNFV_INSTALLER = "Fuel" JIRA: VSPERF-112 Change-Id: I37255414eebcc2ff0c12109c508dcd984663a830 Signed-off-by: Radek Zetik <radekx.zetik@intel.com> Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com> Reviewed-by: Brian Castelli <brian.castelli@spirent.com>
-rw-r--r--conf/10_custom.conf2
-rwxr-xr-xdocs/updates/NEWS.rst6
-rw-r--r--tools/opnfvdashboard/__init__.py18
-rw-r--r--tools/opnfvdashboard/opnfvdashboard.py106
-rwxr-xr-xvsperf16
5 files changed, 148 insertions, 0 deletions
diff --git a/conf/10_custom.conf b/conf/10_custom.conf
index 8883cb7c..28a3156d 100644
--- a/conf/10_custom.conf
+++ b/conf/10_custom.conf
@@ -61,3 +61,5 @@ TRAFFICGEN_IXNET_TESTER_RESULT_DIR = ''
TRAFFICGEN_IXNET_DUT_RESULT_DIR = ''
TEST_PARAMS = {'packet_sizes':'64'}
+
+OPNFV_INSTALLER = "Fuel"
diff --git a/docs/updates/NEWS.rst b/docs/updates/NEWS.rst
index 0fe9e22b..5618455c 100755
--- a/docs/updates/NEWS.rst
+++ b/docs/updates/NEWS.rst
@@ -1,3 +1,9 @@
+November 2015
+==============
+New
+---
+- Support of opnfv_test_dashboard
+
October 2015
==============
New
diff --git a/tools/opnfvdashboard/__init__.py b/tools/opnfvdashboard/__init__.py
new file mode 100644
index 00000000..6cb0e6b3
--- /dev/null
+++ b/tools/opnfvdashboard/__init__.py
@@ -0,0 +1,18 @@
+# Copyright 2015 Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""results to opnfvdashboardpackage.
+
+Contains generator json format of results for opnfv dashboard
+"""
diff --git a/tools/opnfvdashboard/opnfvdashboard.py b/tools/opnfvdashboard/opnfvdashboard.py
new file mode 100644
index 00000000..8aecfef2
--- /dev/null
+++ b/tools/opnfvdashboard/opnfvdashboard.py
@@ -0,0 +1,106 @@
+"""
+vsperf2dashboard
+"""
+# Copyright 2015 Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import os
+import csv
+import requests
+import json
+import logging
+
+def results2opnfv_dashboard(results_path, int_data):
+ """
+ the method open the csv file with results and calls json encoder
+ """
+ testcases = os.listdir(results_path)
+ for test in testcases:
+ if not ".csv" in test:
+ continue
+ resfile = results_path + '/' + test
+ with open(resfile, 'r') as in_file:
+ reader = csv.DictReader(in_file)
+ _push_results(reader, int_data)
+
+def _push_results(reader, int_data):
+ """
+ the method encodes results and sends them into opnfv dashboard
+ """
+ db_url = "http://213.77.62.197"
+ url = db_url + "/results"
+ casename = ""
+ allowed_pkt = ["64", "128", "512", "1024", "1518"]
+ details = {"64": '', "128": '', "512": '', "1024": '', "1518": ''}
+
+ for row_reader in reader:
+ if allowed_pkt.count(row_reader['packet_size']) == 0:
+ logging.error("The framesize is not supported in opnfv dashboard")
+ continue
+
+ casename = _generate_test_name(row_reader['id'], int_data)
+ if "back2back" in row_reader['id']:
+ details[row_reader['packet_size']] = row_reader['b2b_frames']
+ else:
+ details[row_reader['packet_size']] = row_reader['throughput_rx_fps']
+
+ # Build body
+ body = {"project_name": "vsperf",
+ "case_name": casename,
+ "pod_name": int_data['pod'],
+ "installer": int_data['installer'],
+ "version": "OVS 2.4",
+ "details": details}
+
+ myData = requests.post(url, json=body)
+ logging.info("Results for %s sent to opnfv, http response: %s", casename, myData)
+ logging.debug("the body sent to opnfv")
+ logging.debug(body)
+
+def _generate_test_name(testcase, int_data):
+ """
+ the method generates testcase name for releng
+ """
+ cuse = int_data['cuse']
+ vanilla = int_data['vanilla']
+ res_name = ""
+
+ names = {'phy2phy_tput': ["tput_ovsdpdk", "tput_ovsdpdk", "tput_ovs"],
+ 'back2back': ["b2b_ovsdpdk", "b2b_ovsdpdk", "b2b_ovs"],
+ 'phy2phy_tput_mod_vlan': ["tput_mod_vlan_ovsdpdk", "tput_mod_vlan_ovsdpdk", "tput_mod_vlan_ovs"],
+ 'phy2phy_cont': ["cont_ovsdpdk", "cont_ovsdpdk", "cont_ovs"],
+ 'pvp_cont': ["pvp_cont_ovsdpdkuser", "pvp_cont_ovsdpdkcuse", "pvp_cont_ovsvirtio"],
+ 'pvvp_cont': ["pvvp_cont_ovsdpdkuser", "pvvp_cont_ovsdpdkcuse", "pvvp_cont_ovsvirtio"],
+ 'phy2phy_scalability': ["scalability_ovsdpdk", "scalability_ovsdpdk", "scalability_ovs"],
+ 'pvp_tput': ["pvp_tput_ovsdpdkuser", "pvp_tput_ovsdpdkcuse", "pvp_tput_ovsvirtio"],
+ 'pvp_back2back': ["pvp_b2b_ovsdpdkuser", "pvp_b2b_ovsdpdkcuse", "pvp_b2b_ovsvirtio"],
+ 'pvvp_tput': ["pvvp_tput_ovsdpdkuser", "pvvp_tput_ovsdpdkcuse", "pvvp_tput_ovsvirtio"],
+ 'pvvp_back2back': ["pvvp_b2b_ovsdpdkuser", "pvvp_b2b_ovsdpdkcuse", "pvvp_b2b_ovsvirtio"],
+ 'phy2phy_cpu_load': ["cpu_load_ovsdpdk", "cpu_load_ovsdpdk", "cpu_load_ovs"],
+ 'phy2phy_mem_load': ["mem_load_ovsdpdk", "mem_load_ovsdpdk", "mem_load_ovs"]}
+
+ for name, name_list in names.items():
+ if name != testcase:
+ continue
+ if vanilla == True:
+ res_name = name_list[2]
+ else:
+ if cuse == True:
+ res_name = name_list[1]
+ else:
+ res_name = name_list[0]
+ break
+
+ return res_name
diff --git a/vsperf b/vsperf
index e220e246..f6ddc637 100755
--- a/vsperf
+++ b/vsperf
@@ -34,6 +34,7 @@ from core.loader import Loader
from testcases import TestCase
from tools import tasks
from tools.pkt_gen import trafficgen
+from tools.opnfvdashboard import opnfvdashboard
VERBOSITY_LEVELS = {
'debug': logging.DEBUG,
@@ -153,6 +154,7 @@ def parse_arguments():
help='csv list of test parameters: key=val; e.g.'
'including pkt_sizes=x,y; duration=x; '
'rfc2544_trials=x ...')
+ group.add_argument('--opnfvpod', help='name of POD in opnfv')
args = vars(parser.parse_args())
@@ -428,6 +430,20 @@ def main():
output=settings.getValue('XUNIT_DIR'), outsuffix="",
verbosity=0).run(suite)
+ if args['opnfvpod']:
+ pod_name = args['opnfvpod']
+ installer_name = settings.getValue('OPNFV_INSTALLER')
+
+ int_data = {'cuse': False,
+ 'vanilla': False,
+ 'pod': pod_name,
+ 'installer': installer_name}
+ if settings.getValue('VSWITCH').endswith('Vanilla'):
+ int_data['vanilla'] = True
+ if settings.getValue('VNF').endswith('Cuse'):
+ int_data['cuse'] = True
+ opnfvdashboard.results2opnfv_dashboard(results_path, int_data)
+
#remove directory if no result files were created.
if os.path.exists(results_path):
files_list = os.listdir(results_path)