diff options
-rw-r--r-- | reporting/yardstick/img/icon-nok.png | bin | 0 -> 2317 bytes | |||
-rw-r--r-- | reporting/yardstick/img/icon-ok.png | bin | 0 -> 4063 bytes | |||
-rw-r--r-- | reporting/yardstick/img/weather-clear.png | bin | 0 -> 1560 bytes | |||
-rw-r--r-- | reporting/yardstick/img/weather-few-clouds.png | bin | 0 -> 1927 bytes | |||
-rw-r--r-- | reporting/yardstick/img/weather-overcast.png | bin | 0 -> 1588 bytes | |||
-rw-r--r-- | reporting/yardstick/img/weather-storm.png | bin | 0 -> 2137 bytes | |||
-rw-r--r-- | reporting/yardstick/index.html | 48 | ||||
-rw-r--r-- | reporting/yardstick/reporting-status.py | 74 | ||||
-rw-r--r-- | reporting/yardstick/reportingConf.py | 28 | ||||
-rw-r--r-- | reporting/yardstick/reportingUtils.py | 68 | ||||
-rw-r--r-- | reporting/yardstick/scenarioResult.py | 20 | ||||
-rw-r--r-- | reporting/yardstick/template/index-status-tmpl.html | 66 |
12 files changed, 304 insertions, 0 deletions
diff --git a/reporting/yardstick/img/icon-nok.png b/reporting/yardstick/img/icon-nok.png Binary files differnew file mode 100644 index 0000000..526b529 --- /dev/null +++ b/reporting/yardstick/img/icon-nok.png diff --git a/reporting/yardstick/img/icon-ok.png b/reporting/yardstick/img/icon-ok.png Binary files differnew file mode 100644 index 0000000..3a9de2e --- /dev/null +++ b/reporting/yardstick/img/icon-ok.png diff --git a/reporting/yardstick/img/weather-clear.png b/reporting/yardstick/img/weather-clear.png Binary files differnew file mode 100644 index 0000000..a0d9677 --- /dev/null +++ b/reporting/yardstick/img/weather-clear.png diff --git a/reporting/yardstick/img/weather-few-clouds.png b/reporting/yardstick/img/weather-few-clouds.png Binary files differnew file mode 100644 index 0000000..acfa783 --- /dev/null +++ b/reporting/yardstick/img/weather-few-clouds.png diff --git a/reporting/yardstick/img/weather-overcast.png b/reporting/yardstick/img/weather-overcast.png Binary files differnew file mode 100644 index 0000000..4296246 --- /dev/null +++ b/reporting/yardstick/img/weather-overcast.png diff --git a/reporting/yardstick/img/weather-storm.png b/reporting/yardstick/img/weather-storm.png Binary files differnew file mode 100644 index 0000000..956f0e2 --- /dev/null +++ b/reporting/yardstick/img/weather-storm.png diff --git a/reporting/yardstick/index.html b/reporting/yardstick/index.html new file mode 100644 index 0000000..ec64bc8 --- /dev/null +++ b/reporting/yardstick/index.html @@ -0,0 +1,48 @@ + <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">Yardstick reporting page</h3> + <nav> + <ul class="nav nav-justified"> + <li class="active"><a href="#">Home</a></li> + <li><a href="./index-status-apex.html">Status</a></li> + </ul> + </nav> + </div> +<div class="row"> + <div class="col-md-1"></div> + <div class="col-md-10"> + <div class="page-main"> + <h2>Yardstick</h2> + Yardstick is used in OPNFV for verifying the OPNFV infrastructure and some of the OPNFV features. + <br>The Yardstick framework is deployed in several OPNFV community labs. + <br>It is installer, infrastructure and application independent. + + <h2>Useful Links</h2> + <li><a href="https://wiki.opnfv.org/download/attachments/5734608/yardstick%20in%20depth.pdf?version=1&modificationDate=1463410431000&api=v2">Yardstick in Depth</a></li> + <li><a href="https://git.opnfv.org/cgit/yardstick">Yardstick Repo</a></li> + <li><a href="https://wiki.opnfv.org/display/yardstick">Yardstick Project</a></li> + <li><a href="https://build.opnfv.org/ci/view/yardstick/">Yardstick Jenkins page</a></li> + <li><a href="https://jira.opnfv.org/browse/YARDSTICK-119?jql=project%20%3D%20YARDSTICK">JIRA</a></li> + + </div> + </div> + <div class="col-md-1"></div> +</div>
\ No newline at end of file diff --git a/reporting/yardstick/reporting-status.py b/reporting/yardstick/reporting-status.py new file mode 100644 index 0000000..ed5dab0 --- /dev/null +++ b/reporting/yardstick/reporting-status.py @@ -0,0 +1,74 @@ +#!/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 requests +import sys +import time +import yaml + +import reportingUtils as utils +import reportingConf as conf +import scenarioResult as sr + +# Logger +logger = utils.getLogger("Yardstick-Status") + +logger.info("*******************************************") +logger.info("* Generating reporting scenario status *") +logger.info("* Data retention = %s days *" % conf.PERIOD) +logger.info("* *") +logger.info("*******************************************") + +# For all the versions +for version in conf.versions: + # For all the installers + for installer in conf.installers: + # get scenarios results data + scenario_results = utils.getScenarioStatus(installer, version) + 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)) + + s_status = 'KO' + scenario_criteria = len(s_result) + scenario_score = 0 + + for v in s_result: + if v['details'] == 'SUCCESS': + scenario_score += 1 + + if scenario_score == scenario_criteria: + s_status = 'OK' + logger.info(">>>>> scenario OK, save the information") + else: + logger.info(">>>> scenario not OK, score = %s/%s" % (scenario_score, scenario_criteria)) + + s_score = str(scenario_score) + '/' + str(scenario_criteria) + scenario_result_criteria[s] = sr.ScenarioResult(s_status, s_score) + + logger.info("--------------------------") + + templateLoader = jinja2.FileSystemLoader(conf.REPORTING_PATH) + templateEnv = jinja2.Environment(loader=templateLoader) + + TEMPLATE_FILE = "/template/index-status-tmpl.html" + template = templateEnv.get_template(TEMPLATE_FILE) + + outputText = template.render(scenario_results=scenario_result_criteria, + installer=installer, + period=conf.PERIOD, + version=version) + + with open(conf.REPORTING_PATH + "/release/" + version + + "/index-status-" + installer + ".html", "wb") as fh: + fh.write(outputText) diff --git a/reporting/yardstick/reportingConf.py b/reporting/yardstick/reportingConf.py new file mode 100644 index 0000000..af95cc0 --- /dev/null +++ b/reporting/yardstick/reportingConf.py @@ -0,0 +1,28 @@ +#!/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 +# +# Reporting: Declaration of the variables +# +# **************************************************** +installers = ["apex", "compass", "fuel", "joid"] + +versions = ["master"] + +# get data in the past 7 days +PERIOD = 7 + +# get the lastest 4 test results to determinate the success criteria +LASTEST_TESTS = 4 + +REPORTING_PATH = "." + +URL_BASE = 'http://testresults.opnfv.org/test/api/v1/results' + +# LOG_LEVEL = "ERROR" +LOG_LEVEL = "INFO" +LOG_FILE = REPORTING_PATH + "/reporting.log" diff --git a/reporting/yardstick/reportingUtils.py b/reporting/yardstick/reportingUtils.py new file mode 100644 index 0000000..06bcd49 --- /dev/null +++ b/reporting/yardstick/reportingUtils.py @@ -0,0 +1,68 @@ +#!/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 +# +from urllib2 import Request, urlopen, URLError +import logging +import json +import reportingConf as conf + + +def getLogger(module): + logFormatter = logging.Formatter("%(asctime)s [" + + module + + "] [%(levelname)-5.5s] %(message)s") + logger = logging.getLogger() + + fileHandler = logging.FileHandler("{0}/{1}".format('.', conf.LOG_FILE)) + fileHandler.setFormatter(logFormatter) + logger.addHandler(fileHandler) + + consoleHandler = logging.StreamHandler() + consoleHandler.setFormatter(logFormatter) + logger.addHandler(consoleHandler) + logger.setLevel(conf.LOG_LEVEL) + return logger + + +def getScenarioStatus(installer, version): + url = (conf.URL_BASE + "?case=" + "scenario_status" + + "&installer=" + installer + + "&version=" + version +"&period=" + str(conf.PERIOD)) + request = Request(url) + + try: + response = urlopen(request) + k = response.read() + response.close() + results = json.loads(k) + test_results = results['results'] + except URLError, e: + print 'Got an error code:', e + + scenario_results = {} + if test_results is not None: + for r in test_results: + if r['stop_date'] != 'None': + if not r['scenario'] in scenario_results.keys(): + scenario_results[r['scenario']] = [] + scenario_results[r['scenario']].append(r) + + for k,v in scenario_results.items(): + scenario_results[k] = v[:conf.LASTEST_TESTS] + + return scenario_results + + +def _test(): + status = getScenarioStatus("compass", "master") + print "status:++++++++++++++++++++++++" + print json.dumps(status,indent=4) + + +if __name__ == '__main__': # pragma: no cover + _test() diff --git a/reporting/yardstick/scenarioResult.py b/reporting/yardstick/scenarioResult.py new file mode 100644 index 0000000..743346a --- /dev/null +++ b/reporting/yardstick/scenarioResult.py @@ -0,0 +1,20 @@ +#!/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, score=0): + self.status = status + self.score = score + + def getStatus(self): + return self.status + + def getScore(self): + return self.score diff --git a/reporting/yardstick/template/index-status-tmpl.html b/reporting/yardstick/template/index-status-tmpl.html new file mode 100644 index 0000000..ff1a619 --- /dev/null +++ b/reporting/yardstick/template/index-status-tmpl.html @@ -0,0 +1,66 @@ + <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">Yardstick status page ({{version}})</h3> + <nav> + <ul class="nav nav-justified"> + <li class="active"><a href="index.html">Home</a></li> + <li><a href="index-status-apex.html">Apex</a></li> + <li><a href="index-status-compass.html">Compass</a></li> + <li><a href="index-status-fuel.html">Fuel</a></li> + <li><a href="index-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="60%">Scenario</th> + <th width="20%">Status</th> + <th width="20%">Score</th> + </tr> + {% for scenario,result in scenario_results.iteritems() -%} + <tr class="tr-ok"> + <td>{{scenario}}</td> + <td> + {%if scenario_results[scenario].getStatus() is sameas "OK" -%} + <img src="../../img/icon-ok.png"> + {%- else -%} + <img src="../../img/icon-nok.png"> + {%- endif %} + </td> + <td>{{scenario_results[scenario].getScore()}}</td> + </tr> + {%- endfor %} + </table> + </div> + + + </div> + <div class="col-md-1"></div> +</div> |