Add storperf reportign status page 43/29343/1
authorMorgan Richomme <morgan.richomme@orange.com>
Fri, 24 Feb 2017 07:59:11 +0000 (08:59 +0100)
committerMorgan Richomme <morgan.richomme@orange.com>
Fri, 24 Feb 2017 08:46:21 +0000 (09:46 +0100)
Create associated static storperf page
Prepare vsperf, qtip, bottlenecks
Put Yardstick scenario class into utils directory

Change-Id: I874d1733fe3f37dc5dd557559478e7e0b25371d7
Signed-off-by: Morgan Richomme <morgan.richomme@orange.com>
utils/test/reporting/docker/reporting.sh
utils/test/reporting/html/danube.html
utils/test/reporting/img/storperf.jpg [new file with mode: 0644]
utils/test/reporting/reporting.yaml
utils/test/reporting/storperf/reporting-status.py [new file with mode: 0644]
utils/test/reporting/storperf/template/index-status-tmpl.html [new file with mode: 0644]
utils/test/reporting/utils/reporting_utils.py
utils/test/reporting/utils/scenarioResult.py [moved from utils/test/reporting/yardstick/scenarioResult.py with 100% similarity]
utils/test/reporting/yardstick/reporting-status.py

index 1bef1b8..78bcc4e 100755 (executable)
@@ -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"
index 58d6bc0..d21875b 100644 (file)
                                                                                </div>\r
                                                                        </a>\r
                                                                </article>\r
+                                                               <article class="style4">\r
+                                                                       <span class="image">\r
+                                                                               <img src="img/storperf.jpg" alt="" />\r
+                                                                       </span>\r
+                                                                       <a href="master/storperf/status-apex.html">\r
+                                                                               <h2>Storperf</h2>\r
+                                                                               <div class="content">\r
+                                                                                       <p>Storage testing</p>\r
+                                                                               </div>\r
+                                                                       </a>\r
+                                                               </article>\r
                                                        </section>\r
                                                </div>\r
                                        </div>\r
diff --git a/utils/test/reporting/img/storperf.jpg b/utils/test/reporting/img/storperf.jpg
new file mode 100644 (file)
index 0000000..37492e6
Binary files /dev/null and b/utils/test/reporting/img/storperf.jpg differ
index 2fb6b78..9ec7b28 100644 (file)
@@ -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 (file)
index 0000000..674fdd8
--- /dev/null
@@ -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 (file)
index 0000000..e3a18b1
--- /dev/null
@@ -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>
index 1879fb6..47d67f3 100644 (file)
@@ -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')
 
index a0f0b01..12f42ca 100644 (file)
@@ -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