From f53fc8221faf7718d1cf060038ad3a23463b8398 Mon Sep 17 00:00:00 2001 From: rexlee8776 Date: Sat, 27 Aug 2016 06:26:46 +0000 Subject: [PATCH] Add the function of yardstick testcase reporter JIRA: YARDSTICK-324 Change-Id: I58969265f88d5c20f46f0b1097f5b0ccb1d9a40d Signed-off-by: rexlee8776 --- utils/test/reporting/yardstick/img/icon-nok.png | Bin 0 -> 2317 bytes utils/test/reporting/yardstick/img/icon-ok.png | Bin 0 -> 4063 bytes .../test/reporting/yardstick/img/weather-clear.png | Bin 0 -> 1560 bytes .../reporting/yardstick/img/weather-few-clouds.png | Bin 0 -> 1927 bytes .../reporting/yardstick/img/weather-overcast.png | Bin 0 -> 1588 bytes .../test/reporting/yardstick/img/weather-storm.png | Bin 0 -> 2137 bytes utils/test/reporting/yardstick/index.html | 48 +++++++++++++ utils/test/reporting/yardstick/reporting-status.py | 74 +++++++++++++++++++++ utils/test/reporting/yardstick/reportingConf.py | 28 ++++++++ utils/test/reporting/yardstick/reportingUtils.py | 68 +++++++++++++++++++ utils/test/reporting/yardstick/scenarioResult.py | 20 ++++++ .../yardstick/template/index-status-tmpl.html | 66 ++++++++++++++++++ 12 files changed, 304 insertions(+) create mode 100644 utils/test/reporting/yardstick/img/icon-nok.png create mode 100644 utils/test/reporting/yardstick/img/icon-ok.png create mode 100644 utils/test/reporting/yardstick/img/weather-clear.png create mode 100644 utils/test/reporting/yardstick/img/weather-few-clouds.png create mode 100644 utils/test/reporting/yardstick/img/weather-overcast.png create mode 100644 utils/test/reporting/yardstick/img/weather-storm.png create mode 100644 utils/test/reporting/yardstick/index.html create mode 100644 utils/test/reporting/yardstick/reporting-status.py create mode 100644 utils/test/reporting/yardstick/reportingConf.py create mode 100644 utils/test/reporting/yardstick/reportingUtils.py create mode 100644 utils/test/reporting/yardstick/scenarioResult.py create mode 100644 utils/test/reporting/yardstick/template/index-status-tmpl.html diff --git a/utils/test/reporting/yardstick/img/icon-nok.png b/utils/test/reporting/yardstick/img/icon-nok.png new file mode 100644 index 0000000000000000000000000000000000000000..526b5294b28342faafaf7eb5e744b4e5d84e346c GIT binary patch literal 2317 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 KMNUMnLSTYV>JcIU literal 0 HcmV?d00001 diff --git a/utils/test/reporting/yardstick/img/weather-few-clouds.png b/utils/test/reporting/yardstick/img/weather-few-clouds.png new file mode 100644 index 0000000000000000000000000000000000000000..acfa783984eecb2158c3f06ae1a59b9cab66920b GIT binary patch literal 1927 zcmV;22YC32P) zTWnm#9man%=j_?D7uy?q?Kp8r>|hANB(w>HCBJmRS z0ri1KZF*6Qs!A;pPe>pxfsl$yZ5oQw5I__Pxj0c0VLNub>-E{)bDx<$tZT(hoT4C6 z^)DT1&Sk#;_y6XbIWzG89KpWfWyy=1mVFuwd9@w&vm2$8b+(erZq?6jylNc#YCEc2 zwk-NKTq^{q=x`aB{7eaucLyovS0ZNHS4rTq(&?A)EXU7n?!8h+;kvhwjJialu5jI3 zuJmpE{GGk}`Mb)Odv{p{5-FrrET6bLCSQ8miE3g!*xOK&vPOPe~)qRxj|vTBWJTUpX)j~vR}w)bbBSOEYooZC;S zJVar#WOA-!G9n)zxbH#P)&GR)T2i)3-4bB~8gz)NO@5ck`C9Z^ewU7#uaM2TqA<~J z>eQ&5-M>(pE0|E9G2Qq`=Cx*(_gD z7K?g!>vQkkBdhiA8)*>!hoNQEnT4_}I0VKR%pbRuUYfY)(OY`Qf7ti=n_cu6s2PwM zFbZ@yOCkgjgH|AV&~_jC*jvwuX1LQLZOHo%);=+T-9LY_Unst9+oD}5bM~(5q93ij zv8^Zz6-cMSZU-yhB9PW0^+5YT1SAk?kY$uEdFs>$JKb%s|9)YW|AWAuU;cFC&1-Hx zbkj|1?X2T)e)KFWgS}YSbVG2wl{nK0&Y~89xYi=2nqYhoDZ~mQg~|3~D%0oX$72KX z!TB@j;+R_pcJKK~|ElY5*t34!t#;ONX!<^#Vhp*c25>gPmgHpf$*}r2+<& zBup|)*0N|*z_BbwX0|i5<_@^^3N|Bxo>*Wqw&ZWdU!8Jn(6<9Rc9o`>)Ic-{4sEofwI(Yg zPQ@wFWL;kWxiX}NILwkJnmCDQHk&N&=_LpQ0^cW!BZ4p>W81iH25Cur-zSb^qA0`| z!*p%hMu^UT6Ik$HpkKYi)rG?MOtHAq)eIfogRs9336M?a@ab`^SQtNn^==`c|(IOLOaW zx$R-uZ0!8gTe-hpfBg`aWl{H9l6u|@LEyKp&?gE*;v^;vL&7K|N#Z%otm~4`=jrS$ zy9V>kc`M;11Ugr2qkXVMohre}P)NcHQTypAj%YL!rfXF^&!gFFlFhn=VL*~3NGV$e zjbqX@nZpx8AZ7)(EDMab=S+Bs{LkOrLvwPqIrH~JX5^jSmN)Yo>;5;Z2=;z->_Z(# z5shXOtu=8R(`+_~yaNk_Tqv=U_J2X1vd~= z_1ga6__2|`?AX?U!JaPzjGUNw;as!(%z`D)h7clkZ0kfEnGkK#TxKiw@d&4 N002ovPDHLkV1mG)xL*JO literal 0 HcmV?d00001 diff --git a/utils/test/reporting/yardstick/img/weather-overcast.png b/utils/test/reporting/yardstick/img/weather-overcast.png new file mode 100644 index 0000000000000000000000000000000000000000..4296246d0cd9dee7293ef68c1ad379903109fc0a GIT binary patch literal 1588 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 + + + + + + + + + + +
+
+

