From 99137ab005df346e3398231f86d1b4bb19d461df Mon Sep 17 00:00:00 2001 From: Morgan Richomme Date: Fri, 24 Feb 2017 08:59:11 +0100 Subject: Add storperf reportign status page Create associated static storperf page Prepare vsperf, qtip, bottlenecks Put Yardstick scenario class into utils directory Change-Id: I874d1733fe3f37dc5dd557559478e7e0b25371d7 Signed-off-by: Morgan Richomme --- reporting/docker/reporting.sh | 10 +- reporting/html/danube.html | 11 ++ reporting/img/storperf.jpg | Bin 0 -> 29732 bytes reporting/reporting.yaml | 9 +- reporting/storperf/reporting-status.py | 128 +++++++++++++++++++++ reporting/storperf/template/index-status-tmpl.html | 111 ++++++++++++++++++ reporting/utils/reporting_utils.py | 10 +- reporting/utils/scenarioResult.py | 29 +++++ reporting/yardstick/reporting-status.py | 2 +- reporting/yardstick/scenarioResult.py | 29 ----- 10 files changed, 306 insertions(+), 33 deletions(-) create mode 100644 reporting/img/storperf.jpg create mode 100644 reporting/storperf/reporting-status.py create mode 100644 reporting/storperf/template/index-status-tmpl.html create mode 100644 reporting/utils/scenarioResult.py delete mode 100644 reporting/yardstick/scenarioResult.py (limited to 'reporting') diff --git a/reporting/docker/reporting.sh b/reporting/docker/reporting.sh index 1bef1b8..78bcc4e 100755 --- a/reporting/docker/reporting.sh +++ b/reporting/docker/reporting.sh @@ -4,7 +4,7 @@ export PYTHONPATH="${PYTHONPATH}:." export CONFIG_REPORTING_YAML=./reporting.yaml declare -a versions=(colorado master) -declare -a projects=(functest yardstick) +declare -a projects=(functest storperf yardstick) project=$1 reporting_type=$2 @@ -30,6 +30,7 @@ cp -Rf js display # $1 | $2 # functest | status, vims, tempest # yardstick | +# storperf | if [ -z "$1" ]; then echo "********************************" @@ -52,6 +53,13 @@ if [ -z "$1" ]; then echo "********************************" python ./yardstick/reporting-status.py echo "Yardstick reporting status...OK" + + echo "********************************" + echo " Storperf reporting " + echo "********************************" + python ./storperf/reporting-status.py + echo "Storperf reporting status...OK" + else if [ -z "$2" ]; then reporting_type="status" diff --git a/reporting/html/danube.html b/reporting/html/danube.html index 58d6bc0..d21875b 100644 --- a/reporting/html/danube.html +++ b/reporting/html/danube.html @@ -76,6 +76,17 @@ + diff --git a/reporting/img/storperf.jpg b/reporting/img/storperf.jpg new file mode 100644 index 0000000..37492e6 Binary files /dev/null and b/reporting/img/storperf.jpg differ diff --git a/reporting/reporting.yaml b/reporting/reporting.yaml index 2fb6b78..9ec7b28 100644 --- a/reporting/reporting.yaml +++ b/reporting/reporting.yaml @@ -11,7 +11,7 @@ general: log: log_file: reporting.log - log_level: ERROR + log_level: INFO period: 10 @@ -55,6 +55,13 @@ yardstick: test_conf: https://git.opnfv.org/cgit/yardstick/plain/tests/ci/report_config.yaml log_level: ERROR +storperf: + test_list: + - snia_steady_state + log_level: ERROR + qtip: bottleneck: + +vsperf: diff --git a/reporting/storperf/reporting-status.py b/reporting/storperf/reporting-status.py new file mode 100644 index 0000000..674fdd8 --- /dev/null +++ b/reporting/storperf/reporting-status.py @@ -0,0 +1,128 @@ +#!/usr/bin/python +# +# 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 +# +import datetime +import jinja2 +import os + +# manage conf +import utils.reporting_utils as rp_utils + +import utils.scenarioResult as sr + +installers = rp_utils.get_config('general.installers') +versions = rp_utils.get_config('general.versions') +PERIOD = rp_utils.get_config('general.period') + +# Logger +logger = rp_utils.getLogger("Storperf-Status") +reportingDate = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") + +logger.info("*******************************************") +logger.info("* Generating reporting scenario status *") +logger.info("* Data retention = %s days *" % PERIOD) +logger.info("* *") +logger.info("*******************************************") + +# retrieve the list of storperf tests +storperf_tests = rp_utils.get_config('storperf.test_list') +logger.info("Storperf tests: %s" % storperf_tests) + +# For all the versions +for version in versions: + # For all the installers + for installer in installers: + # get scenarios results data + # for the moment we consider only 1 case snia_steady_state + scenario_results = rp_utils.getScenarios("snia_steady_state", + installer, + version) + # logger.info("scenario_results: %s" % scenario_results) + + scenario_stats = rp_utils.getScenarioStats(scenario_results) + logger.info("scenario_stats: %s" % scenario_stats) + items = {} + scenario_result_criteria = {} + + # From each scenarios get results list + for s, s_result in scenario_results.items(): + logger.info("---------------------------------") + logger.info("installer %s, version %s, scenario %s", installer, + version, s) + ten_criteria = len(s_result) + + ten_score = 0 + for v in s_result: + if "PASS" in v['criteria']: + ten_score += 1 + + logger.info("ten_score: %s / %s" % (ten_score, ten_criteria)) + + LASTEST_TESTS = rp_utils.get_config( + 'general.nb_iteration_tests_success_criteria') + four_result = s_result[:LASTEST_TESTS] + four_criteria = len(four_result) + four_score = 0 + for v in four_result: + if "PASS" in v['criteria']: + four_score += 1 + logger.info("four_score: %s / %s " % (four_score, four_criteria)) + + try: + s_status = (four_score * 100) / four_criteria + except: + s_status = 0 + logger.info("Score percent = %s" % str(s_status)) + s_four_score = str(four_score) + '/' + str(four_criteria) + s_ten_score = str(ten_score) + '/' + str(ten_criteria) + s_score_percent = str(s_status) + + if '100' == s_status: + logger.info(">>>>> scenario OK, save the information") + else: + logger.info(">>>> scenario not OK, last 4 iterations = %s, \ + last 10 days = %s" % (s_four_score, s_ten_score)) + + # Save daily results in a file + path_validation_file = ("./display/" + version + + "/storperf/scenario_history.txt") + + if not os.path.exists(path_validation_file): + with open(path_validation_file, 'w') as f: + info = 'date,scenario,installer,details,score\n' + f.write(info) + + with open(path_validation_file, "a") as f: + info = (reportingDate + "," + s + "," + installer + + "," + s_ten_score + "," + + str(s_score_percent) + "\n") + f.write(info) + + scenario_result_criteria[s] = sr.ScenarioResult(s_status, + s_four_score, + s_ten_score, + s_score_percent) + + logger.info("--------------------------") + + templateLoader = jinja2.FileSystemLoader(".") + templateEnv = jinja2.Environment(loader=templateLoader, + autoescape=True) + + TEMPLATE_FILE = "./storperf/template/index-status-tmpl.html" + template = templateEnv.get_template(TEMPLATE_FILE) + + outputText = template.render(scenario_results=scenario_result_criteria, + installer=installer, + period=PERIOD, + version=version, + date=reportingDate) + + with open("./display/" + version + + "/storperf/status-" + installer + ".html", "wb") as fh: + fh.write(outputText) diff --git a/reporting/storperf/template/index-status-tmpl.html b/reporting/storperf/template/index-status-tmpl.html new file mode 100644 index 0000000..e3a18b1 --- /dev/null +++ b/reporting/storperf/template/index-status-tmpl.html @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + +
+
+

