From c64c919f765833798a12e033e74228d41e7a4b54 Mon Sep 17 00:00:00 2001 From: QiLiang Date: Tue, 27 Oct 2015 15:43:37 +0000 Subject: Yardstick test results reformat for Dashboard JIRA: YARDSTICK-132 Change-Id: Ibfb78e1341fdfe3a877765dd17445f5677a37b0f Signed-off-by: QiLiang --- .../dashboard/yardstick2Dashboard.py | 210 +++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 utils/test/result_collection_api/dashboard/yardstick2Dashboard.py diff --git a/utils/test/result_collection_api/dashboard/yardstick2Dashboard.py b/utils/test/result_collection_api/dashboard/yardstick2Dashboard.py new file mode 100644 index 000000000..c4342426c --- /dev/null +++ b/utils/test/result_collection_api/dashboard/yardstick2Dashboard.py @@ -0,0 +1,210 @@ +#!/usr/bin/python +# +############################################################################## +# Copyright (c) 2015 Huawei Technologies Co.,Ltd and other. +# +# All rights reserved. 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 dashboard ready json results +# It may be used for all the test case of the Yardstick project +# a new method format__for_dashboard(results) +# v0.1: basic example with methods for Ping, Iperf, Netperf, Pktgen, +# Fio, Lmbench, Perf, Cyclictest. +# + + +def get_yardstick_cases(): + """ + get the list of the supported test cases + TODO: update the list when adding a new test case for the dashboard + """ + return ["Ping", "Iperf", "Netperf", "Pktgen", "Fio", "Lmbench", + "Perf", "Cyclictest"] + + +def format_yardstick_for_dashboard(case, results): + """ + generic method calling the method corresponding to the test case + check that the testcase is properly declared first + then build the call to the specific method + """ + if check_yardstick_case_exist(case): + cmd = "format_" + case + "_for_dashboard(results)" + res = eval(cmd) + else: + res = [] + print "Test cases not declared" + return res + + +def check_yardstick_case_exist(case): + """ + check if the testcase exists + if the test case is not defined or not declared in the list + return False + """ + yardstick_cases = get_yardstick_cases() + + if (case is None or case not in yardstick_cases): + return False + else: + return True + + +def _get_test_status_bar(results): + nbTest = 0 + nbTestOk = 0 + + for data in results: + nbTest += 1 + records = [record for record in data['details'] + if "benchmark" in record + and record["benchmark"]["errors"] != ""] + if len(records) == 0: + nbTestOk += 1 + return nbTest, nbTestOk + + +def format_ping_for_dashboard(results): + """ + Post processing for the Ping test case + """ + test_data = [{'description': 'Ping results for Dashboard'}] + + # Graph 1: Test_Duration = f(time) + # ******************************** + new_element = [] + for data in results: + records = [record["benchmark"]["data"]["rtt"] + for record in data['details'] + if "benchmark" in record] + + avg_rtt = sum(records) / len(records) + new_element.append({'x': data['creation_date'], + 'y': avg_rtt}) + + test_data.append({'name': "ping duration", + 'info': {'type': "graph", + 'xlabel': 'time', + 'ylabel': 'duration (s)'}, + 'data_set': new_element}) + + # Graph 2: bar + # ************ + nbTest, nbTestOk = _get_test_status_bar(results) + + test_data.append({'name': "ping status", + 'info': {"type": "bar"}, + 'data_set': [{'Nb tests': nbTest, + 'Nb Success': nbTestOk}]}) + + return test_data + + +def format_iperf_for_dashboard(results): + """ + Post processing for the Iperf test case + """ + test_data = [{'description': 'Iperf results for Dashboard'}] + return test_data + + +def format_netperf_for_dashboard(results): + """ + Post processing for the Netperf test case + """ + test_data = [{'description': 'Netperf results for Dashboard'}] + return test_data + + +def format_pktgen_for_dashboard(results): + """ + Post processing for the Pktgen test case + """ + test_data = [{'description': 'Pktgen results for Dashboard'}] + return test_data + + +def format_fio_for_dashboard(results): + """ + Post processing for the Fio test case + """ + test_data = [{'description': 'Fio results for Dashboard'}] + return test_data + + +def format_lmbench_for_dashboard(results): + """ + Post processing for the Lmbench test case + """ + test_data = [{'description': 'Lmbench results for Dashboard'}] + return test_data + + +def format_perf_for_dashboard(results): + """ + Post processing for the Perf test case + """ + test_data = [{'description': 'Perf results for Dashboard'}] + return test_data + + +def format_cyclictest_for_dashboard(results): + """ + Post processing for the Cyclictest test case + """ + test_data = [{'description': 'Cyclictest results for Dashboard'}] + return test_data + + +############################ For local test ################################ +import json +import os +import requests + +def _read_sample_output(filename): + curr_path = os.path.dirname(os.path.abspath(__file__)) + output = os.path.join(curr_path, filename) + with open(output) as f: + sample_output = f.read() + + result = json.loads(sample_output) + return result + +# Copy form functest/testcases/Dashboard/dashboard_utils.py +# and did some minor modification for local test. +def _get_results(db_url, test_criteria): + + test_project = test_criteria["project"] + testcase = test_criteria["testcase"] + + # Build headers + headers = {'Content-Type': 'application/json'} + + # build the request + # if criteria is all => remove criteria + url = db_url + "/results?project=" + test_project + "&case=" + testcase + + # Send Request to Test DB + myData = requests.get(url, headers=headers) + + # Get result as a json object + myNewData = json.loads(myData.text) + + # Get results + myDataResults = myNewData['test_results'] + + return myDataResults + +def _test(): + db_url = "http://213.77.62.197" + result = _get_results(db_url, + {"project": "yardstick", "testcase": "Ping"}) + print format_ping_for_dashboard(result) + +if __name__ == '__main__': + _test() -- cgit 1.2.3-korg