From 498efbd7ddce3cdb90f6818f7a88dcfd9b50ba84 Mon Sep 17 00:00:00 2001 From: Morgan Richomme Date: Fri, 24 Feb 2017 08:59:11 +0100 Subject: [PATCH] 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 --- utils/test/reporting/docker/reporting.sh | 10 +- utils/test/reporting/html/danube.html | 11 ++ utils/test/reporting/img/storperf.jpg | Bin 0 -> 29732 bytes utils/test/reporting/reporting.yaml | 9 +- utils/test/reporting/storperf/reporting-status.py | 128 +++++++++++++++++++++ .../storperf/template/index-status-tmpl.html | 111 ++++++++++++++++++ utils/test/reporting/utils/reporting_utils.py | 10 +- .../{yardstick => utils}/scenarioResult.py | 0 utils/test/reporting/yardstick/reporting-status.py | 2 +- 9 files changed, 277 insertions(+), 4 deletions(-) create mode 100644 utils/test/reporting/img/storperf.jpg create mode 100644 utils/test/reporting/storperf/reporting-status.py create mode 100644 utils/test/reporting/storperf/template/index-status-tmpl.html rename utils/test/reporting/{yardstick => utils}/scenarioResult.py (100%) diff --git a/utils/test/reporting/docker/reporting.sh b/utils/test/reporting/docker/reporting.sh index 1bef1b811..78bcc4e82 100755 --- a/utils/test/reporting/docker/reporting.sh +++ b/utils/test/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/utils/test/reporting/html/danube.html b/utils/test/reporting/html/danube.html index 58d6bc0fe..d21875b53 100644 --- a/utils/test/reporting/html/danube.html +++ b/utils/test/reporting/html/danube.html @@ -76,6 +76,17 @@ + diff --git a/utils/test/reporting/img/storperf.jpg b/utils/test/reporting/img/storperf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37492e69e39bb8190813b34d4afc6d5b16a8b135 GIT binary patch literal 29732 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 ZmITjj`cVqcCn`O;BQT@{ZX_R;{tt(HsZsy{ literal 0 HcmV?d00001 diff --git a/utils/test/reporting/reporting.yaml b/utils/test/reporting/reporting.yaml index 2fb6b7831..9ec7b286c 100644 --- a/utils/test/reporting/reporting.yaml +++ b/utils/test/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/utils/test/reporting/storperf/reporting-status.py b/utils/test/reporting/storperf/reporting-status.py new file mode 100644 index 000000000..674fdd880 --- /dev/null +++ b/utils/test/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/utils/test/reporting/storperf/template/index-status-tmpl.html b/utils/test/reporting/storperf/template/index-status-tmpl.html new file mode 100644 index 000000000..e3a18b1ce --- /dev/null +++ b/utils/test/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/utils/test/reporting/utils/reporting_utils.py b/utils/test/reporting/utils/reporting_utils.py index 1879fb628..47d67f362 100644 --- a/utils/test/reporting/utils/reporting_utils.py +++ b/utils/test/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/utils/test/reporting/yardstick/scenarioResult.py b/utils/test/reporting/utils/scenarioResult.py similarity index 100% rename from utils/test/reporting/yardstick/scenarioResult.py rename to utils/test/reporting/utils/scenarioResult.py diff --git a/utils/test/reporting/yardstick/reporting-status.py b/utils/test/reporting/yardstick/reporting-status.py index a0f0b0184..12f42ca31 100644 --- a/utils/test/reporting/yardstick/reporting-status.py +++ b/utils/test/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 -- 2.16.6