Reporting dashboard for functest 37/10937/3
authorboucherv <valentin.boucher@orange.com>
Wed, 2 Mar 2016 15:04:10 +0000 (16:04 +0100)
committerboucherv <valentin.boucher@orange.com>
Thu, 3 Mar 2016 08:54:49 +0000 (09:54 +0100)
Change-Id: I6a5fa0c8918c0d4a98754c38f3c33238a0132a39
Signed-off-by: boucherv <valentin.boucher@orange.com>
utils/test/result_collection_api/tools/reporting/default.css [new file with mode: 0644]
utils/test/result_collection_api/tools/reporting/index-tmpl.html [new file with mode: 0644]
utils/test/result_collection_api/tools/reporting/reporting.py [new file with mode: 0644]

diff --git a/utils/test/result_collection_api/tools/reporting/default.css b/utils/test/result_collection_api/tools/reporting/default.css
new file mode 100644 (file)
index 0000000..0e330e9
--- /dev/null
@@ -0,0 +1,56 @@
+.panel-header-item {
+    position: relative;
+    display: inline-block;
+    padding-left: 17px;
+    padding-right: 17px;
+}
+
+.panel-pod-name {
+    margin-top: 10px;
+    margin-right: 27px;
+    float:right;
+    padding: 6px;
+}
+
+.panel-default > .panel-heading .badge {
+    background-color: #007e88;
+    position: relative;
+    display: inline-block;
+}
+
+.panel-default > .panel-heading .progress-bar {
+    height: 100%;
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    background-color: #0095a2
+}
+.panel-default > .panel-heading h4 {
+    color: white;
+}
+
+.panel-default > .panel-heading {
+    background-color: #00ADBB;
+    overflow: hidden;
+    position: relative;
+    width: 100%;
+}
+
+th{
+    text-align: center;
+}
+
+td{
+    text-align: center;
+}
+
+.tr-danger {
+    background-color: #177870;
+    color: white;
+}
+
+.btn-more {
+    color: white;
+    background-color: #0095a2;
+}
\ No newline at end of file
diff --git a/utils/test/result_collection_api/tools/reporting/index-tmpl.html b/utils/test/result_collection_api/tools/reporting/index-tmpl.html
new file mode 100644 (file)
index 0000000..4d1c509
--- /dev/null
@@ -0,0 +1,91 @@
+ <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="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">
+    $(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">vIMS status page</h3>
+        <nav>
+          <ul class="nav nav-justified">
+            <li class="active"><a href="#">Home</a></li>
+            <li><a href="index-fuel.html">Fuel</a></li>
+            <li><a href="index-compass.html">Compass</a></li>
+            <li><a href="index-joid.html">JOID</a></li>
+            <li><a href="index-apex.html">APEX</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>
+        {% for scenario_name, results in scenario_results.iteritems() -%}
+        <div class="scenario-part">
+            <div class="page-header">
+                <h3><span class="glyphicon glyphicon-chevron-right"> <b>{{scenario_name}}</b></h3>
+            </div>
+            {% for result in results -%}
+                {% if loop.index > 2 -%}
+                    <div class="panel panel-default" hidden>
+                {%- else -%}
+                    <div class="panel panel-default">
+                {%- endif %}
+                        <div class="panel-heading">
+                            <div class="progress-bar" role="progressbar" aria-valuenow="{{result.pr_step_ok}}" aria-valuemin="0" aria-valuemax="100" style="width: {{result.pr_step_ok}}%"></div>
+                            <span class="panel-header-item">
+                                <h4><b>{{result.creation_date}}</b></h4>
+                            </span>
+                            <span class="badge panel-pod-name">{{result.pod_name}}</span>
+                        </div>
+                        <table class="table">
+                            <tr>
+                                <th width="20%">Step</th>
+                                <th width="10%">Status</th>
+                                <th width="10%">Duration</th>
+                                <th width="60%">Result</th>
+                            </tr>
+                            {% for step_od_name in step_order -%}
+                                {% if step_od_name in result.details.keys() -%}
+                                    {% set step_result = result.details[step_od_name] -%}
+                                    {% if step_result.duration != 0 -%}
+                                        <tr class="tr-ok">
+                                            <td>{{step_od_name}}</td>
+                                            <td><span class="glyphicon glyphicon-ok"></td>
+                                            <td><b>{{step_result.duration_display}}</b></td>
+                                            <td>{{step_result.result}}</td>
+                                        </tr>
+                                    {%- else -%}
+                                        <tr class="tr-danger">
+                                            <td>{{step_od_name}}</td>
+                                            <td><span class="glyphicon glyphicon-remove"></td>
+                                            <td><b>0s</b></td>
+                                            <td>{{step_result.result}}</td>
+                                        </tr>
+                                    {%- endif %}
+                                {%- endif %}
+                            {%- endfor %}
+                        </table>
+                    </div>
+            {%- endfor %}
+            <button type="button" class="btn btn-more">More than two</button>
+        </div>
+        {%- endfor %}
+    </div>
+    <div class="col-md-1"></div>
+</div>
\ No newline at end of file
diff --git a/utils/test/result_collection_api/tools/reporting/reporting.py b/utils/test/result_collection_api/tools/reporting/reporting.py
new file mode 100644 (file)
index 0000000..246c625
--- /dev/null
@@ -0,0 +1,83 @@
+from urllib2 import Request, urlopen, URLError
+import json
+import jinja2
+import os
+
+def sig_test_format(sig_test):
+    nbPassed = 0
+    nbFailures = 0
+    nbSkipped = 0
+    for data_test in sig_test:
+        if data_test['result'] == "Passed":
+            nbPassed+= 1
+        elif data_test['result'] == "Failed":
+            nbFailures += 1
+        elif data_test['result'] == "Skipped":
+            nbSkipped += 1
+    total_sig_test_result = {}
+    total_sig_test_result['passed'] = nbPassed
+    total_sig_test_result['failures'] = nbFailures
+    total_sig_test_result['skipped'] = nbSkipped
+    return total_sig_test_result
+
+installers = ["fuel", "compass", "joid", "apex"]
+step_order = ["initialisation", "orchestrator", "vIMS", "sig_test"]
+
+for installer in installers:
+    request = Request('http://testresults.opnfv.org/testapi/results?case=vIMS&installer=' + installer)
+
+    try:
+        response = urlopen(request)
+        k = response.read()
+        results = json.loads(k)
+    except URLError, e:
+        print 'No kittez. Got an error code:', e
+
+    test_results = results['test_results']
+    test_results.reverse()
+
+    scenario_results = {}
+    for r in test_results:
+        if not r['version'] in scenario_results.keys():
+            scenario_results[r['version']] = []
+        scenario_results[r['version']].append(r)
+
+    for s, s_result in scenario_results.items():
+        scenario_results[s] = s_result[0:5]
+        for result in scenario_results[s]:
+            result["creation_date"] = result["creation_date"].split(".")[0]
+            sig_test = result['details']['sig_test']['result']
+            if not sig_test == "":
+                format_result = sig_test_format(sig_test)
+                if format_result['failures'] > format_result['passed']:
+                    result['details']['sig_test']['duration'] = 0
+                result['details']['sig_test']['result'] = format_result
+            nb_step_ok = 0
+            nb_step = len(result['details'])
+
+            for step_name, step_result in result['details'].items():
+                if step_result['duration'] != 0:
+                    nb_step_ok += 1
+                m, s = divmod(step_result['duration'], 60)
+                m_display = ""
+                if int(m) != 0:
+                    m_display += str(int(m)) + "m "
+                step_result['duration_display'] = m_display + str(int(s)) + "s"
+
+            result['pr_step_ok'] = 0
+            if nb_step != 0:
+                result['pr_step_ok'] = (float(nb_step_ok)/nb_step)*100
+
+
+    templateLoader = jinja2.FileSystemLoader(os.path.dirname(os.path.abspath(__file__)))
+    templateEnv = jinja2.Environment( loader=templateLoader )
+
+    TEMPLATE_FILE = "index-tmpl.html"
+    template = templateEnv.get_template( TEMPLATE_FILE )
+
+    outputText = template.render( scenario_results = scenario_results, step_order = step_order, installer = installer)
+
+    with open("index-" + installer + ".html", "wb") as fh:
+        fh.write(outputText)
+
+