summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xreporting/docker/reporting.sh7
-rw-r--r--reporting/html/colorado.html2
-rw-r--r--reporting/html/danube.html2
-rw-r--r--reporting/html/euphrates.html2
-rw-r--r--reporting/html/fraser.html (renamed from reporting/html/functest-colorado.html)265
-rw-r--r--reporting/html/functest-danube.html124
-rw-r--r--reporting/html/functest-master.html124
-rw-r--r--reporting/html/functest.html (renamed from reporting/html/functest-euphrates.html)29
-rw-r--r--reporting/html/index.html33
-rw-r--r--reporting/html/master.html2
-rw-r--r--reporting/img/fraser.jpgbin0 -> 45629 bytes
-rwxr-xr-xreporting/reporting/functest/reporting-tempest.py26
-rwxr-xr-xreporting/reporting/functest/reporting-vims.py2
-rw-r--r--reporting/reporting/reporting.yaml2
-rw-r--r--reporting/reporting/vsperf/reporting-status.py2
-rw-r--r--testapi/3rd_party/static/testapi-ui/assets/lib/angular-json-tree/angular-json-tree.min.js2
-rw-r--r--testapi/opnfv_testapi/handlers/sign_handlers.py2
-rw-r--r--testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResult.html68
-rw-r--r--testapi/opnfv_testapi/ui/components/deploy-results/deploy-result/deployResultController.js21
-rw-r--r--testapi/opnfv_testapi/ui/components/pods/podsController.js6
-rw-r--r--testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCase.html70
-rw-r--r--testapi/opnfv_testapi/ui/components/projects/project/testCases/testCase/testCaseController.js6
-rw-r--r--testapi/opnfv_testapi/ui/components/projects/projectsController.js6
-rw-r--r--testapi/opnfv_testapi/ui/components/results/result/result.html46
-rw-r--r--testapi/opnfv_testapi/ui/components/results/result/resultController.js7
-rw-r--r--testapi/opnfv_testapi/ui/components/scenarios/modals/customModal.html6
-rw-r--r--testapi/testapi-client/setup.cfg4
-rw-r--r--testapi/testapi-client/testapiclient/cli/deployresults.py100
-rw-r--r--testapi/testapi-client/testapiclient/tests/unit/test_deployresults.py109
-rw-r--r--testapi/testapi-client/testapiclient/tests/unit/test_placeholder.py6
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>&copy; 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>&copy; 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>&copy; 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>&copy; 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
new file mode 100644
index 0000000..8bc6b51
--- /dev/null
+++ b/reporting/img/fraser.jpg
Binary files differ
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&nbsp;:</td>
- <td class="podsTableLeftTd">{{ctrl.data._id}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Installer&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.installer}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Version&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.version}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Scenario&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.scenario}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Pod&nbsp;Name&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.pod_name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Criteria&nbsp;:</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}}&nbsp;:</td>
+ <td width="86%" class="podsTableLeftTd">{{ctrl.data[index]}}</td>
</tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Start&nbsp;Date&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.start_date}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Stop&nbsp;Date&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.stop_date}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Job&nbsp;Name&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.job_name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Build&nbsp;ID&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data['build_id']}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Upstream&nbsp;Job&nbsp;Name&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.upstream_job_name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Upstream&nbspBuild&nbsp;ID&nbsp;:</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&nbsp;:</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}}&nbsp;:</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&nbsp;:</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}}&nbsp;:</td>
+ <td width="86%" class="podsTableLeftTd">{{ctrl.data[index]}}</td>
</tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Name&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Project&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.project_name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Creator&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.creator}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Tier&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.tier}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Blocking&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.blocking}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">CI&nbsp;Loop&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.ci_loop}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Tags&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.tags}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Version&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.version}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Created&nbsp;at&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data['creation_date']}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Dependencies&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.dependencies}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Trust&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.trust}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Criteria&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.criteria}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Catalog&nbsp;Description&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.catalog_description}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">URL&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.url}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Run&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.run}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Description&nbsp;:</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&nbsp;:</td>
- <td class="podsTableLeftTd">{{ctrl.data._id}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Pod&nbsp;Name:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.pod_name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Project&nbsp;Name:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.project_name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Case&nbsp;Name&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.case_name}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Installer&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.installer}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Version&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.version}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Scenario&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.scenario}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Build&nbsp;tag&nbsp;:</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}}&nbsp;:</td>
+ <td width="90%" class="podsTableLeftTd">{{ctrl.data[index]}}</td>
</tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Criteria&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.criteria}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Start&nbsp;Date:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.start_date}}</td>
- </tr>
- <tr style="padding:9px">
- <td class="podsTableTd">Stop&nbsp;Date&nbsp;:</td>
- <td width="90%" class="podsTableLeftTd">{{ctrl.data.stop_date}}</td>
+ <tr ng-repeat-end=>
</tr>
<tr style="padding:9px">
<td class="podsTableTd">Details&nbsp;:</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)