Yardstick reporting page

+ +
+
+
+
+
+

Yardstick

+ Yardstick is used in OPNFV for verifying the OPNFV infrastructure and some of the OPNFV features. +
The Yardstick framework is deployed in several OPNFV community labs. +
It is installer, infrastructure and application independent. + +

Useful Links

+
  • Yardstick in Depth
  • +
  • Yardstick Repo
  • +
  • Yardstick Project
  • +
  • Yardstick Jenkins page
  • +
  • JIRA
  • + +
    +
    +
    +
    \ No newline at end of file diff --git a/utils/test/reporting/yardstick/reporting-status.py b/utils/test/reporting/yardstick/reporting-status.py new file mode 100644 index 000000000..ed5dab044 --- /dev/null +++ b/utils/test/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/utils/test/reporting/yardstick/reportingConf.py b/utils/test/reporting/yardstick/reportingConf.py new file mode 100644 index 000000000..af95cc00f --- /dev/null +++ b/utils/test/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/utils/test/reporting/yardstick/reportingUtils.py b/utils/test/reporting/yardstick/reportingUtils.py new file mode 100644 index 000000000..06bcd4926 --- /dev/null +++ b/utils/test/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/utils/test/reporting/yardstick/scenarioResult.py b/utils/test/reporting/yardstick/scenarioResult.py new file mode 100644 index 000000000..743346adc --- /dev/null +++ b/utils/test/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/utils/test/reporting/yardstick/template/index-status-tmpl.html b/utils/test/reporting/yardstick/template/index-status-tmpl.html new file mode 100644 index 000000000..ff1a619f1 --- /dev/null +++ b/utils/test/reporting/yardstick/template/index-status-tmpl.html @@ -0,0 +1,66 @@ + + + + + + + + + + + +
    +
    +

    Yardstick status page ({{version}})

    + +
    +
    +
    +
    + + +
    +

    List of last scenarios ({{version}}) run over the last {{period}} days

    + + + + + + + {% for scenario,result in scenario_results.iteritems() -%} + + + + + + {%- endfor %} +
    ScenarioStatusScore
    {{scenario}} + {%if scenario_results[scenario].getStatus() is sameas "OK" -%} + + {%- else -%} + + {%- endif %} + {{scenario_results[scenario].getScore()}}
    +
    + + +
    +
    +
    -- 2.16.6