diff options
30 files changed, 458 insertions, 623 deletions
diff --git a/reporting/docker/reporting.sh b/reporting/docker/reporting.sh index 2cb438d..ee9dccf 100755 --- a/reporting/docker/reporting.sh +++ b/reporting/docker/reporting.sh @@ -3,7 +3,7 @@ export PYTHONPATH="${PYTHONPATH}:./reporting" export CONFIG_REPORTING_YAML=./reporting/reporting.yaml -declare -a versions=(euphrates danube master) +declare -a versions=(fraser euphrates master) declare -a projects=(functest storperf yardstick qtip vsperf bottlenecks) project=$1 @@ -25,6 +25,11 @@ cp -Rf html/* display cp -Rf img display cp -Rf js display +for i in "${versions[@]}" +do + cp -Rf html/functest.html display/$i/functest +done + # if nothing is precised run all the reporting generation # projet | option # $1 | $2 diff --git a/reporting/html/colorado.html b/reporting/html/colorado.html index 58cb009..7a7326e 100644 --- a/reporting/html/colorado.html +++ b/reporting/html/colorado.html @@ -58,7 +58,7 @@ <span class="image">
<img src="img/projectIcon_functest_250x250.png" alt="" />
</span>
- <a href="functest-colorado.html">
+ <a href="colorado/functest/functest.html">
<h2>Functest</h2>
<div class="content">
<p>Functional testing</p>
diff --git a/reporting/html/danube.html b/reporting/html/danube.html index e06d6e5..ae8a3ac 100644 --- a/reporting/html/danube.html +++ b/reporting/html/danube.html @@ -58,7 +58,7 @@ <span class="image"> <img src="img/projectIcon_functest_250x250.png" alt="" /> </span> - <a href="functest-danube.html"> + <a href="danube/functest/functest.html"> <h2>Functest</h2> <div class="content"> <p>Functional testing</p> diff --git a/reporting/html/euphrates.html b/reporting/html/euphrates.html index 1828fc7..e357edc 100644 --- a/reporting/html/euphrates.html +++ b/reporting/html/euphrates.html @@ -42,7 +42,7 @@ <span class="image"> <img src="img/projectIcon_functest_250x250.png" alt="" /> </span> - <a href="functest-euphrates.html"> + <a href="euphrates/functest/functest.html"> <h2>Functest</h2> <div class="content"> <p>Functional testing</p> diff --git a/reporting/html/functest-colorado.html b/reporting/html/fraser.html index 2fc76d1..65b996c 100644 --- a/reporting/html/functest-colorado.html +++ b/reporting/html/fraser.html @@ -1,124 +1,141 @@ -<!DOCTYPE HTML>
-<!--
- Phantom by HTML5 UP
- html5up.net | @ajlkn
- Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
--->
-<html>
- <head>
- <title>Phantom by HTML5 UP</title>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <!--[if lte IE 8]><script src="3rd_party/js/ie/html5shiv.js"></script><![endif]-->
- <link rel="stylesheet" href="3rd_party/css/main.css" />
- <!--[if lte IE 9]><link rel="stylesheet" href="3rd_party/css/ie9.css" /><![endif]-->
- <!--[if lte IE 8]><link rel="stylesheet" href="3rd_party/css/ie8.css" /><![endif]-->
- </head>
- <body>
- <!-- Wrapper -->
- <div id="wrapper">
-
- <!-- Header -->
- <header id="header">
- <div class="inner">
-
- <!-- Logo -->
- <a href="index.html" class="logo">
- <span class="symbol"><img src="img/logo.svg" alt="" /></span><span class="title">Phantom</span>
- </a>
-
- <!-- Nav -->
- <!-- <nav>
- <ul>
- <li><a href="#menu">Menu</a></li>
- </ul>
- </nav>
- --->
- </div>
- </header>
-
- <!-- Menu -->
- <!--- <nav id="menu">
- <h2>Menu</h2>
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="colorado.html">Colorado</a></li>
- <li><a href="danube.html">Danube</a></li>
- </ul>
- </nav>
- --->
- <!-- Main -->
- <div id="main">
- <div class="inner">
- <header>
- <h1>Functest reporting</h1>
- </header>
- <section class="tiles">
- <article class="style5">
- <span class="image">
- <img src="img/pic05.jpg" alt="" />
- </span>
- <a href="colorado/functest/status-apex.html">
- <h2>Status</h2>
- <div class="content">
- <p>Scenario status</p>
- </div>
- </a>
- </article>
- <article class="style2">
- <span class="image">
- <img src="img/pic02.jpg" alt="" />
- </span>
- <a href="colorado/functest/vims-apex.html">
- <h2>vIMS</h2>
- <div class="content">
- <p>Virtual IMS</p>
- </div>
- </a>
- </article>
- <article class="style3">
- <span class="image">
- <img src="img/pic03.jpg" alt="" />
- </span>
- <a href="colorado/functest/tempest-apex.html">
- <h2>Tempest</h2>
- <div class="content">
- <p>Tempest OpenStack suite</p>
- </div>
- </a>
- </article>
- </section>
- </div>
- </div>
-
- <!-- Footer -->
- <footer id="footer">
- <div class="inner">
- <section>
- <h2>OPNFV Testing Working group</h2>
- </section>
- <section>
- <h2>Follow</h2>
- <ul class="icons">
- <li><a href="https://twitter.com/opnfv" class="icon style2 fa-twitter"><span class="label">Twitter</span></a></li>
- <li><a href="http://git.opnfv.org" class="icon style2 fa-github"><span class="label">GitHub</span></a></li>
- <li><a href="mailto:test-wg@list.opnfv.org" class="icon style2 fa-envelope-o"><span class="label">Email</span></a></li>
- </ul>
- </section>
- <ul class="copyright">
- <li>© Untitled. All rights reserved</li><li>Design: <a href="http://html5up.net">HTML5 UP</a></li>
- </ul>
- </div>
- </footer>
-
- </div>
-
- <!-- Scripts -->
- <script src="3rd_party/js/jquery.min.js"></script>
- <script src="3rd_party/js/skel.min.js"></script>
- <script src="3rd_party/js/util.js"></script>
- <!--[if lte IE 8]><script src="3rd_party/js/ie/respond.min.js"></script><![endif]-->
- <script src="3rd_party/js/main.js"></script>
-
- </body>
-</html>
+<!DOCTYPE HTML> +<!-- + Phantom by HTML5 UP + html5up.net | @ajlkn + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) +--> +<html> + <head> + <title>Phantom by HTML5 UP</title> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <!--[if lte IE 8]><script src="3rd_party/js/ie/html5shiv.js"></script><![endif]--> + <link rel="stylesheet" href="3rd_party/css/main.css" /> + <!--[if lte IE 9]><link rel="stylesheet" href="3rd_party/css/ie9.css" /><![endif]--> + <!--[if lte IE 8]><link rel="stylesheet" href="3rd_party/css/ie8.css" /><![endif]--> + </head> + <body> + <!-- Wrapper --> + <div id="wrapper"> + + <!-- Header --> + <header id="header"> + <div class="inner"> + + <!-- Logo --> + <a href="index.html" class="logo"> + <span class="symbol"><img src="img/logo.svg" alt="" /></span><span class="title">Phantom</span> + </a> + + </div> + </header> + + <!-- Menu --> + <!-- Main --> + <div id="main"> + <div class="inner"> + <header> + <h1>Fraser reporting</h1> + </header> + <section class="tiles"> + <article class="style3"> + <span class="image"> + <img src="img/projectIcon_functest_250x250.png" alt="" /> + </span> + <a href="fraser/functest/functest.html"> + <h2>Functest</h2> + <div class="content"> + <p>Functional testing</p> + </div> + </a> + </article> + <article class="style2"> + <span class="image"> + <img src="img/projectIcon_yardstick_250x250.png" alt="" /> + </span> + <a href="fraser/yardstick/status-apex.html"> + <h2>Yardstick</h2> + <div class="content"> + <p>Qualification and performance testing</p> + </div> + </a> + </article> + <article class="style4"> + <span class="image"> + <img src="img/projectIcon_storperf_250x250.png" alt="" /> + </span> + <a href="fraser/storperf/status-apex.html"> + <h2>Storperf</h2> + <div class="content"> + <p>Storage testing</p> + </div> + </a> + </article> + <article class="style5"> + <span class="image"> + <img src="img/projectIcon_vsperf_250x250.png" alt="" /> + </span> + <a href="fraser/vsperf/reporting.html"> + <h2>Vsperf</h2> + <div class="content"> + <p>Virtual switch testing</p> + </div> + </a> + </article> + <article class="style1"> + <span class="image"> + <img src="img/projectIcon_qtip_250x250.png" alt="" /> + </span> + <a href="fraser/qtip/status-apex.html"> + <h2>Qtip</h2> + <div class="content"> + <p>Benchmark as a service</p> + </div> + </a> + </article> + <article class="style6"> + <span class="image"> + <img src="img/projectIcon_bottlenecks_250x250.png" alt="" /> + </span> + <a href="fraser/bottlenecks/status-apex.html"> + <h2>Bottlenecks</h2> + <div class="content"> + <p>Bottleneck finder</p> + </div> + </a> + </article> + </section> + </div> + </div> + + <!-- Footer --> + <footer id="footer"> + <div class="inner"> + <section> + <h2>OPNFV Testing Working group</h2> + </section> + <section> + <h2>Follow</h2> + <ul class="icons"> + <li><a href="https://twitter.com/opnfv" class="icon style2 fa-twitter"><span class="label">Twitter</span></a></li> + <li><a href="http://git.opnfv.org" class="icon style2 fa-github"><span class="label">GitHub</span></a></li> + <li><a href="mailto:test-wg@list.opnfv.org" class="icon style2 fa-envelope-o"><span class="label">Email</span></a></li> + </ul> + </section> + <ul class="copyright"> + <li>© Untitled. All rights reserved</li><li>Design: <a href="http://html5up.net">HTML5 UP</a></li> + </ul> + </div> + </footer> + + </div> + + <!-- Scripts --> + <script src="3rd_party/js/jquery.min.js"></script> + <script src="3rd_party/js/skel.min.js"></script> + <script src="3rd_party/js/util.js"></script> + <!--[if lte IE 8]><script src="3rd_party/js/ie/respond.min.js"></script><![endif]--> + <script src="3rd_party/js/main.js"></script> + + </body> +</html> diff --git a/reporting/html/functest-danube.html b/reporting/html/functest-danube.html deleted file mode 100644 index ac99cb0..0000000 --- a/reporting/html/functest-danube.html +++ /dev/null @@ -1,124 +0,0 @@ -<!DOCTYPE HTML> -<!-- - Phantom by HTML5 UP - html5up.net | @ajlkn - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) ---> -<html> - <head> - <title>Phantom by HTML5 UP</title> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <!--[if lte IE 8]><script src="3rd_party/js/ie/html5shiv.js"></script><![endif]--> - <link rel="stylesheet" href="3rd_party/css/main.css" /> - <!--[if lte IE 9]><link rel="stylesheet" href="3rd_party/css/ie9.css" /><![endif]--> - <!--[if lte IE 8]><link rel="stylesheet" href="3rd_party/css/ie8.css" /><![endif]--> - </head> - <body> - <!-- Wrapper --> - <div id="wrapper"> - - <!-- Header --> - <header id="header"> - <div class="inner"> - - <!-- Logo --> - <a href="index.html" class="logo"> - <span class="symbol"><img src="img/logo.svg" alt="" /></span><span class="title">Phantom</span> - </a> - - <!-- Nav --> - <!-- <nav> - <ul> - <li><a href="#menu">Menu</a></li> - </ul> - </nav> - ---> - </div> - </header> - - <!-- Menu --> - <!--- <nav id="menu"> - <h2>Menu</h2> - <ul> - <li><a href="index.html">Home</a></li> - <li><a href="colorado.html">Colorado</a></li> - <li><a href="danube.html">Danube</a></li> - </ul> - </nav> - ---> - <!-- Main --> - <div id="main"> - <div class="inner"> - <header> - <h1>Functest reporting</h1> - </header> - <section class="tiles"> - <article class="style5"> - <span class="image"> - <img src="img/pic05.jpg" alt="" /> - </span> - <a href="danube/functest/status-apex.html"> - <h2>Status</h2> - <div class="content"> - <p>Scenario status</p> - </div> - </a> - </article> - <article class="style2"> - <span class="image"> - <img src="img/pic02.jpg" alt="" /> - </span> - <a href="danube/functest/vims-apex.html"> - <h2>vIMS</h2> - <div class="content"> - <p>Virtual IMS</p> - </div> - </a> - </article> - <article class="style3"> - <span class="image"> - <img src="img/pic03.jpg" alt="" /> - </span> - <a href="danube/functest/tempest-apex.html"> - <h2>Tempest</h2> - <div class="content"> - <p>Tempest OpenStack suite</p> - </div> - </a> - </article> - </section> - </div> - </div> - - <!-- Footer --> - <footer id="footer"> - <div class="inner"> - <section> - <h2>OPNFV Testing Working group</h2> - </section> - <section> - <h2>Follow</h2> - <ul class="icons"> - <li><a href="https://twitter.com/opnfv" class="icon style2 fa-twitter"><span class="label">Twitter</span></a></li> - <li><a href="http://git.opnfv.org" class="icon style2 fa-github"><span class="label">GitHub</span></a></li> - <li><a href="mailto:test-wg@list.opnfv.org" class="icon style2 fa-envelope-o"><span class="label">Email</span></a></li> - </ul> - </section> - <ul class="copyright"> - <li>© Untitled. All rights reserved</li><li>Design: <a href="http://html5up.net">HTML5 UP</a></li> - </ul> - </div> - </footer> - - </div> - - <!-- Scripts --> - <script src="3rd_party/js/jquery.min.js"></script> - <script src="3rd_party/js/skel.min.js"></script> - <script src="3rd_party/js/util.js"></script> - <!--[if lte IE 8]><script src="3rd_party/js/ie/respond.min.js"></script><![endif]--> - <script src="3rd_party/js/main.js"></script> - - </body> -</html> diff --git a/reporting/html/functest-master.html b/reporting/html/functest-master.html deleted file mode 100644 index 4b1f763..0000000 --- a/reporting/html/functest-master.html +++ /dev/null @@ -1,124 +0,0 @@ -<!DOCTYPE HTML> -<!-- - Phantom by HTML5 UP - html5up.net | @ajlkn - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) ---> -<html> - <head> - <title>Phantom by HTML5 UP</title> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <!--[if lte IE 8]><script src="3rd_party/js/ie/html5shiv.js"></script><![endif]--> - <link rel="stylesheet" href="3rd_party/css/main.css" /> - <!--[if lte IE 9]><link rel="stylesheet" href="3rd_party/css/ie9.css" /><![endif]--> - <!--[if lte IE 8]><link rel="stylesheet" href="3rd_party/css/ie8.css" /><![endif]--> - </head> - <body> - <!-- Wrapper --> - <div id="wrapper"> - - <!-- Header --> - <header id="header"> - <div class="inner"> - - <!-- Logo --> - <a href="index.html" class="logo"> - <span class="symbol"><img src="img/logo.svg" alt="" /></span><span class="title">Phantom</span> - </a> - - <!-- Nav --> - <!-- <nav> - <ul> - <li><a href="#menu">Menu</a></li> - </ul> - </nav> - ---> - </div> - </header> - - <!-- Menu --> - <!--- <nav id="menu"> - <h2>Menu</h2> - <ul> - <li><a href="index.html">Home</a></li> - <li><a href="colorado.html">Colorado</a></li> - <li><a href="danube.html">Danube</a></li> - </ul> - </nav> - ---> - <!-- Main --> - <div id="main"> - <div class="inner"> - <header> - <h1>Functest reporting</h1> - </header> - <section class="tiles"> - <article class="style5"> - <span class="image"> - <img src="img/pic05.jpg" alt="" /> - </span> - <a href="master/functest/status-apex.html"> - <h2>Status</h2> - <div class="content"> - <p>Scenario status</p> - </div> - </a> - </article> - <article class="style2"> - <span class="image"> - <img src="img/pic02.jpg" alt="" /> - </span> - <a href="master/functest/vims-apex.html"> - <h2>vIMS</h2> - <div class="content"> - <p>Virtual IMS</p> - </div> - </a> - </article> - <article class="style3"> - <span class="image"> - <img src="img/pic03.jpg" alt="" /> - </span> - <a href="master/functest/tempest-apex.html"> - <h2>Tempest</h2> - <div class="content"> - <p>Tempest OpenStack suite</p> - </div> - </a> - </article> - </section> - </div> - </div> - - <!-- Footer --> - <footer id="footer"> - <div class="inner"> - <section> - <h2>OPNFV Testing Working group</h2> - </section> - <section> - <h2>Follow</h2> - <ul class="icons"> - <li><a href="https://twitter.com/opnfv" class="icon style2 fa-twitter"><span class="label">Twitter</span></a></li> - <li><a href="http://git.opnfv.org" class="icon style2 fa-github"><span class="label">GitHub</span></a></li> - <li><a href="mailto:test-wg@list.opnfv.org" class="icon style2 fa-envelope-o"><span class="label">Email</span></a></li> - </ul> - </section> - <ul class="copyright"> - <li>© Untitled. All rights reserved</li><li>Design: <a href="http://html5up.net">HTML5 UP</a></li> - </ul> - </div> - </footer> - - </div> - - <!-- Scripts --> - <script src="3rd_party/js/jquery.min.js"></script> - <script src="3rd_party/js/skel.min.js"></script> - <script src="3rd_party/js/util.js"></script> - <!--[if lte IE 8]><script src="3rd_party/js/ie/respond.min.js"></script><![endif]--> - <script src="3rd_party/js/main.js"></script> - - </body> -</html> diff --git a/reporting/html/functest-euphrates.html b/reporting/html/functest.html index c203e61..d5f78c5 100644 --- a/reporting/html/functest-euphrates.html +++ b/reporting/html/functest.html @@ -9,10 +9,7 @@ <title>Phantom by HTML5 UP</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> - <!--[if lte IE 8]><script src="3rd_party/js/ie/html5shiv.js"></script><![endif]--> - <link rel="stylesheet" href="3rd_party/css/main.css" /> - <!--[if lte IE 9]><link rel="stylesheet" href="3rd_party/css/ie9.css" /><![endif]--> - <!--[if lte IE 8]><link rel="stylesheet" href="3rd_party/css/ie8.css" /><![endif]--> + <link rel="stylesheet" href="../../3rd_party/css/main.css" /> </head> <body> <!-- Wrapper --> @@ -24,7 +21,9 @@ <!-- Logo --> <a href="index.html" class="logo"> - <span class="symbol"><img src="img/logo.svg" alt="" /></span><span class="title">Phantom</span> + <span class="symbol"><img src="../../img/logo.svg" alt="" /> + </span> + <span class="title">Functest</span> </a> </div> @@ -41,9 +40,9 @@ <section class="tiles"> <article class="style5"> <span class="image"> - <img src="img/pic05.jpg" alt="" /> + <img src="../../img/pic05.jpg" alt="" /> </span> - <a href="euphrates/functest/status-apex.html"> + <a href="status-apex.html"> <h2>Status</h2> <div class="content"> <p>Scenario status</p> @@ -52,9 +51,9 @@ </article> <article class="style2"> <span class="image"> - <img src="img/pic02.jpg" alt="" /> + <img src="../../img/pic02.jpg" alt="" /> </span> - <a href="euphrates/functest/vims-apex.html"> + <a href="vims-apex.html"> <h2>vIMS</h2> <div class="content"> <p>Virtual IMS</p> @@ -63,9 +62,9 @@ </article> <article class="style3"> <span class="image"> - <img src="img/pic03.jpg" alt="" /> + <img src="../../img/pic03.jpg" alt="" /> </span> - <a href="euphrates/functest/tempest-apex.html"> + <a href="tempest-apex.html"> <h2>Tempest</h2> <div class="content"> <p>Tempest OpenStack suite</p> @@ -99,11 +98,11 @@ </div> <!-- Scripts --> - <script src="3rd_party/js/jquery.min.js"></script> - <script src="3rd_party/js/skel.min.js"></script> - <script src="3rd_party/js/util.js"></script> + <script src="../../3rd_party/js/jquery.min.js"></script> + <script src="../../3rd_party/js/skel.min.js"></script> + <script src="../../3rd_party/js/util.js"></script> <!--[if lte IE 8]><script src="3rd_party/js/ie/respond.min.js"></script><![endif]--> - <script src="3rd_party/js/main.js"></script> + <script src="../../3rd_party/js/main.js"></script> </body> </html> diff --git a/reporting/html/index.html b/reporting/html/index.html index 22d7078..858ac47 100644 --- a/reporting/html/index.html +++ b/reporting/html/index.html @@ -43,40 +43,29 @@ <h1>OPNFV Testing group reporting</h1> </header> <section class="tiles"> - <article class="style3"> + <article class="style4"> <span class="image"> - <img src="img/colorado.jpg" alt="" /> - </span> - <a href="colorado.html"> - <h2>Colorado</h2> - <div class="content"> - <p>Colorado 1.0 (22/09/2016)</p> - </div> - </a> - </article> - <article class="style2"> - <span class="image"> - <img src="img/danube.jpg" alt="" /> + <img src="img/euphrates.jpg" alt="" /> </span> - <a href="danube.html"> - <h2>Danube</h2> + <a href="euphrates.html"> + <h2>Euphrates</h2> <div class="content"> - <p>Danube 1.0 (22/03/2017)</p> + <p>Euphrates (ETA 10/2017)</p> </div> </a> </article> - <article class="style4"> + <article class="style6"> <span class="image"> - <img src="img/euphrates.jpg" alt="" /> + <img src="img/fraser.jpg" alt="" /> </span> - <a href="euphrates.html"> - <h2>Euphrates</h2> + <a href="fraser.html"> + <h2>Fraser</h2> <div class="content"> - <p>Euphrates (ETA 10/2017)</p> + <p>Fraser (ETA 04/2018)</p> </div> </a> </article> - <article class="style6"> + <article class="style5"> <span class="image"> <img src="img/misc-npc-letterblock-m-800px.png" alt="" /> </span> diff --git a/reporting/html/master.html b/reporting/html/master.html index 312e8e6..5d4f916 100644 --- a/reporting/html/master.html +++ b/reporting/html/master.html @@ -58,7 +58,7 @@ <span class="image"> <img src="img/projectIcon_functest_250x250.png" alt="" /> </span> - <a href="functest-master.html"> + <a href="master/functest/functest.html"> <h2>Functest</h2> <div class="content"> <p>Functional testing</p> diff --git a/reporting/img/fraser.jpg b/reporting/img/fraser.jpg Binary files differnew file mode 100644 index 0000000..8bc6b51 --- /dev/null +++ b/reporting/img/fraser.jpg diff --git a/reporting/reporting/functest/reporting-tempest.py b/reporting/reporting/functest/reporting-tempest.py index d78d9a1..b82f96c 100755 --- a/reporting/reporting/functest/reporting-tempest.py +++ b/reporting/reporting/functest/reporting-tempest.py @@ -83,8 +83,16 @@ for version in rp_utils.get_config('general.versions'): # retrieve results # **************** - nb_tests_run = result['details']['tests'] - nb_tests_failed = result['details']['failures'] + try: + nb_tests_run = result['details']['success_number'] + nb_tests_failed = result['details']['failures_number'] + except KeyError: + try: + nb_tests_run = result['details']['tests'] + nb_tests_failed = result['details']['failures'] + except KeyError: + logger.error("Impossible to retrieve results") + logger.debug("nb_tests_run= %s", nb_tests_run) logger.debug("nb_tests_failed= %s", nb_tests_failed) @@ -140,12 +148,14 @@ for version in rp_utils.get_config('general.versions'): # Error management # **************** try: - errors = result['details']['errors'] - logger.info("errors: %s", errors) - result['errors'] = errors - except Exception: # pylint: disable=broad-except - logger.error("Error field not present (Brahamputra runs?)") - + errors = result['details']['failures'] + except KeyError: + try: + errors = result['details']['errors'] + except KeyError: + logger.error("Error field not present (old runs?)") + logger.info("errors: %s", errors) + result['errors'] = errors templateLoader = jinja2.FileSystemLoader(".") templateEnv = jinja2.Environment(loader=templateLoader, autoescape=True) diff --git a/reporting/reporting/functest/reporting-vims.py b/reporting/reporting/functest/reporting-vims.py index 3b25e91..bc9308c 100755 --- a/reporting/reporting/functest/reporting-vims.py +++ b/reporting/reporting/functest/reporting-vims.py @@ -120,7 +120,7 @@ for version in VERSIONS: LOGGER.debug("vIMS deployment: %ss", res_vnf) LOGGER.debug("VNF testing: %ss", res_test_vnf) LOGGER.debug("VNF testing results: %s", format_result) - except Exception as err: # pylint: disable=broad-except + except KeyError as err: # pylint: disable=broad-except LOGGER.error("Uncomplete data %s", err) LOGGER.debug("----------------------------------------") diff --git a/reporting/reporting/reporting.yaml b/reporting/reporting/reporting.yaml index 8123d01..b2f7d07 100644 --- a/reporting/reporting/reporting.yaml +++ b/reporting/reporting/reporting.yaml @@ -9,7 +9,7 @@ general: versions: - master - - euphrates + - fraser log: log_file: reporting.log diff --git a/reporting/reporting/vsperf/reporting-status.py b/reporting/reporting/vsperf/reporting-status.py index b307ef0..f1a437f 100644 --- a/reporting/reporting/vsperf/reporting-status.py +++ b/reporting/reporting/vsperf/reporting-status.py @@ -127,7 +127,7 @@ def main(): period=50) version_data = _get_version_data(data['vsperf']) - for version in {'master', 'danube', 'euphrates'}: + for version in {'master', 'danube', 'euphrates', 'fraser'}: _generate_reporting(version, version_data.get(version, [])) LOG.info("End") diff --git a/testapi/3rd_party/static/testapi-ui/assets/lib/angular-json-tree/angular-json-tree.min.js b/testapi/3rd_party/static/testapi-ui/assets/lib/angular-json-tree/angular-json-tree.min.js index 97f407e..59389b0 100644 --- a/testapi/3rd_party/static/testapi-ui/assets/lib/angular-json-tree/angular-json-tree.min.js +++ b/testapi/3rd_party/static/testapi-ui/assets/lib/angular-json-tree/angular-json-tree.min.js @@ -33,7 +33,7 @@ compile: function (e) { return a.compile(e, this) }, - template: ' <span style="padding-left:0px" class= "key col-md-1" ng-class="{\'hidden\' : key==\'\' && key!=\'0\'}" ng-click="toggleExpanded()">{{key}}</span> <span class="leaf-value col-md-11" ng-if="!isExpandable">{{value}}</span> <span class="branch-preview" ng-if="isExpandable" ng-show="!isExpanded" ng-click="toggleExpanded()">{{preview}}</span> <ul class="branch-value" ng-if="isExpandable" > <li ng-repeat="(subkey,subval) in value"> <json-node key="subkey" class="col-md-12" value="subval"></json-node> </li> </ul>', + template: ' <span style="padding-left:0px" class= "key col-md-2" ng-class="{\'hidden\' : key==\'\' && key!=\'0\'}" ng-click="toggleExpanded()">{{key}}</span> <span class="leaf-value col-md-10" ng-if="!isExpandable">{{value}}</span> <span class="branch-preview" ng-if="isExpandable" ng-show="!isExpanded" ng-click="toggleExpanded()">{{preview}}</span> <ul class="branch-value" ng-if="isExpandable" > <li ng-repeat="(subkey,subval) in value"> <json-node key="subkey" class="col-md-12" value="subval"></json-node> </li> </ul>', pre: function (a, n, s) { if (n.addClass(e.whatClass(a.value).toLowerCase()), e.is(a.value, "Object") || e.is(a.value, "Array")) { a.isExpandable = !0, n.addClass("expandable"); diff --git a/testapi/opnfv_testapi/handlers/sign_handlers.py b/testapi/opnfv_testapi/handlers/sign_handlers.py index 7540662..2039971 100644 --- a/testapi/opnfv_testapi/handlers/sign_handlers.py +++ b/testapi/opnfv_testapi/handlers/sign_handlers.py @@ -46,7 +46,7 @@ class SigninReturnHandler(SignBaseHandler): dbapi.db_update(self.table, q_user, login_user) self.clear_cookie(constants.TESTAPI_ID) - self.set_secure_cookie(constants.TESTAPI_ID, user) + self.set_secure_cookie(constants.TESTAPI_ID, user, 1) self.redirect(url=CONF.ui_url) diff --git a/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResult.html b/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResult.html index 82a0780..c0803ff 100644 --- a/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResult.html +++ b/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResult.html @@ -3,72 +3,16 @@ <div class="table-responsive"> <table class="table" ng-data="ctrl.data.pods"> <tbody> - <tr style="padding:9px"> - <td class="podsTableTd">Id :</td> - <td class="podsTableLeftTd">{{ctrl.data._id}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Installer :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.installer}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Version :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.version}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Scenario :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.scenario}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Pod Name :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.pod_name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Criteria :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.criteria}}</td> + <tr ng-repeat-start="(index, detail) in ctrl.data_field" style="padding:9px"> + <td class="podsTableTd">{{detail | capitalize}} :</td> + <td width="86%" class="podsTableLeftTd">{{ctrl.data[index]}}</td> </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Start Date :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.start_date}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Stop Date :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.stop_date}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Job Name :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.job_name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Build ID :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data['build_id']}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Upstream Job Name :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.upstream_job_name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Upstream Build ID :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.upstream_build_id}}</td> + <tr ng-repeat-end=> </tr> <tr style="padding:9px"> <td class="podsTableTd">Details :</td> - <td width="90%" class="podsTableLeftTd"> - <a ng-click="ctrl.showDetails()"> - <p ng-if="ctrl.details">Hide</p> - <p ng-if="!ctrl.details">Show</p> - </a> - <table class="table" ng-class="{'hidden' : !ctrl.details}" style="margin:10px"> - <tbody> - <tr style="padding:9px"></tr> - <tr ng-repeat-start="(index, detail) in ctrl.data.details" style="padding:9px"> - <td class="podsTableTd">{{index | capitalize}} :</td> - <td width="90%" class="podsTableLeftTd">{{detail}}</td> - </tr> - <tr ng-repeat-end=> - </tr> - </tbody> - </table> + <td width="86%" class="podsTableLeftTd"> + <json-tree object="ctrl.json.object" root-name="object" start-expanded="true"></json-tree> </td> </tr> </tbody> diff --git a/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResultController.js b/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResultController.js index 40cf1cb..6f9b84c 100644 --- a/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResultController.js +++ b/testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResultController.js @@ -21,7 +21,7 @@ DeployResultController.$inject = [ '$scope', '$http', '$filter', '$state', '$window', '$uibModal', 'testapiApiUrl','raiseAlert', - 'confirmModal' + 'confirmModal', 'dataFieldService' ]; /** @@ -30,12 +30,16 @@ * through result declared in TestAPI. */ function DeployResultController($scope, $http, $filter, $state, $window, $uibModal, testapiApiUrl, - raiseAlert, confirmModal) { + raiseAlert, confirmModal, dataFieldService) { var ctrl = this; ctrl.url = testapiApiUrl + '/deployresults'; ctrl._id = $state.params['_id']; ctrl.loadDetails = loadDetails - ctrl.showDetails = showDetails + ctrl.data_field = {} + + ctrl.json = {}; + ctrl.json.string = '{"id": ""}'; + ctrl.json.object = JSON.parse(ctrl.json.string); /** *Contact the testapi and retrevie the result details @@ -46,6 +50,10 @@ ctrl.podsRequest = $http.get(resultUrl).success(function (data) { ctrl.data = data; + ctrl.object=JSON.stringify(ctrl.data.details) + ctrl.json.object = JSON.parse(ctrl.object) + delete ctrl.data.details; + ctrl.data_field = dataFieldService.dataFunction(ctrl.data, ctrl.data_field) }).catch(function (error) { ctrl.data = null; ctrl.showError = true; @@ -53,13 +61,6 @@ }); } - function showDetails(){ - if(ctrl.details){ - ctrl.details = false - }else{ - ctrl.details = true - } - } ctrl.loadDetails(); } })();
\ No newline at end of file diff --git a/testapi/opnfv_testapi/ui/components/pods/podsController.js b/testapi/opnfv_testapi/ui/components/pods/podsController.js index f405ecb..c50fa5a 100644 --- a/testapi/opnfv_testapi/ui/components/pods/podsController.js +++ b/testapi/opnfv_testapi/ui/components/pods/podsController.js @@ -117,8 +117,10 @@ $http.get(reqURL).success(function (data) { ctrl.data = data; ctrl.sortBy("name") - keepState.filter.podFilter = { - 'name': ctrl.filterText + if(ctrl.filterText != undefined){ + keepState.filter.podFilter = { + 'name': ctrl.filterText + } } }).catch(function (data) { ctrl.data = null; diff --git a/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCase.html b/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCase.html index f4bae41..509f39a 100644 --- a/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCase.html +++ b/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCase.html @@ -3,73 +3,11 @@ <div class="table-responsive"> <table class="table" ng-data="ctrl.data"> <tbody> - <tr style="padding:9px"> - <td class="podsTableTd">Id :</td> - <td class="podsTableLeftTd">{{ctrl.data._id}}</td> + <tr ng-repeat-start="(index, detail) in ctrl.data_field" style="padding:9px"> + <td class="podsTableTd" >{{detail | capitalize}} :</td> + <td width="86%" class="podsTableLeftTd">{{ctrl.data[index]}}</td> </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Name :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Project :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.project_name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Creator :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.creator}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Tier :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.tier}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Blocking :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.blocking}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">CI Loop :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.ci_loop}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Tags :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.tags}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Version :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.version}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Created at :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data['creation_date']}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Dependencies :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.dependencies}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Trust :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.trust}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Criteria :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.criteria}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Catalog Description :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.catalog_description}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">URL :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.url}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Run :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.run}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Description :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.description}}</td> + <tr ng-repeat-end=> </tr> </tbody> </table> diff --git a/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCaseController.js b/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCaseController.js index a38b633..6f93fc1 100644 --- a/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCaseController.js +++ b/testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCaseController.js @@ -21,7 +21,7 @@ TestCaseController.$inject = [ '$scope', '$http', '$filter', '$state', '$window', '$uibModal', 'testapiApiUrl','raiseAlert', - 'confirmModal' + 'confirmModal', 'dataFieldService' ]; /** @@ -30,13 +30,14 @@ * through projects declared in TestAPI. */ function TestCaseController($scope, $http, $filter, $state, $window, $uibModal, testapiApiUrl, - raiseAlert, confirmModal) { + raiseAlert, confirmModal, dataFieldService) { var ctrl = this; ctrl.name = $state.params['name']; ctrl.projectName = $state.params['project_name']; ctrl.url = testapiApiUrl + '/projects/' + ctrl.projectName + "/cases/" + ctrl.name; ctrl.loadDetails = loadDetails; + ctrl.data_field = {} /** * This will contact the TestAPI to get a listing of declared projects. @@ -46,6 +47,7 @@ ctrl.projectsRequest = $http.get(ctrl.url).success(function (data) { ctrl.data = data; + ctrl.data_field = dataFieldService.dataFunction(ctrl.data, ctrl.data_field) }).catch(function (error) { ctrl.data = null; ctrl.showError = true; diff --git a/testapi/opnfv_testapi/ui/components/projects/projectsController.js b/testapi/opnfv_testapi/ui/components/projects/projectsController.js index 07a58fe..4f0af0f 100644 --- a/testapi/opnfv_testapi/ui/components/projects/projectsController.js +++ b/testapi/opnfv_testapi/ui/components/projects/projectsController.js @@ -167,8 +167,10 @@ ctrl.resultsRequest = $http.get(content_url).success(function (data) { ctrl.data = data; - keepState.filter.projectFilter = { - 'name': ctrl.filterText + if(ctrl.filterText != undefined){ + keepState.filter.projectFilter = { + 'name': ctrl.filterText + } } }).catch(function (data) { ctrl.data = null; diff --git a/testapi/opnfv_testapi/ui/components/results/result/result.html b/testapi/opnfv_testapi/ui/components/results/result/result.html index e6b30a9..041f244 100644 --- a/testapi/opnfv_testapi/ui/components/results/result/result.html +++ b/testapi/opnfv_testapi/ui/components/results/result/result.html @@ -3,49 +3,11 @@ <div class="table-responsive"> <table class="table" ng-data="ctrl.data.pods"> <tbody> - <tr style="padding:9px"> - <td class="podsTableTd">Id :</td> - <td class="podsTableLeftTd">{{ctrl.data._id}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Pod Name:</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.pod_name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Project Name:</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.project_name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Case Name :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.case_name}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Installer :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.installer}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Version :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.version}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Scenario :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.scenario}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Build tag :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data['build_tag']}}</td> + <tr ng-repeat-start="(index, detail) in ctrl.data_field" style="padding:9px"> + <td class="podsTableTd">{{detail | capitalize}} :</td> + <td width="90%" class="podsTableLeftTd">{{ctrl.data[index]}}</td> </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Criteria :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.criteria}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Start Date:</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.start_date}}</td> - </tr> - <tr style="padding:9px"> - <td class="podsTableTd">Stop Date :</td> - <td width="90%" class="podsTableLeftTd">{{ctrl.data.stop_date}}</td> + <tr ng-repeat-end=> </tr> <tr style="padding:9px"> <td class="podsTableTd">Details :</td> diff --git a/testapi/opnfv_testapi/ui/components/results/result/resultController.js b/testapi/opnfv_testapi/ui/components/results/result/resultController.js index d297b43..2726704 100644 --- a/testapi/opnfv_testapi/ui/components/results/result/resultController.js +++ b/testapi/opnfv_testapi/ui/components/results/result/resultController.js @@ -21,7 +21,7 @@ ResultController.$inject = [ '$scope', '$http', '$filter', '$state', '$window', '$uibModal', 'testapiApiUrl','raiseAlert', - 'confirmModal' + 'confirmModal', 'dataFieldService' ]; /** @@ -30,11 +30,12 @@ * through result declared in TestAPI. */ function ResultController($scope, $http, $filter, $state, $window, $uibModal, testapiApiUrl, - raiseAlert, confirmModal) { + raiseAlert, confirmModal, dataFieldService) { var ctrl = this; ctrl.url = testapiApiUrl + '/results'; ctrl._id = $state.params['_id']; ctrl.loadDetails = loadDetails + ctrl.data_field = {} ctrl.json = {}; ctrl.json.string = '{"id": ""}'; @@ -51,6 +52,8 @@ ctrl.data = data; ctrl.object=JSON.stringify(ctrl.data.details) ctrl.json.object = JSON.parse(ctrl.object) + delete ctrl.data.details; + ctrl.data_field = dataFieldService.dataFunction(ctrl.data, ctrl.data_field) }).catch(function (error) { ctrl.data = null; ctrl.showError = true; diff --git a/testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html b/testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html index 0cd2663..4225749 100644 --- a/testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html +++ b/testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html @@ -6,14 +6,16 @@ <legend>{{customModalCtrl.data.text}}</legend> <div class="row"> <div class="update-project"> - <label for="cpid" class="control-label col-sm-4">Custom: </label> + <label for="cpid" class="control-label col-sm-2">Custom: </label> <table cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <div class="col-sm-12"> <input type="text" class="form-control" ng-model="customModalCtrl.custom"/> - <p class="help-block"></p> + <p class="help-block"> + Please separate multiple customs with space or comma + </p> </div> </td> </tr> diff --git a/testapi/testapi-client/setup.cfg b/testapi/testapi-client/setup.cfg index 2427c57..b89fba4 100644 --- a/testapi/testapi-client/setup.cfg +++ b/testapi/testapi-client/setup.cfg @@ -60,6 +60,10 @@ testapi = scenario score create = testapiclient.cli.scenarios:ScoreCreate + deployresult create = testapiclient.cli.deployresults:DeployresultCreate + deployresult get = testapiclient.cli.deployresults:DeployresultGet + deployresult getone = testapiclient.cli.deployresults:DeployresultGetOne + [egg_info] tag_build = tag_date = 0 diff --git a/testapi/testapi-client/testapiclient/cli/deployresults.py b/testapi/testapi-client/testapiclient/cli/deployresults.py new file mode 100644 index 0000000..a6fe13e --- /dev/null +++ b/testapi/testapi-client/testapiclient/cli/deployresults.py @@ -0,0 +1,100 @@ +import json + +from testapiclient.utils import command +from testapiclient.utils import urlparse + + +def deployresults_url(): + return urlparse.resource_join('deployresults') + + +def deployresult_url(parsed_args): + return urlparse.path_join(deployresults_url(), parsed_args.deployresult_id) + + +class DeployresultGet(command.Lister): + + def get_parser(self, prog_name): + parser = super(DeployresultGet, self).get_parser(prog_name) + parser.add_argument('-build-id', + help='Search deployresults using build tag') + parser.add_argument('-from', + help='Search deployresults using from date') + parser.add_argument('-scenario', + help='Search deployresults using scenario') + parser.add_argument('-period', + help='Search deployresults using period') + parser.add_argument('-page', + help='Search deployresults using page') + parser.add_argument('-to', + help='Search deployresults using to') + parser.add_argument('---version', + help='Search deployresults using version') + parser.add_argument('-last', + help='Search deployresults using last date') + parser.add_argument('-pod-name', + help='Search deployresults using pod') + parser.add_argument('-criteria', + help='Search deployresults using version') + parser.add_argument('-installer', + help='Search deployresults using installer') + parser.add_argument('-job-name', + help='Search deployresults using project') + + return parser + + def take_action(self, parsed_args): + columns = ( + '_id', + 'pod_name', + 'version', + 'criteria', + 'start_date', + 'stop_date', + 'scenario', + 'installer', + + ) + data = self.app.client_manager.get( + urlparse.query_by(deployresults_url(), + ['build_id', 'from', 'last', + 'scenario', 'period', 'job_name', + 'to', 'version', + 'criteria', 'installer', 'pod_name', 'page'], + parsed_args)) + return self.format_output(columns, data.get('deployresults', [])) + + +class DeployresultGetOne(command.ShowOne): + + def get_parser(self, prog_name): + parser = super(DeployresultGetOne, self).get_parser(prog_name) + parser.add_argument('deployresult_id', + help='Search deployresult by deployresult id') + return parser + + def take_action(self, parsed_args): + return self.format_output( + self.app.client_manager.get(deployresult_url(parsed_args))) + + +class DeployresultCreate(command.ShowOne): + + def get_parser(self, prog_name): + parser = super(DeployresultCreate, self).get_parser(prog_name) + parser.add_argument('deployresult', + type=json.loads, + help='Deployresult create request format:\n' + '\'{"job_name" : "","scenario" : "",' + '"stop_date" : "", "build_id" : "",' + '"upstream_job_name": "",' + '"version" : "", "pod_name" : "",' + '"criteria" : "", "installer" : "",' + '"upstream_build_id" : "",' + '"start_date" : "", "details" : ""}\'') + return parser + + def take_action(self, parsed_args): + return self.format_output( + self.app.client_manager.post( + deployresults_url(), parsed_args.deployresult)) diff --git a/testapi/testapi-client/testapiclient/tests/unit/test_deployresults.py b/testapi/testapi-client/testapiclient/tests/unit/test_deployresults.py new file mode 100644 index 0000000..0e0385b --- /dev/null +++ b/testapi/testapi-client/testapiclient/tests/unit/test_deployresults.py @@ -0,0 +1,109 @@ +import json + +from mock import mock +from six.moves.urllib import parse +import testtools + +from testapiclient.cli import deployresults +from testapiclient.tests.unit import fakes +from testapiclient.tests.unit import utils +from testapiclient.utils import clientmanager + + +class DeployresultTest(utils.TestCommand): + def setUp(self): + super(DeployresultTest, self).setUp() + self.base_url = parse.urljoin(self.api_url, 'deployresults') + self.deployresult_json = { + 'job_name': 'daisy-deploy', + 'scenario': 'test-scenario', + 'stop_date': '2018-04-09 13:44:53', + 'upstream_job_name': 'test-job', + 'build_id': 'test-build', + 'version': 'test-version', + 'pod_name': 'test-pod', + 'criteria': 'test-criteria', + 'installer': 'test-installer', + 'start_date': '2018-04-09 13:44:53', + 'details': 'test-details', + 'upstream_build_id': 'test-stream' + } + self.deployresult_string = json.dumps(self.deployresult_json) + + +class DeployresultGetTest(DeployresultTest): + + def setUp(self): + super(DeployresultGetTest, self).setUp() + self.deployresults_rsp = {'deployresults': [self.deployresult_json]} + + def test_get(self): + self.get_mock.return_value = fakes.FakeResponse( + data=self.deployresults_rsp) + deployresult_get = deployresults.DeployresultGet( + self.app, mock.Mock()) + args = ['-job-name', 'dfs'] + verifies = [('job_name', 'dfs')] + parsed_args = self.check_parser(deployresult_get, args, verifies) + deployresult_get.take_action(parsed_args) + self.get_mock.assert_called_once_with( + self.base_url + '?job_name=dfs', + headers=clientmanager.ClientManager.headers) + + def test_get_all(self): + self.get_mock.return_value = fakes.FakeResponse( + data=self.deployresults_rsp) + deployresult_get = deployresults.DeployresultGet( + self.app, mock.Mock()) + args = [] + verifies = [] + parsed_args = self.check_parser(deployresult_get, args, verifies) + deployresult_get.take_action(parsed_args) + self.get_mock.assert_called_once_with( + self.base_url, + headers=clientmanager.ClientManager.headers) + + def test_get_one(self): + self.get_mock.return_value = fakes.FakeResponse( + data=self.deployresult_json) + deployresult_get_one = deployresults.DeployresultGetOne( + self.app, mock.Mock()) + args = ['def'] + verifies = [('deployresult_id', 'def')] + parsed_args = self.check_parser( + deployresult_get_one, args, verifies) + deployresult_get_one.take_action(parsed_args) + self.get_mock.assert_called_once_with( + self.base_url + '/def', + headers=clientmanager.ClientManager.headers) + + +class DeployresultCreateTest(DeployresultTest): + + def setUp(self): + super(DeployresultCreateTest, self).setUp() + + def test_create_success(self): + succ_rsp = { + 'href': '{}/{}'.format(self.base_url, + self.deployresult_json.get('project_name')) + } + self.post_mock.return_value = fakes.FakeResponse(data=succ_rsp) + deployresult_create = deployresults.DeployresultCreate( + self.app, mock.Mock()) + args = [self.deployresult_string] + verifies = [('deployresult', self.deployresult_json)] + parsed_args = self.check_parser(deployresult_create, args, verifies) + deployresult_create.take_action(parsed_args) + self.post_mock.assert_called_once() + + def test_create_failure(self): + with testtools.ExpectedException(Exception, 'Create failed: Error'): + self.post_mock.return_value = utils.FAKE_FAILURE + deployresult_create = deployresults.DeployresultCreate( + self.app, mock.Mock()) + args = [self.deployresult_string] + verifies = [('deployresult', self.deployresult_json)] + parsed_args = self.check_parser( + deployresult_create, args, verifies) + deployresult_create.take_action(parsed_args) diff --git a/testapi/testapi-client/testapiclient/tests/unit/test_placeholder.py b/testapi/testapi-client/testapiclient/tests/unit/test_placeholder.py deleted file mode 100644 index 2b7ad46..0000000 --- a/testapi/testapi-client/testapiclient/tests/unit/test_placeholder.py +++ /dev/null @@ -1,6 +0,0 @@ -import testtools - - -class TestPlaceHolder(testtools.TestCase): - def test_placeholder(self): - self.assertEqual(1, 1) |