summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INFO1
-rw-r--r--jjb/apex/apex.yml107
-rw-r--r--jjb/functest/functest-ci-jobs.yml16
-rw-r--r--jjb/joid/joid-ci-jobs.yml12
-rw-r--r--jjb/opnfv/opnfv-docs.yml4
-rwxr-xr-xutils/jenkins-jnlp-connect.sh9
-rw-r--r--utils/test/result_collection_api/dashboard/functest2Dashboard.py19
-rw-r--r--utils/test/result_collection_api/resources/models.py1
-rw-r--r--utils/test/result_collection_api/tools/dashboard/css/opnfv_dashboard_tests.css2
-rw-r--r--utils/test/result_collection_api/tools/dashboard/js/opnfv_dashboard_tests.js4
-rw-r--r--utils/test/result_collection_api/tools/reporting/default.css56
-rw-r--r--utils/test/result_collection_api/tools/reporting/index-tmpl.html91
-rw-r--r--utils/test/result_collection_api/tools/reporting/reporting.py83
13 files changed, 339 insertions, 66 deletions
diff --git a/INFO b/INFO
index 768551d6a..98abf971f 100644
--- a/INFO
+++ b/INFO
@@ -18,7 +18,6 @@ Morgan Richomme (Orange, morgan.richomme@orange.com)
Matthew Lijun (Huawei, matthew.lijun@huawei.com)
Peter Bandzi (Cisco, pbandzi@cisco.com)
Jose Lausuch (Ericsson, jose.lausuch@ericsson.com)
-Guy Rodrigue Koffi (Orange, koffirodrigue@gmail.com)
Ryota Mibu (NEC, r-mibu@cq.jp.nec.com)
Link to TSC approval of the project: http://ircbot.wl.linuxfoundation.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-07-14-14.00.html
diff --git a/jjb/apex/apex.yml b/jjb/apex/apex.yml
index 35e8e3da5..a1e2fe01d 100644
--- a/jjb/apex/apex.yml
+++ b/jjb/apex/apex.yml
@@ -15,10 +15,12 @@
branch: 'master'
gs-pathname: ''
block-stream: 'brahmaputra'
+ slave: 'intel-pod7'
- brahmaputra:
branch: 'stable/brahmaputra'
gs-pathname: '/brahmaputra'
block-stream: 'master'
+ slave: 'opnfv-jump-1'
disabled: false
project: 'apex'
@@ -37,7 +39,7 @@
- job-template:
name: 'apex-verify-{stream}'
- node: opnfv-jump-1
+ node: '{slave}'
parameters:
- apex-parameter:
@@ -99,26 +101,30 @@
- 'apex-build'
- trigger-builds:
- project: 'apex-deploy-virtual-os-odl_l2-nofeature-ha-{stream}'
- predefined-parameters:
+ predefined-parameters: |
BUILD_DIRECTORY=apex-verify-{stream}/build_output
+ OPNFV_CLEAN='yes'
git-revision: false
block: true
- trigger-builds:
- project: 'apex-deploy-virtual-os-onos-nofeature-ha-{stream}'
- predefined-parameters:
+ predefined-parameters: |
BUILD_DIRECTORY=apex-verify-{stream}/build_output
+ OPNFV_CLEAN='yes'
git-revision: false
block: true
- trigger-builds:
- project: 'apex-deploy-virtual-os-odl_l3-nofeature-ha-{stream}'
- predefined-parameters:
+ predefined-parameters: |
BUILD_DIRECTORY=apex-verify-{stream}/build_output
+ OPNFV_CLEAN='yes'
git-revision: false
block: true
- trigger-builds:
- project: 'apex-deploy-virtual-os-odl_l2-sfc-noha-{stream}'
- predefined-parameters:
+ predefined-parameters: |
BUILD_DIRECTORY=apex-verify-{stream}/build_output
+ OPNFV_CLEAN='yes'
git-revision: false
block: true
- 'apex-workspace-cleanup'
@@ -160,6 +166,8 @@
builders:
- trigger-builds:
- project: 'apex-deploy-{platform}-{scenario}-{stream}'
+ predefined-parameters:
+ OPNFV_CLEAN='yes'
git-revision: false
block: true
- trigger-builds:
@@ -189,7 +197,7 @@
# Required Variables:
# stream: branch with - in place of / (eg. stable)
# branch: branch (eg. stable)
- node: opnfv-jump-1
+ node: '{slave}'
disabled: false
@@ -235,7 +243,7 @@
# Required Variables:
# stream: branch with - in place of / (eg. stable)
# branch: branch (eg. stable)
- node: opnfv-jump-1
+ node: '{slave}'
disabled: false
@@ -350,8 +358,9 @@
block: true
- trigger-builds:
- project: 'apex-deploy-baremetal-os-odl_l2-nofeature-ha-{stream}'
- predefined-parameters:
+ predefined-parameters: |
BUILD_DIRECTORY=apex-build-{stream}/build_output
+ OPNFV_CLEAN='yes'
git-revision: true
block: true
- trigger-builds:
@@ -451,6 +460,10 @@
name: GS_URL
default: artifacts.opnfv.org/$PROJECT{gs-pathname}
description: "URL to Google Storage."
+ - string:
+ name: OPNFV_CLEAN
+ default: 'no'
+ description: "Use yes in lower case to invoke clean. Indicates if the deploy environment should be cleaned before deployment"
########################
# builder macros
@@ -473,21 +486,25 @@
if echo $BUILD_TAG | grep "apex-verify" 1> /dev/null; then
if echo $GERRIT_BRANCH | grep "brahmaputra" 1> /dev/null; then
export OPNFV_ARTIFACT_VERSION=brahmaputra-dev${BUILD_NUMBER}
+ export BUILD_ARGS="-c file://$CACHE_DIRECTORY $BUILD_DIRECTORY"
else
export OPNFV_ARTIFACT_VERSION=dev${BUILD_NUMBER}
+ export BUILD_ARGS="-c file://$CACHE_DIRECTORY"
fi
elif [ "$ARTIFACT_VERSION" == "daily" ]; then
if echo $GERRIT_BRANCH | grep "brahmaputra" 1> /dev/null; then
export OPNFV_ARTIFACT_VERSION=brahmaputra-$(date -u +"%Y-%m-%d")
+ export BUILD_ARGS="-c file://$CACHE_DIRECTORY $BUILD_DIRECTORY"
else
export OPNFV_ARTIFACT_VERSION=$(date -u +"%Y-%m-%d")
+ export BUILD_ARGS="-c file://$CACHE_DIRECTORY --iso"
fi
else
export OPNFV_ARTIFACT_VERSION=${ARTIFACT_VERSION}
fi
# start the build
cd $WORKSPACE/ci
- ./build.sh -v $OPNFV_ARTIFACT_VERSION -c file://$CACHE_DIRECTORY $BUILD_DIRECTORY
+ ./build.sh -v $OPNFV_ARTIFACT_VERSION $BUILD_ARGS
RPM_VERSION=$(grep Version $BUILD_DIRECTORY/../build/opnfv-apex.spec | awk '{ print $2 }')-$(echo $OPNFV_ARTIFACT_VERSION | tr -d '_-')
# list the contents of BUILD_OUTPUT directory
ls -al $BUILD_DIRECTORY
@@ -503,8 +520,8 @@
echo "OPNFV_RPM_MD5SUM=$(md5sum $BUILD_DIRECTORY/opnfv-apex-$RPM_VERSION.noarch.rpm | cut -d' ' -f1)"
echo "OPNFV_BUILD_URL=$BUILD_URL"
) > $WORKSPACE/opnfv.properties
- echo
echo "--------------------------------------------------------"
+ echo "Done!"
- builder:
name: 'apex-workspace-cleanup'
@@ -611,43 +628,51 @@
fi
fi
- RPM_LIST=$RPM_INSTALL_PATH
- for pkg in common undercloud opendaylight-sfc; do
- RPM_LIST+=" ${RPM_INSTALL_PATH/opnfv-apex/opnfv-apex-${pkg}}"
- done
+ if [ -z "$DEPLOY_SCENARIO" ]; then
+ echo "Deploy scenario not set!"
+ exit 1
+ fi
- # update / install the new rpm
- if rpm -q opnfv-apex > /dev/null; then
- if [ $(basename $OPNFV_RPM_URL) == $(rpm -q opnfv-apex).rpm ]; then
- echo "RPM is already installed"
- elif sudo yum update -y $RPM_LIST | grep "does not update installed package"; then
- if ! sudo yum downgrade -y $RPM_LIST; then
- sudo yum remove -y opnfv-undercloud opnfv-common
- sudo yum downgrade -y $RPM_INSTALL_PATH
- fi
- fi
+ # use local build for verify
+ if [[ $BUILD_DIRECTORY == *verify* ]]; then
+ if [ ! -e "${WORKSPACE}/build/lib" ]; then ln -s ${WORKSPACE}/lib ${WORKSPACE}/build/lib; fi
+ DEPLOY_CMD="./deploy.sh -c ${WORKSPACE}/build -r ${WORKSPACE}/build/images/"
+ DEPLOY_FILE="${WORKSPACE}/config/deploy/${DEPLOY_SCENARIO}.yaml"
+ NETWORK_FILE="${WORKSPACE}/config/deploy/network/network_settings.yaml"
else
- sudo yum install -y $RPM_LIST;
+ RPM_LIST=$RPM_INSTALL_PATH
+ for pkg in common undercloud opendaylight-sfc; do
+ RPM_LIST+=" ${RPM_INSTALL_PATH/opnfv-apex/opnfv-apex-${pkg}}"
+ done
+
+ # update / install the new rpm
+ if rpm -q opnfv-apex > /dev/null; then
+ if [ $(basename $OPNFV_RPM_URL) == $(rpm -q opnfv-apex).rpm ]; then
+ echo "RPM is already installed"
+ elif sudo yum update -y $RPM_LIST | grep "does not update installed package"; then
+ if ! sudo yum downgrade -y $RPM_LIST; then
+ sudo yum remove -y opnfv-undercloud opnfv-common
+ sudo yum downgrade -y $RPM_INSTALL_PATH
+ fi
+ fi
+ else
+ sudo yum install -y $RPM_LIST;
+ fi
+ DEPLOY_CMD=opnfv-deploy
+ DEPLOY_FILE="/etc/opnfv-apex/${DEPLOY_SCENARIO}.yaml"
+ NETWORK_FILE="/etc/opnfv-apex/network_settings.yaml"
fi
- # cleanup virtual machines before we start
- sudo opnfv-clean
+ if [ "$OPNFV_CLEAN" == 'yes' ]; then
+ sudo ./clean.sh
+ fi
# initiate virtual deployment
- if [ -e /etc/opnfv-apex/network_settings.yaml ]; then
- if [ -n "$DEPLOY_SCENARIO" ]; then
- echo "Deploy Scenario set to ${DEPLOY_SCENARIO}"
- if [ -e /etc/opnfv-apex/${DEPLOY_SCENARIO}.yaml ]; then
- sudo opnfv-deploy -v -d /etc/opnfv-apex/${DEPLOY_SCENARIO}.yaml -n /etc/opnfv-apex/network_settings.yaml --debug
- else
- echo "File does not exist /etc/opnfv-apex/${DEPLOY_SCENARIO}.yaml"
- exit 1
- fi
- else
- echo "Deploy scenario not set!"
- exit 1
- fi
+ echo "Deploy Scenario set to ${DEPLOY_SCENARIO}"
+ if [ -e $DEPLOY_FILE ]; then
+ sudo $DEPLOY_CMD -v -d ${DEPLOY_FILE} -n $NETWORK_FILE --debug
else
- sudo opnfv-deploy -v
+ echo "File does not exist /etc/opnfv-apex/${DEPLOY_SCENARIO}.yaml"
+ exit 1
fi
echo
echo "--------------------------------------------------------"
diff --git a/jjb/functest/functest-ci-jobs.yml b/jjb/functest/functest-ci-jobs.yml
index ba5cfec83..90b5a67d4 100644
--- a/jjb/functest/functest-ci-jobs.yml
+++ b/jjb/functest/functest-ci-jobs.yml
@@ -211,12 +211,10 @@
- shell: |
#!/bin/bash
set +e
- flag=""
- if [ "${PUSH_RESULTS_TO_DB}" == "true" ]; then
- flag="-r"
- fi
+ flags="-s"
+ [[ "$PUSH_RESULTS_TO_DB" == "true" ]] && flags+=" -r"
echo "Functest: run $FUNCTEST_SUITE_NAME"
- cmd="${FUNCTEST_REPO_DIR}/docker/run_tests.sh --test $FUNCTEST_SUITE_NAME ${flag}"
+ cmd="${FUNCTEST_REPO_DIR}/docker/run_tests.sh --test $FUNCTEST_SUITE_NAME ${flags}"
container_id=$(docker ps -a | grep opnfv/functest | awk '{print $1}' | head -1)
docker exec $container_id $cmd
@@ -226,11 +224,9 @@
- shell: |
#!/bin/bash
set +e
- flag=""
- if [ "${PUSH_RESULTS_TO_DB}" == "true" ]; then
- flag="-r"
- fi
- cmd="${FUNCTEST_REPO_DIR}/docker/run_tests.sh ${flag}"
+ flags="-s"
+ [[ "$PUSH_RESULTS_TO_DB" == "true" ]] && flags+=" -r"
+ cmd="${FUNCTEST_REPO_DIR}/docker/run_tests.sh ${flags}"
container_id=$(docker ps -a | grep opnfv/functest | awk '{print $1}' | head -1)
docker exec $container_id $cmd
diff --git a/jjb/joid/joid-ci-jobs.yml b/jjb/joid/joid-ci-jobs.yml
index adf3022b2..685e6fb6c 100644
--- a/jjb/joid/joid-ci-jobs.yml
+++ b/jjb/joid/joid-ci-jobs.yml
@@ -200,7 +200,7 @@
- trigger:
name: 'joid-os-nosdn-nofeature-ha-intel-pod6-master-trigger'
triggers:
- - timed: '0 2 * * *'
+ - timed: '#0 2 * * *'
- trigger:
name: 'joid-os-nosdn-nofeature-ha-orange-pod2-master-trigger'
triggers:
@@ -225,7 +225,7 @@
- trigger:
name: 'joid-os-nosdn-nofeature-ha-orange-pod2-brahmaputra-trigger'
triggers:
- - timed: '0 2 * * *'
+ - timed: ''
- trigger:
name: 'joid-os-nosdn-nofeature-ha-juniper-pod1-brahmaputra-trigger'
triggers:
@@ -244,7 +244,7 @@
- trigger:
name: 'joid-os-odl_l2-nofeature-ha-intel-pod6-master-trigger'
triggers:
- - timed: '0 10 * * *'
+ - timed: '#0 10 * * *'
- trigger:
name: 'joid-os-odl_l2-nofeature-ha-orange-pod2-master-trigger'
triggers:
@@ -270,7 +270,7 @@
- trigger:
name: 'joid-os-odl_l2-nofeature-ha-orange-pod2-brahmaputra-trigger'
triggers:
- - timed: '0 10 * * *'
+ - timed: ''
- trigger:
name: 'joid-os-odl_l2-nofeature-ha-juniper-pod1-brahmaputra-trigger'
triggers:
@@ -288,7 +288,7 @@
- trigger:
name: 'joid-os-onos-nofeature-ha-intel-pod6-master-trigger'
triggers:
- - timed: '0 18 * * *'
+ - timed: '#0 18 * * *'
- trigger:
name: 'joid-os-onos-nofeature-ha-orange-pod2-master-trigger'
triggers:
@@ -314,7 +314,7 @@
- trigger:
name: 'joid-os-onos-nofeature-ha-orange-pod2-brahmaputra-trigger'
triggers:
- - timed: '0 18 * * *'
+ - timed: ''
- trigger:
name: 'joid-os-onos-nofeature-ha-juniper-pod1-brahmaputra-trigger'
triggers:
diff --git a/jjb/opnfv/opnfv-docs.yml b/jjb/opnfv/opnfv-docs.yml
index 652a3d530..f9d6a89bc 100644
--- a/jjb/opnfv/opnfv-docs.yml
+++ b/jjb/opnfv/opnfv-docs.yml
@@ -53,7 +53,7 @@
projects:
- project-compare-type: 'REG_EXP'
#Left out arno projects oscar|octopus|functest|genesis
- project-pattern: 'vswitchperf|apex|availability|bottlenecks|compass4nfv|conductor|copper|doctor|dovetail|dpacc|escalator|fastpathmetrics|fuel|inspector|ipv6|joid|kvmfornfv|lsoapi|moon|movie|multisite|octopus|onosfw|ovsnfv|parser|prediction|promise|qtip|releng|rs|sdnvpn|sfc|vnf_forwarding_graph|enfv|pinpoint|pharos|cperf|functest|genesisreq'
+ project-pattern: 'vswitchperf|apex|availability|bottlenecks|compass4nfv|conductor|copper|doctor|dovetail|dpacc|escalator|fastpathmetrics|fuel|inspector|ipv6|joid|kvmfornfv|lsoapi|moon|movie|multisite|octopus|onosfw|ovsnfv|parser|prediction|promise|qtip|releng|rs|sdnvpn|sfc|vnf_forwarding_graph|enfv|pinpoint|pharos|cperf|functest|genesisreq|models'
branches:
- branch-compare-type: 'ANT'
branch-pattern: '**/{branch}'
@@ -91,7 +91,7 @@
comment-contains-value: 'remerge'
projects:
- project-compare-type: 'REG_EXP'
- project-pattern: 'vswitchperf|apex|availability|bottlenecks|compass4nfv|conductor|copper|doctor|dovetail|dpacc|escalator|fastpathmetrics|fuel|inspector|ipv6|joid|kvmfornfv|lsoapi|moon|movie|multisite|octopus|onosfw|ovsnfv|parser|prediction|promise|qtip|releng|rs|sdnvpn|sfc|vnf_forwarding_graph|enfv|pinpoint|pharos|cperf|functest|genesisreq'
+ project-pattern: 'vswitchperf|apex|availability|bottlenecks|compass4nfv|conductor|copper|doctor|dovetail|dpacc|escalator|fastpathmetrics|fuel|inspector|ipv6|joid|kvmfornfv|lsoapi|moon|movie|multisite|octopus|onosfw|ovsnfv|parser|prediction|promise|qtip|releng|rs|sdnvpn|sfc|vnf_forwarding_graph|enfv|pinpoint|pharos|cperf|functest|genesisreq|models'
branches:
- branch-compare-type: 'ANT'
branch-pattern: '**/{branch}'
diff --git a/utils/jenkins-jnlp-connect.sh b/utils/jenkins-jnlp-connect.sh
index 6fb6827fd..e0c6ff2e0 100755
--- a/utils/jenkins-jnlp-connect.sh
+++ b/utils/jenkins-jnlp-connect.sh
@@ -48,10 +48,14 @@ if [[ $(whoami) != "root" && $(whoami) != "$jenkinsuser" ]]; then
exit 1
fi
-if [[ $distro == Debian || $distro == Ubuntu ]]; then
+if [ -d /etc/monit/conf.d ]; then
monitconfdir="/etc/monit/conf.d/"
-elif [[ $distro == Fedora || $distro == CentOS || $distro == Redhat ]]; then
+elif [ -d /etc/monit.d ]; then
monitconfdir="/etc/monit.d"
+else
+ echo "Could not determine the location of the monit configuration file."
+ echo "Make sure monit is installed."
+ exit 1
fi
#make pid dir
@@ -186,6 +190,5 @@ do
done
connectionstring="java -jar slave.jar -jnlpUrl https://build.opnfv.org/ci/computer/"$slave_name"/slave-agent.jnlp -secret "$slave_secret" -noCertificateCheck "
-distro="$(tr -s ' \011' '\012' < /etc/issue | head -n 1)"
main "$@"
diff --git a/utils/test/result_collection_api/dashboard/functest2Dashboard.py b/utils/test/result_collection_api/dashboard/functest2Dashboard.py
index 3f4e1a2db..a2ed3085c 100644
--- a/utils/test/result_collection_api/dashboard/functest2Dashboard.py
+++ b/utils/test/result_collection_api/dashboard/functest2Dashboard.py
@@ -213,6 +213,25 @@ def format_Tempest_for_dashboard(results):
'data_set': [{'Run': nbTests,
'Failed': nbFailures}]})
+ # Graph 4: (Success rate)=f(time)
+ # ***************************************
+ new_element = []
+ for data in results:
+ try:
+ diff = (int(data['details']['tests']) - int(data['details']['failures']))
+ success_rate = 100*diff/int(data['details']['tests'])
+ except:
+ success_rate = 0
+
+ new_element.append({'x': data['creation_date'],
+ 'y1': success_rate})
+
+ test_data.append({'name': "Tempest success rate",
+ 'info': {'type': "graph",
+ 'xlabel': 'time',
+ 'y1label': 'Success rate'},
+ 'data_set': new_element})
+
return test_data
diff --git a/utils/test/result_collection_api/resources/models.py b/utils/test/result_collection_api/resources/models.py
index 8f7522226..6f9386208 100644
--- a/utils/test/result_collection_api/resources/models.py
+++ b/utils/test/result_collection_api/resources/models.py
@@ -167,6 +167,7 @@ class TestResult:
t.creation_date = str(test_result_dict.get('creation_date'))
t.details = test_result_dict.get('details')
t.version = test_result_dict.get('version')
+ t.installer = test_result_dict.get('installer')
t.build_tag = test_result_dict.get('build_tag')
return t
diff --git a/utils/test/result_collection_api/tools/dashboard/css/opnfv_dashboard_tests.css b/utils/test/result_collection_api/tools/dashboard/css/opnfv_dashboard_tests.css
index c74e26c63..894725bb2 100644
--- a/utils/test/result_collection_api/tools/dashboard/css/opnfv_dashboard_tests.css
+++ b/utils/test/result_collection_api/tools/dashboard/css/opnfv_dashboard_tests.css
@@ -21,7 +21,7 @@ body {
#testcase_selected{
position: relative;
left: 50px;
- font-size: 20px;
+ font-size: 20px;
color: #00ADBB;
}
diff --git a/utils/test/result_collection_api/tools/dashboard/js/opnfv_dashboard_tests.js b/utils/test/result_collection_api/tools/dashboard/js/opnfv_dashboard_tests.js
index 4bb56af79..e5bcca625 100644
--- a/utils/test/result_collection_api/tools/dashboard/js/opnfv_dashboard_tests.js
+++ b/utils/test/result_collection_api/tools/dashboard/js/opnfv_dashboard_tests.js
@@ -176,7 +176,7 @@ function show_installers_pods(active_pod)
html_pods += '<ul class="nav nav-pills">';
for (var i in opnfv_dashboard_installers_pods[opnfv_dashboard_installer])
if (opnfv_dashboard_installers_pods[opnfv_dashboard_installer][i]==active_pod)
- html_pods += '<li class="active"><a href="#" onClick="on_pod_draw_graph(\''+opnfv_dashboard_installers_pods[opnfv_dashboard_installer][i]+'\')">'+opnfv_dashboard_installers_pods_print[opnfv_dashboard_installer][i]+'</a></li>';
+ html_pods += '<li class="active"><a href="#" onClick="on_pod_draw_graph(\''+opnfv_dashboard_installers_pods[opnfv_dashboard_installer][i]+'\')">'+opnfv_dashboard_installers_pods_print[opnfv_dashboard_installer][i]+'</a></li>';
else
html_pods += '<li><a href="#" onClick="on_pod_draw_graph(\''+opnfv_dashboard_installers_pods[opnfv_dashboard_installer][i]+'\')">'+opnfv_dashboard_installers_pods_print[opnfv_dashboard_installer][i]+'</a></li>';
html_pods += '</ul>';
@@ -198,7 +198,7 @@ console.log(div_scenario);
// generate HTML menus and buttons
$( document ).ready(function(){
console.log( "ready!" );
-
+
//show_installers('');
show_testcases();
on_ready_draw_graph();
diff --git a/utils/test/result_collection_api/tools/reporting/default.css b/utils/test/result_collection_api/tools/reporting/default.css
new file mode 100644
index 000000000..0e330e965
--- /dev/null
+++ b/utils/test/result_collection_api/tools/reporting/default.css
@@ -0,0 +1,56 @@
+.panel-header-item {
+ position: relative;
+ display: inline-block;
+ padding-left: 17px;
+ padding-right: 17px;
+}
+
+.panel-pod-name {
+ margin-top: 10px;
+ margin-right: 27px;
+ float:right;
+ padding: 6px;
+}
+
+.panel-default > .panel-heading .badge {
+ background-color: #007e88;
+ position: relative;
+ display: inline-block;
+}
+
+.panel-default > .panel-heading .progress-bar {
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ background-color: #0095a2
+}
+.panel-default > .panel-heading h4 {
+ color: white;
+}
+
+.panel-default > .panel-heading {
+ background-color: #00ADBB;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+
+th{
+ text-align: center;
+}
+
+td{
+ text-align: center;
+}
+
+.tr-danger {
+ background-color: #177870;
+ color: white;
+}
+
+.btn-more {
+ color: white;
+ background-color: #0095a2;
+} \ No newline at end of file
diff --git a/utils/test/result_collection_api/tools/reporting/index-tmpl.html b/utils/test/result_collection_api/tools/reporting/index-tmpl.html
new file mode 100644
index 000000000..4d1c50915
--- /dev/null
+++ b/utils/test/result_collection_api/tools/reporting/index-tmpl.html
@@ -0,0 +1,91 @@
+ <html>
+ <head>
+ <meta charset="utf-8">
+ <!-- Bootstrap core CSS -->
+ <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
+ <link href="default.css" rel="stylesheet">
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+ <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function (){
+ $(".btn-more").click(function() {
+ $(this).hide();
+ $(this).parent().find(".panel-default").show();
+ });
+ })
+ </script>
+ </head>
+ <body>
+ <div class="container">
+ <div class="masthead">
+ <h3 class="text-muted">vIMS status page</h3>
+ <nav>
+ <ul class="nav nav-justified">
+ <li class="active"><a href="#">Home</a></li>
+ <li><a href="index-fuel.html">Fuel</a></li>
+ <li><a href="index-compass.html">Compass</a></li>
+ <li><a href="index-joid.html">JOID</a></li>
+ <li><a href="index-apex.html">APEX</a></li>
+ </ul>
+ </nav>
+ </div>
+<div class="row">
+ <div class="col-md-1"></div>
+ <div class="col-md-10">
+ <div class="page-header">
+ <h2>{{installer}}</h2>
+ </div>
+ {% for scenario_name, results in scenario_results.iteritems() -%}
+ <div class="scenario-part">
+ <div class="page-header">
+ <h3><span class="glyphicon glyphicon-chevron-right"> <b>{{scenario_name}}</b></h3>
+ </div>
+ {% for result in results -%}
+ {% if loop.index > 2 -%}
+ <div class="panel panel-default" hidden>
+ {%- else -%}
+ <div class="panel panel-default">
+ {%- endif %}
+ <div class="panel-heading">
+ <div class="progress-bar" role="progressbar" aria-valuenow="{{result.pr_step_ok}}" aria-valuemin="0" aria-valuemax="100" style="width: {{result.pr_step_ok}}%"></div>
+ <span class="panel-header-item">
+ <h4><b>{{result.creation_date}}</b></h4>
+ </span>
+ <span class="badge panel-pod-name">{{result.pod_name}}</span>
+ </div>
+ <table class="table">
+ <tr>
+ <th width="20%">Step</th>
+ <th width="10%">Status</th>
+ <th width="10%">Duration</th>
+ <th width="60%">Result</th>
+ </tr>
+ {% for step_od_name in step_order -%}
+ {% if step_od_name in result.details.keys() -%}
+ {% set step_result = result.details[step_od_name] -%}
+ {% if step_result.duration != 0 -%}
+ <tr class="tr-ok">
+ <td>{{step_od_name}}</td>
+ <td><span class="glyphicon glyphicon-ok"></td>
+ <td><b>{{step_result.duration_display}}</b></td>
+ <td>{{step_result.result}}</td>
+ </tr>
+ {%- else -%}
+ <tr class="tr-danger">
+ <td>{{step_od_name}}</td>
+ <td><span class="glyphicon glyphicon-remove"></td>
+ <td><b>0s</b></td>
+ <td>{{step_result.result}}</td>
+ </tr>
+ {%- endif %}
+ {%- endif %}
+ {%- endfor %}
+ </table>
+ </div>
+ {%- endfor %}
+ <button type="button" class="btn btn-more">More than two</button>
+ </div>
+ {%- endfor %}
+ </div>
+ <div class="col-md-1"></div>
+</div> \ No newline at end of file
diff --git a/utils/test/result_collection_api/tools/reporting/reporting.py b/utils/test/result_collection_api/tools/reporting/reporting.py
new file mode 100644
index 000000000..246c6250c
--- /dev/null
+++ b/utils/test/result_collection_api/tools/reporting/reporting.py
@@ -0,0 +1,83 @@
+from urllib2 import Request, urlopen, URLError
+import json
+import jinja2
+import os
+
+def sig_test_format(sig_test):
+ nbPassed = 0
+ nbFailures = 0
+ nbSkipped = 0
+ for data_test in sig_test:
+ if data_test['result'] == "Passed":
+ nbPassed+= 1
+ elif data_test['result'] == "Failed":
+ nbFailures += 1
+ elif data_test['result'] == "Skipped":
+ nbSkipped += 1
+ total_sig_test_result = {}
+ total_sig_test_result['passed'] = nbPassed
+ total_sig_test_result['failures'] = nbFailures
+ total_sig_test_result['skipped'] = nbSkipped
+ return total_sig_test_result
+
+installers = ["fuel", "compass", "joid", "apex"]
+step_order = ["initialisation", "orchestrator", "vIMS", "sig_test"]
+
+for installer in installers:
+ request = Request('http://testresults.opnfv.org/testapi/results?case=vIMS&installer=' + installer)
+
+ try:
+ response = urlopen(request)
+ k = response.read()
+ results = json.loads(k)
+ except URLError, e:
+ print 'No kittez. Got an error code:', e
+
+ test_results = results['test_results']
+ test_results.reverse()
+
+ scenario_results = {}
+ for r in test_results:
+ if not r['version'] in scenario_results.keys():
+ scenario_results[r['version']] = []
+ scenario_results[r['version']].append(r)
+
+ for s, s_result in scenario_results.items():
+ scenario_results[s] = s_result[0:5]
+ for result in scenario_results[s]:
+ result["creation_date"] = result["creation_date"].split(".")[0]
+ sig_test = result['details']['sig_test']['result']
+ if not sig_test == "":
+ format_result = sig_test_format(sig_test)
+ if format_result['failures'] > format_result['passed']:
+ result['details']['sig_test']['duration'] = 0
+ result['details']['sig_test']['result'] = format_result
+ nb_step_ok = 0
+ nb_step = len(result['details'])
+
+ for step_name, step_result in result['details'].items():
+ if step_result['duration'] != 0:
+ nb_step_ok += 1
+ m, s = divmod(step_result['duration'], 60)
+ m_display = ""
+ if int(m) != 0:
+ m_display += str(int(m)) + "m "
+ step_result['duration_display'] = m_display + str(int(s)) + "s"
+
+ result['pr_step_ok'] = 0
+ if nb_step != 0:
+ result['pr_step_ok'] = (float(nb_step_ok)/nb_step)*100
+
+
+ templateLoader = jinja2.FileSystemLoader(os.path.dirname(os.path.abspath(__file__)))
+ templateEnv = jinja2.Environment( loader=templateLoader )
+
+ TEMPLATE_FILE = "index-tmpl.html"
+ template = templateEnv.get_template( TEMPLATE_FILE )
+
+ outputText = template.render( scenario_results = scenario_results, step_order = step_order, installer = installer)
+
+ with open("index-" + installer + ".html", "wb") as fh:
+ fh.write(outputText)
+
+