summaryrefslogtreecommitdiffstats
path: root/reporting
diff options
context:
space:
mode:
authorMorgan Richomme <morgan.richomme@orange.com>2017-02-27 09:08:59 +0000
committerGerrit Code Review <gerrit@opnfv.org>2017-02-27 09:08:59 +0000
commitd18aceb06ee4fb2e2bad5c565f4756feefe3f902 (patch)
treeead9a0d93e0a400beae96a5df324e06a5ed88010 /reporting
parent0596b593b7486e9e7509c34855f2c31fcd5ab9a2 (diff)
parent99137ab005df346e3398231f86d1b4bb19d461df (diff)
Merge "Add storperf reportign status page Create associated static storperf page Prepare vsperf, qtip, bottlenecks Put Yardstick scenario class into utils directory"
Diffstat (limited to 'reporting')
-rwxr-xr-xreporting/docker/reporting.sh10
-rw-r--r--reporting/html/danube.html11
-rw-r--r--reporting/img/storperf.jpgbin0 -> 29732 bytes
-rw-r--r--reporting/reporting.yaml9
-rw-r--r--reporting/storperf/reporting-status.py128
-rw-r--r--reporting/storperf/template/index-status-tmpl.html111
-rw-r--r--reporting/utils/reporting_utils.py10
-rw-r--r--reporting/utils/scenarioResult.py (renamed from reporting/yardstick/scenarioResult.py)0
-rw-r--r--reporting/yardstick/reporting-status.py2
9 files changed, 277 insertions, 4 deletions
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 @@
</div>
</a>
</article>
+ <article class="style4">
+ <span class="image">
+ <img src="img/storperf.jpg" alt="" />
+ </span>
+ <a href="master/storperf/status-apex.html">
+ <h2>Storperf</h2>
+ <div class="content">
+ <p>Storage testing</p>
+ </div>
+ </a>
+ </article>
</section>
</div>
</div>
diff --git a/reporting/img/storperf.jpg b/reporting/img/storperf.jpg
new file mode 100644
index 0000000..37492e6
--- /dev/null
+++ b/reporting/img/storperf.jpg
Binary files 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 @@
+ <html>
+ <head>
+ <meta charset="utf-8">
+ <!-- Bootstrap core CSS -->
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
+ <link href="../../css/default.css" rel="stylesheet">
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+ <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
+ <script type="text/javascript" src="http://d3js.org/d3.v2.min.js"></script>
+ <script type="text/javascript" src="../../js/gauge.js"></script>
+ <script type="text/javascript" src="../../js/trend.js"></script>
+ <script>
+ function onDocumentReady() {
+ // Gauge management
+ {% for scenario in scenario_results.keys() -%}
+ var gaugeScenario{{loop.index}} = gauge('#gaugeScenario{{loop.index}}');
+ {%- endfor %}
+ // assign success rate to the gauge
+ function updateReadings() {
+ {% for scenario in scenario_results.keys() -%}
+ gaugeScenario{{loop.index}}.update({{scenario_results[scenario].getScorePercent()}});
+ {%- endfor %}
+ }
+ updateReadings();
+ }
+
+ // trend line management
+ d3.csv("./scenario_history.csv", function(data) {
+ // ***************************************
+ // Create the trend line
+ {% for scenario in scenario_results.keys() -%}
+ // for scenario {{scenario}}
+ // Filter results
+ var trend{{loop.index}} = data.filter(function(row) {
+ return row["scenario"]=="{{scenario}}" && row["installer"]=="{{installer}}";
+ })
+ // Parse the date
+ trend{{loop.index}}.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg{{loop.index}}",trend{{loop.index}})
+ // ****************************************
+ {%- endfor %}
+ });
+ if ( !window.isLoaded ) {
+ window.addEventListener("load", function() {
+ onDocumentReady();
+ }, false);
+ } else {
+ onDocumentReady();
+ }
+ </script>
+ <script type="text/javascript">
+ $(document).ready(function (){
+ $(".btn-more").click(function() {
+ $(this).hide();
+ $(this).parent().find(".panel-default").show();
+ });
+ })
+ </script>
+ </head>
+ <body>
+ <div class="container">
+ <div class="masthead">
+ <h3 class="text-muted">Storperf status page ({{version}}, {{date}})</h3>
+ <nav>
+ <ul class="nav nav-justified">
+ <li class="active"><a href="http://testresults.opnfv.org/reporting/index.html">Home</a></li>
+ <li><a href="status-apex.html">Apex</a></li>
+ <li><a href="status-compass.html">Compass</a></li>
+ <li><a href="status-daisy.html">Daisy</a></li>
+ <li><a href="status-fuel.html">Fuel</a></li>
+ <li><a href="status-joid.html">Joid</a></li>
+ </ul>
+ </nav>
+ </div>
+<div class="row">
+ <div class="col-md-1"></div>
+ <div class="col-md-10">
+ <div class="page-header">
+ <h2>{{installer}}</h2>
+ </div>
+
+ <div class="scenario-overview">
+ <div class="panel-heading"><h4><b>List of last scenarios ({{version}}) run over the last {{period}} days </b></h4></div>
+ <table class="table">
+ <tr>
+ <th width="40%">Scenario</th>
+ <th width="20%">Status</th>
+ <th width="20%">Trend</th>
+ <th width="10%">Last 4 Iterations</th>
+ <th width="10%">Last 10 Days</th>
+ </tr>
+ {% for scenario,result in scenario_results.iteritems() -%}
+ <tr class="tr-ok">
+ <td>{{scenario}}</td>
+ <td><div id="gaugeScenario{{loop.index}}"></div></td>
+ <td><div id="trend_svg{{loop.index}}"></div></td>
+ <td>{{scenario_results[scenario].getFourDaysScore()}}</td>
+ <td>{{scenario_results[scenario].getTenDaysScore()}}</td>
+ </tr>
+ {%- endfor %}
+ </table>
+ </div>
+
+
+ </div>
+ <div class="col-md-1"></div>
+</div>
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/yardstick/scenarioResult.py b/reporting/utils/scenarioResult.py
index 1f7eb2b..1f7eb2b 100644
--- a/reporting/yardstick/scenarioResult.py
+++ b/reporting/utils/scenarioResult.py
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