Storperf status page ({{version}}, {{date}})

+ +
+
+
+
+ + +
+

List of last scenarios ({{version}}) run over the last {{period}} days

+ + + + + + + + + {% for scenario,result in scenario_results.iteritems() -%} + + + + + + + + {%- endfor %} +
ScenarioStatusTrendLast 4 IterationsLast 10 Days
{{scenario}}
{{scenario_results[scenario].getFourDaysScore()}}{{scenario_results[scenario].getTenDaysScore()}}
+
+ + +
+
+
diff --git a/reporting/utils/reporting_utils.py b/reporting/utils/reporting_utils.py index 1879fb6..47d67f3 100644 --- a/reporting/utils/reporting_utils.py +++ b/reporting/utils/reporting_utils.py @@ -101,7 +101,15 @@ 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') diff --git a/reporting/utils/scenarioResult.py b/reporting/utils/scenarioResult.py new file mode 100644 index 0000000..1f7eb2b --- /dev/null +++ b/reporting/utils/scenarioResult.py @@ -0,0 +1,29 @@ +#!/usr/bin/python +# +# 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 +# + + +class ScenarioResult(object): + def __init__(self, status, four_days_score='', ten_days_score='', + score_percent=0.0): + self.status = status + self.four_days_score = four_days_score + self.ten_days_score = ten_days_score + self.score_percent = score_percent + + def getStatus(self): + return self.status + + def getTenDaysScore(self): + return self.ten_days_score + + def getFourDaysScore(self): + return self.four_days_score + + def getScorePercent(self): + return self.score_percent diff --git a/reporting/yardstick/reporting-status.py b/reporting/yardstick/reporting-status.py index a0f0b01..12f42ca 100644 --- a/reporting/yardstick/reporting-status.py +++ b/reporting/yardstick/reporting-status.py @@ -10,7 +10,7 @@ import datetime import jinja2 import os -import scenarioResult as sr +import utils.scenarioResult as sr from scenarios import config as cf # manage conf diff --git a/reporting/yardstick/scenarioResult.py b/reporting/yardstick/scenarioResult.py deleted file mode 100644 index 1f7eb2b..0000000 --- a/reporting/yardstick/scenarioResult.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/python -# -# 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 -# - - -class ScenarioResult(object): - def __init__(self, status, four_days_score='', ten_days_score='', - score_percent=0.0): - self.status = status - self.four_days_score = four_days_score - self.ten_days_score = ten_days_score - self.score_percent = score_percent - - def getStatus(self): - return self.status - - def getTenDaysScore(self): - return self.ten_days_score - - def getFourDaysScore(self): - return self.four_days_score - - def getScorePercent(self): - return self.score_percent -- cgit 1.2.3-korg