summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jjb-sandbox/releng/releng-sandbox-jobs.yml41
-rwxr-xr-xjjb-sandbox/releng/verify-sandbox-jobs.sh2
-rwxr-xr-xjjb/apex/apex-deploy.sh2
-rwxr-xr-xjjb/apex/apex-upload-artifact.sh4
-rw-r--r--jjb/armband/armband-ci-jobs.yml127
-rwxr-xr-xjjb/armband/armband-deploy.sh4
-rwxr-xr-xjjb/armband/build.sh2
-rw-r--r--jjb/compass4nfv/compass-ci-jobs.yml2
-rw-r--r--jjb/compass4nfv/compass-project-jobs.yml24
-rwxr-xr-xjjb/daisy4nfv/daisy4nfv-build.sh8
-rw-r--r--jjb/daisy4nfv/daisy4nfv-verify-jobs.yml34
-rw-r--r--jjb/dovetail/dovetail-ci-jobs.yml21
-rw-r--r--jjb/dovetail/dovetail-project-jobs.yml35
-rwxr-xr-xjjb/dovetail/dovetail-run.sh6
-rwxr-xr-xjjb/fuel/fuel-build.sh2
-rwxr-xr-xjjb/fuel/fuel-deploy.sh2
-rw-r--r--jjb/functest/functest-ci-jobs.yml8
-rw-r--r--jjb/functest/functest-project-jobs.yml30
-rw-r--r--jjb/infra/bifrost-verify-jobs.yml8
-rw-r--r--jjb/opnfv/opnfv-docs.yml6
-rw-r--r--jjb/opnfv/opnfv-utils.yml1
-rw-r--r--jjb/opnfv/slave-params.yml24
-rw-r--r--jjb/qtip/qtip-ci-jobs.yml10
-rw-r--r--jjb/releng-macros.yaml2
-rw-r--r--jjb/vswitchperf/vswitchperf.yml10
-rw-r--r--jjb/yardstick/yardstick-ci-jobs.yml34
-rwxr-xr-xprototypes/bifrost/scripts/destroy-env.sh2
-rw-r--r--prototypes/puppet-infracloud/deploy_on_baremetal.md57
-rw-r--r--prototypes/puppet-infracloud/hiera/common_baremetal.yaml5
-rw-r--r--prototypes/puppet-infracloud/manifests/site.pp1
-rw-r--r--prototypes/puppet-infracloud/modules/opnfv/manifests/server.pp24
-rw-r--r--utils/installer-adapter/ApexAdapter.py32
-rw-r--r--utils/installer-adapter/CompassAdapter.py32
-rw-r--r--utils/installer-adapter/FuelAdapter.py236
-rw-r--r--utils/installer-adapter/InstallerHandler.py78
-rw-r--r--utils/installer-adapter/JoidAdapter.py32
-rw-r--r--utils/installer-adapter/RelengLogger.py51
-rw-r--r--utils/installer-adapter/SSHUtils.py120
-rw-r--r--utils/installer-adapter/__init__.py (renamed from utils/test/result_collection_api/update/templates/__init__.py)0
-rw-r--r--utils/installer-adapter/example.py22
-rw-r--r--utils/test/dashboard/README.rst0
-rw-r--r--utils/test/dashboard/dashboard/conf/config.py8
-rw-r--r--utils/test/dashboard/dashboard/conf/testcases.py2
-rw-r--r--utils/test/dashboard/dashboard/elastic2kibana/dashboard_assembler.py2
-rw-r--r--utils/test/dashboard/dashboard/elastic2kibana/main.py16
-rw-r--r--utils/test/dashboard/dashboard/elastic2kibana/utility.py2
-rw-r--r--utils/test/dashboard/dashboard/elastic2kibana/visualization_assembler.py2
-rw-r--r--utils/test/dashboard/dashboard/elastic2kibana_main.py4
-rw-r--r--utils/test/dashboard/dashboard/functest/format.py (renamed from utils/test/dashboard/dashboard/mongo2elastic/format.py)18
-rw-r--r--utils/test/dashboard/dashboard/mongo2elastic/main.py22
-rw-r--r--utils/test/dashboard/dashboard/mongo2elastic_main.py4
-rw-r--r--utils/test/dashboard/dashboard/qtip/format.py19
-rw-r--r--utils/test/dashboard/etc/config.ini1
-rwxr-xr-xutils/test/dashboard/install.sh54
-rw-r--r--utils/test/dashboard/setup.cfg43
-rw-r--r--utils/test/dashboard/setup.py8
-rwxr-xr-xutils/test/reporting/functest/reporting-status.py81
-rw-r--r--utils/test/reporting/functest/reportingUtils.py8
-rw-r--r--utils/test/reporting/yardstick/reporting-status.py50
-rw-r--r--utils/test/reporting/yardstick/reportingUtils.py21
-rw-r--r--utils/test/reporting/yardstick/scenarioResult.py7
-rw-r--r--utils/test/reporting/yardstick/template/index-status-tmpl.html63
-rw-r--r--utils/test/testapi/3rd_party/static/.gitignore (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/.gitignore)0
-rw-r--r--utils/test/testapi/3rd_party/static/css/highlight.default.css (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/highlight.default.css)0
-rw-r--r--utils/test/testapi/3rd_party/static/css/hightlight.default.css (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/hightlight.default.css)0
-rw-r--r--utils/test/testapi/3rd_party/static/css/screen.css (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/screen.css)0
-rw-r--r--utils/test/testapi/3rd_party/static/endpoint.html (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/endpoint.html)0
-rw-r--r--utils/test/testapi/3rd_party/static/images/explorer_icons.png (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/explorer_icons.png)bin5763 -> 5763 bytes
-rw-r--r--utils/test/testapi/3rd_party/static/images/logo_small.png (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/logo_small.png)bin770 -> 770 bytes
-rw-r--r--utils/test/testapi/3rd_party/static/images/pet_store_api.png (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/pet_store_api.png)bin824 -> 824 bytes
-rw-r--r--utils/test/testapi/3rd_party/static/images/throbber.gif (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/throbber.gif)bin9257 -> 9257 bytes
-rw-r--r--utils/test/testapi/3rd_party/static/images/wordnik_api.png (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/wordnik_api.png)bin980 -> 980 bytes
-rw-r--r--utils/test/testapi/3rd_party/static/index.html (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/index.html)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/backbone-min.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/backbone-min.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/handlebars-1.0.0.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/handlebars-1.0.0.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/highlight.7.3.pack.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/highlight.7.3.pack.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/jquery-1.8.0.min.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery-1.8.0.min.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/jquery.ba-bbq.min.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.ba-bbq.min.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/jquery.slideto.min.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.slideto.min.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/jquery.wiggle.min.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.wiggle.min.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/shred.bundle.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/shred.bundle.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/shred/content.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/shred/content.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/swagger-oauth.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/swagger-oauth.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/swagger.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/swagger.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/lib/underscore-min.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/underscore-min.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/o2c.html (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/o2c.html)0
-rw-r--r--utils/test/testapi/3rd_party/static/swagger-ui.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/swagger-ui.js)0
-rw-r--r--utils/test/testapi/3rd_party/static/swagger-ui.min.js (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/swagger-ui.min.js)0
-rw-r--r--utils/test/testapi/README.rst (renamed from utils/test/result_collection_api/README.rst)2
-rw-r--r--utils/test/testapi/docker/Dockerfile (renamed from utils/test/result_collection_api/docker/Dockerfile)2
-rwxr-xr-xutils/test/testapi/docker/prepare-env.sh (renamed from utils/test/result_collection_api/docker/prepare-env.sh)0
-rwxr-xr-xutils/test/testapi/docker/start-server.sh (renamed from utils/test/result_collection_api/docker/start-server.sh)0
-rw-r--r--utils/test/testapi/etc/config.ini (renamed from utils/test/result_collection_api/etc/config.ini)0
-rwxr-xr-xutils/test/testapi/install.sh20
-rw-r--r--utils/test/testapi/opnfv_testapi/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/cmd/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/cmd/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/cmd/server.py (renamed from utils/test/result_collection_api/opnfv_testapi/cmd/server.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/common/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/common/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/common/config.py (renamed from utils/test/result_collection_api/opnfv_testapi/common/config.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/common/constants.py (renamed from utils/test/result_collection_api/opnfv_testapi/common/constants.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/handlers.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/handlers.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/models.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/models.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/pod_handlers.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/pod_handlers.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/pod_models.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/pod_models.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/project_handlers.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/project_handlers.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/project_models.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/project_models.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/result_handlers.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/result_handlers.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/result_models.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/result_models.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/testcase_handlers.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/resources/testcase_models.py (renamed from utils/test/result_collection_api/opnfv_testapi/resources/testcase_models.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/router/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/router/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/router/url_mappings.py (renamed from utils/test/result_collection_api/opnfv_testapi/router/url_mappings.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/fake_pymongo.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/test_base.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/test_base.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/test_fake_pymongo.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/test_fake_pymongo.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/test_pod.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/test_pod.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/test_project.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/test_project.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/test_result.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/test_result.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/test_testcase.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/test_testcase.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/unit/test_version.py (renamed from utils/test/result_collection_api/opnfv_testapi/tests/unit/test_version.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tornado_swagger/README.md (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/README.md)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tornado_swagger/__init__.py (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/__init__.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tornado_swagger/handlers.py (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/handlers.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tornado_swagger/settings.py (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/settings.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tornado_swagger/swagger.py (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/swagger.py)0
-rw-r--r--utils/test/testapi/opnfv_testapi/tornado_swagger/views.py (renamed from utils/test/result_collection_api/opnfv_testapi/tornado_swagger/views.py)0
-rw-r--r--utils/test/testapi/requirements.txt (renamed from utils/test/result_collection_api/requirements.txt)0
-rwxr-xr-xutils/test/testapi/run_test.sh (renamed from utils/test/result_collection_api/run_test.sh)0
-rw-r--r--utils/test/testapi/setup.cfg (renamed from utils/test/result_collection_api/setup.cfg)0
-rw-r--r--utils/test/testapi/setup.py (renamed from utils/test/result_collection_api/setup.py)0
-rw-r--r--utils/test/testapi/test-requirements.txt (renamed from utils/test/result_collection_api/test-requirements.txt)0
-rw-r--r--utils/test/testapi/update/README.md (renamed from utils/test/result_collection_api/update/README.md)0
-rw-r--r--utils/test/testapi/update/__init__.py (renamed from utils/test/result_collection_api/update/__init__.py)0
-rwxr-xr-xutils/test/testapi/update/playbook-update.sh (renamed from utils/test/result_collection_api/update/playbook-update.sh)0
-rw-r--r--utils/test/testapi/update/templates/__init__.py0
-rw-r--r--utils/test/testapi/update/templates/backup_mongodb.py (renamed from utils/test/result_collection_api/update/templates/backup_mongodb.py)0
-rw-r--r--utils/test/testapi/update/templates/changes_in_mongodb.py (renamed from utils/test/result_collection_api/update/templates/changes_in_mongodb.py)0
-rw-r--r--utils/test/testapi/update/templates/restore_mongodb.py (renamed from utils/test/result_collection_api/update/templates/restore_mongodb.py)0
-rwxr-xr-xutils/test/testapi/update/templates/rm_images.sh (renamed from utils/test/result_collection_api/update/templates/rm_images.sh)0
-rw-r--r--utils/test/testapi/update/templates/rm_olds.sh (renamed from utils/test/result_collection_api/update/templates/rm_olds.sh)0
-rw-r--r--utils/test/testapi/update/templates/update_mongodb.py (renamed from utils/test/result_collection_api/update/templates/update_mongodb.py)0
-rw-r--r--utils/test/testapi/update/templates/utils.py (renamed from utils/test/result_collection_api/update/templates/utils.py)0
-rw-r--r--utils/test/testapi/update/test.yml (renamed from utils/test/result_collection_api/update/test.yml)0
-rw-r--r--utils/test/testapi/update/update.yml (renamed from utils/test/result_collection_api/update/update.yml)0
-rw-r--r--utils/test/testapi/update/update_api.py (renamed from utils/test/result_collection_api/update/update_api.py)0
148 files changed, 1393 insertions, 207 deletions
diff --git a/jjb-sandbox/releng/releng-sandbox-jobs.yml b/jjb-sandbox/releng/releng-sandbox-jobs.yml
index ee35f4299..aa10a4327 100644
--- a/jjb-sandbox/releng/releng-sandbox-jobs.yml
+++ b/jjb-sandbox/releng/releng-sandbox-jobs.yml
@@ -2,12 +2,13 @@
name: 'releng-sandbox-jobs'
jobs:
- 'releng-deploy-sandbox'
- - 'releng-clear-jenkins-jobs'
project: 'releng'
+ node: 'releng-sandbox'
- job-template:
name: 'releng-deploy-sandbox'
+ node: '{node}'
parameters:
- project-parameter:
@@ -30,6 +31,13 @@
- draft-published-event
- comment-added-contains-event:
comment-contains-value: 'redeploy'
+ custom-url: '$BUILD_URL deploying to $JENKINS_URL'
+ silent-start: true
+ skip-vote:
+ successful: true
+ failed: true
+ unstable: true
+ notbuilt: true
projects:
- project-compare-type: 'ANT'
project-pattern: 'releng'
@@ -39,39 +47,16 @@
file-paths:
- compare-type: ANT
pattern: jjb-sandbox/**
- - compare-type: ANT
- pattern: utils/**
+
+ wrappers: ''
builders:
- shell:
!include-raw-escape: verify-sandbox-jobs.sh
- shell: |
- #! /bin/bash
- jenkins-jobs update -r jjb-sandbox
+ #!/bin/bash
+ jenkins-jobs update --delete-old -r jjb/releng-defaults.yaml:jjb/releng-macros.yaml:jjb/opnfv/installer-params.yml:jjb/opnfv/slave-params.yml:jjb-sandbox
publishers:
- archive-artifacts:
artifacts: 'job_output/*'
-
-- job-template:
- name: 'releng-clear-jenkins-jobs'
-
- parameters:
- - project-parameter:
- project: '{project}'
- - gerrit-parameter:
- branch: 'master'
-
- scm:
- - gerrit-trigger-scm:
- credentials-id: '{ssh-credentials}'
- refspec: ''
- choosing-strategy: 'default'
-
- triggers:
- - timed: '@weekly'
-
- builders:
- - shell: |
- #! /bin/bash
- jenkins-jobs delete -r -p jjb-sandbox -x jjb-sandbox/releng
diff --git a/jjb-sandbox/releng/verify-sandbox-jobs.sh b/jjb-sandbox/releng/verify-sandbox-jobs.sh
index 8f67e742b..599016106 100755
--- a/jjb-sandbox/releng/verify-sandbox-jobs.sh
+++ b/jjb-sandbox/releng/verify-sandbox-jobs.sh
@@ -1,4 +1,4 @@
-#! /bin/bash
+#!/bin/bash
# SPDX-license-identifier: Apache-2.0
##############################################################################
# Copyright (c) 2016 Linux Foundation and others.
diff --git a/jjb/apex/apex-deploy.sh b/jjb/apex/apex-deploy.sh
index 72fa6f6f0..e21387ac6 100755
--- a/jjb/apex/apex-deploy.sh
+++ b/jjb/apex/apex-deploy.sh
@@ -3,7 +3,7 @@ set -o errexit
set -o nounset
set -o pipefail
-APEX_PKGS="common undercloud opendaylight-sfc onos"
+APEX_PKGS="common undercloud onos"
IPV6_FLAG=False
# log info to console
diff --git a/jjb/apex/apex-upload-artifact.sh b/jjb/apex/apex-upload-artifact.sh
index 0dd112bc8..f54e4c55a 100755
--- a/jjb/apex/apex-upload-artifact.sh
+++ b/jjb/apex/apex-upload-artifact.sh
@@ -49,13 +49,13 @@ echo "ISO Upload Complete!"
RPM_INSTALL_PATH=$BUILD_DIRECTORY/noarch
RPM_LIST=$RPM_INSTALL_PATH/$(basename $OPNFV_RPM_URL)
VERSION_EXTENSION=$(echo $(basename $OPNFV_RPM_URL) | sed 's/opnfv-apex-//')
-for pkg in common undercloud opendaylight-sfc onos; do
+for pkg in common undercloud onos; do
RPM_LIST+=" ${RPM_INSTALL_PATH}/opnfv-apex-${pkg}-${VERSION_EXTENSION}"
done
SRPM_INSTALL_PATH=$BUILD_DIRECTORY
SRPM_LIST=$SRPM_INSTALL_PATH/$(basename $OPNFV_SRPM_URL)
VERSION_EXTENSION=$(echo $(basename $OPNFV_SRPM_URL) | sed 's/opnfv-apex-//')
-for pkg in common undercloud opendaylight-sfc onos; do
+for pkg in common undercloud onos; do
SRPM_LIST+=" ${SRPM_INSTALL_PATH}/opnfv-apex-${pkg}-${VERSION_EXTENSION}"
done
}
diff --git a/jjb/armband/armband-ci-jobs.yml b/jjb/armband/armband-ci-jobs.yml
index 024681841..2122959a9 100644
--- a/jjb/armband/armband-ci-jobs.yml
+++ b/jjb/armband/armband-ci-jobs.yml
@@ -50,6 +50,10 @@
slave-label: arm-pod2
installer: fuel
<<: *colorado
+ - arm-pod3:
+ slave-label: arm-pod3
+ installer: fuel
+ <<: *colorado
#--------------------------------
# master
#--------------------------------
@@ -57,6 +61,10 @@
slave-label: arm-pod2
installer: fuel
<<: *master
+ - arm-pod3:
+ slave-label: arm-pod3
+ installer: fuel
+ <<: *master
#--------------------------------
# scenarios
#--------------------------------
@@ -70,10 +78,14 @@
auto-trigger-name: '{installer}-{scenario}-{pod}-{stream}-trigger'
- 'os-odl_l2-bgpvpn-ha':
auto-trigger-name: '{installer}-{scenario}-{pod}-{stream}-trigger'
+ - 'os-odl_l2-sfc-ha':
+ auto-trigger-name: '{installer}-{scenario}-{pod}-{stream}-trigger'
# NOHA scenarios
- 'os-odl_l2-nofeature-noha':
auto-trigger-name: '{installer}-{scenario}-{pod}-{stream}-trigger'
+ - 'os-odl_l2-sfc-noha':
+ auto-trigger-name: '{installer}-{scenario}-{pod}-{stream}-trigger'
jobs:
- '{installer}-{scenario}-{pod}-daily-{stream}'
@@ -228,7 +240,7 @@
- trigger:
name: 'fuel-os-odl_l2-nofeature-ha-armband-baremetal-master-trigger'
triggers:
- - timed: '0 0 * * 1,6'
+ - timed: '0 0 * * 1'
- trigger:
name: 'fuel-os-nosdn-nofeature-ha-armband-baremetal-master-trigger'
triggers:
@@ -236,7 +248,7 @@
- trigger:
name: 'fuel-os-odl_l3-nofeature-ha-armband-baremetal-master-trigger'
triggers:
- - timed: '0 0 * * 3,7'
+ - timed: '0 0 * * 3'
- trigger:
name: 'fuel-os-odl_l2-bgpvpn-ha-armband-baremetal-master-trigger'
triggers:
@@ -245,6 +257,15 @@
name: 'fuel-os-odl_l2-nofeature-noha-armband-baremetal-master-trigger'
triggers:
- timed: '0 0 * * 5'
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-armband-baremetal-master-trigger'
+ triggers:
+ - timed: '0 0 * * 6'
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-armband-baremetal-master-trigger'
+ triggers:
+ - timed: '0 0 * * 7'
+
#----------------------------------------------------------------------
# Enea Armband CI Baremetal Triggers running against colorado branch
#----------------------------------------------------------------------
@@ -268,6 +289,14 @@
name: 'fuel-os-odl_l2-nofeature-noha-armband-baremetal-colorado-trigger'
triggers:
- timed: '0 16 * * 3,5'
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-armband-baremetal-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-armband-baremetal-colorado-trigger'
+ triggers:
+ - timed: ''
#---------------------------------------------------------------
# Enea Armband CI Virtual Triggers running against master branch
#---------------------------------------------------------------
@@ -291,6 +320,14 @@
name: 'fuel-os-odl_l2-nofeature-noha-armband-virtual-master-trigger'
triggers:
- timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-armband-virtual-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-armband-virtual-master-trigger'
+ triggers:
+ - timed: ''
#--------------------------------------------------------------------
# Enea Armband CI Virtual Triggers running against colorado branch
#--------------------------------------------------------------------
@@ -314,6 +351,14 @@
name: 'fuel-os-odl_l2-nofeature-noha-armband-virtual-colorado-trigger'
triggers:
- timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-armband-virtual-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-armband-virtual-colorado-trigger'
+ triggers:
+ - timed: ''
#----------------------------------------------------------
# Enea Armband POD 2 Triggers running against master branch
#----------------------------------------------------------
@@ -337,6 +382,14 @@
name: 'fuel-os-odl_l2-nofeature-noha-arm-pod2-master-trigger'
triggers:
- timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-arm-pod2-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-arm-pod2-master-trigger'
+ triggers:
+ - timed: ''
#---------------------------------------------------------------
# Enea Armband POD 2 Triggers running against colorado branch
#---------------------------------------------------------------
@@ -360,3 +413,73 @@
name: 'fuel-os-odl_l2-nofeature-noha-arm-pod2-colorado-trigger'
triggers:
- timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-arm-pod2-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-arm-pod2-colorado-trigger'
+ triggers:
+ - timed: ''
+#----------------------------------------------------------
+# Enea Armband POD 3 Triggers running against master branch
+#----------------------------------------------------------
+- trigger:
+ name: 'fuel-os-odl_l2-nofeature-ha-arm-pod3-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-nosdn-nofeature-ha-arm-pod3-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l3-nofeature-ha-arm-pod3-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-bgpvpn-ha-arm-pod3-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-nofeature-noha-arm-pod3-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-arm-pod3-master-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-arm-pod3-master-trigger'
+ triggers:
+ - timed: ''
+#---------------------------------------------------------------
+# Enea Armband POD 3 Triggers running against colorado branch
+#---------------------------------------------------------------
+- trigger:
+ name: 'fuel-os-odl_l2-nofeature-ha-arm-pod3-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-nosdn-nofeature-ha-arm-pod3-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l3-nofeature-ha-arm-pod3-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-bgpvpn-ha-arm-pod3-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-nofeature-noha-arm-pod3-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-ha-arm-pod3-colorado-trigger'
+ triggers:
+ - timed: ''
+- trigger:
+ name: 'fuel-os-odl_l2-sfc-noha-arm-pod3-colorado-trigger'
+ triggers:
+ - timed: ''
diff --git a/jjb/armband/armband-deploy.sh b/jjb/armband/armband-deploy.sh
index 4041a6b14..c8e58afa8 100755
--- a/jjb/armband/armband-deploy.sh
+++ b/jjb/armband/armband-deploy.sh
@@ -12,6 +12,8 @@ set -o errexit
set -o nounset
set -o pipefail
+export TERM="vt220"
+
# source the file so we get OPNFV vars
source latest.properties
@@ -47,7 +49,7 @@ mkdir -p $TMPDIR
cd $WORKSPACE
if [[ $LAB_CONFIG_URL =~ ^(git|ssh):// ]]; then
- echo "cloning $LAB_CONFIG_URL"
+ echo "Cloning securedlab repo ${GIT_BRANCH##origin/}"
git clone --quiet --branch ${GIT_BRANCH##origin/} $LAB_CONFIG_URL lab-config
LAB_CONFIG_URL=file://${WORKSPACE}/lab-config
diff --git a/jjb/armband/build.sh b/jjb/armband/build.sh
index 300306f77..a058ca158 100755
--- a/jjb/armband/build.sh
+++ b/jjb/armband/build.sh
@@ -12,6 +12,8 @@ set -o errexit
set -o nounset
set -o pipefail
+export TERM="vt220"
+
echo "Host info: $(hostname) $(hostname -I)"
cd $WORKSPACE
diff --git a/jjb/compass4nfv/compass-ci-jobs.yml b/jjb/compass4nfv/compass-ci-jobs.yml
index da882cdfe..eb9113114 100644
--- a/jjb/compass4nfv/compass-ci-jobs.yml
+++ b/jjb/compass4nfv/compass-ci-jobs.yml
@@ -100,7 +100,7 @@
blocking-jobs:
- 'compass-os-.*?-{pod}-daily-.*?'
- 'compass-os-.*?-baremetal-daily-.*?'
- - 'compass-verify-[^-]*'
+ - 'compass-verify-[^-]*-[^-]*'
block-level: 'NODE'
wrappers:
diff --git a/jjb/compass4nfv/compass-project-jobs.yml b/jjb/compass4nfv/compass-project-jobs.yml
index bede7de46..5ce906482 100644
--- a/jjb/compass4nfv/compass-project-jobs.yml
+++ b/jjb/compass4nfv/compass-project-jobs.yml
@@ -16,19 +16,28 @@
branch: 'stable/{stream}'
gs-pathname: '/{stream}'
+ distro:
+ - 'trusty':
+ disabled: false
+ os-version: 'trusty'
+ openstack-os-version: ''
+ - 'centos7':
+ disabled: false
+ os-version: 'centos7'
+ openstack-os-version: ''
jobs:
- - 'compass-verify-{stream}'
+ - 'compass-verify-{distro}-{stream}'
- 'compass-build-iso-{stream}'
- 'compass-build-ppa-{stream}'
- - 'compass-verify-deploy-{stream}'
+ - 'compass-verify-deploy-{distro}-{stream}'
########################
# job templates
########################
- job-template:
- name: 'compass-verify-{stream}'
+ name: 'compass-verify-{distro}-{stream}'
disabled: false
@@ -47,7 +56,7 @@
- build-blocker:
use-build-blocker: true
blocking-jobs:
- - 'compass-verify-[^-]*'
+ - 'compass-verify-[^-]*-[^-]*'
- 'compass-os-.*?-virtual-daily-.*?'
block-level: 'NODE'
@@ -92,8 +101,11 @@
builders:
- trigger-builds:
- - project: 'compass-verify-deploy-{stream}'
+ - project: 'compass-verify-deploy-{distro}-{stream}'
current-parameters: true
+ predefined-parameters: |
+ COMPASS_OS_VERSION={os-version}
+ COMPASS_OS_VERSION_OPTION={openstack-os-version}
same-node: true
block: true
- trigger-builds:
@@ -109,7 +121,7 @@
unstable-threshold: 'FAILURE'
- job-template:
- name: 'compass-verify-deploy-{stream}'
+ name: 'compass-verify-deploy-{distro}-{stream}'
concurrent: true
diff --git a/jjb/daisy4nfv/daisy4nfv-build.sh b/jjb/daisy4nfv/daisy4nfv-build.sh
index 9eae8481b..ec11db587 100755
--- a/jjb/daisy4nfv/daisy4nfv-build.sh
+++ b/jjb/daisy4nfv/daisy4nfv-build.sh
@@ -4,3 +4,11 @@ echo "--------------------------------------------------------"
echo "This is diasy4nfv build job!"
echo "--------------------------------------------------------"
+# build output directory
+OUTPUT_DIR=$WORKSPACE/build_output
+mkdir -p $OUTPUT_DIR
+
+# start the build
+cd $WORKSPACE
+./ci/build.sh $OUTPUT_DIR
+
diff --git a/jjb/daisy4nfv/daisy4nfv-verify-jobs.yml b/jjb/daisy4nfv/daisy4nfv-verify-jobs.yml
index 6444cf8ec..d2adafdfa 100644
--- a/jjb/daisy4nfv/daisy4nfv-verify-jobs.yml
+++ b/jjb/daisy4nfv/daisy4nfv-verify-jobs.yml
@@ -1,9 +1,7 @@
- project:
name: 'daisy4nfv-verify-jobs'
- project: 'daisy4nfv'
-
- installer: 'daisy4nfv'
+ project: 'daisy'
#####################################
# branch definitions
#####################################
@@ -19,7 +17,7 @@
- 'basic':
slave-label: 'opnfv-build'
- 'build':
- slave-label: 'opnfv-build-ubuntu'
+ slave-label: 'opnfv-build-centos'
- 'deploy-virtual':
slave-label: 'opnfv-build'
- 'smoke-test':
@@ -103,6 +101,11 @@
projects:
- name: 'daisy4nfv-verify-basic-{stream}'
current-parameters: false
+ predefined-parameters: |
+ GERRIT_BRANCH=$GERRIT_BRANCH
+ GERRIT_REFSPEC=$GERRIT_REFSPEC
+ GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
+ GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
node-parameters: false
kill-phase-on: FAILURE
abort-all-job: true
@@ -112,6 +115,11 @@
projects:
- name: 'daisy4nfv-verify-build-{stream}'
current-parameters: false
+ predefined-parameters: |
+ GERRIT_BRANCH=$GERRIT_BRANCH
+ GERRIT_REFSPEC=$GERRIT_REFSPEC
+ GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
+ GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
node-parameters: false
kill-phase-on: FAILURE
abort-all-job: true
@@ -121,6 +129,11 @@
projects:
- name: 'daisy4nfv-verify-deploy-virtual-{stream}'
current-parameters: false
+ predefined-parameters: |
+ GERRIT_BRANCH=$GERRIT_BRANCH
+ GERRIT_REFSPEC=$GERRIT_REFSPEC
+ GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
+ GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
node-parameters: false
kill-phase-on: FAILURE
abort-all-job: true
@@ -130,6 +143,11 @@
projects:
- name: 'daisy4nfv-verify-smoke-test-{stream}'
current-parameters: false
+ predefined-parameters: |
+ GERRIT_BRANCH=$GERRIT_BRANCH
+ GERRIT_REFSPEC=$GERRIT_REFSPEC
+ GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
+ GERRIT_CHANGE_COMMIT_MESSAGE=$GERRIT_CHANGE_COMMIT_MESSAGE
node-parameters: false
kill-phase-on: FAILURE
abort-all-job: true
@@ -184,25 +202,25 @@
# builder macros
#####################################
- builder:
- name: 'daisy4nfv-verify-basic-macro'
+ name: 'daisy-verify-basic-macro'
builders:
- shell:
!include-raw: ./daisy4nfv-basic.sh
- builder:
- name: 'daisy4nfv-verify-build-macro'
+ name: 'daisy-verify-build-macro'
builders:
- shell:
!include-raw: ./daisy4nfv-build.sh
- builder:
- name: 'daisy4nfv-verify-deploy-virtual-macro'
+ name: 'daisy-verify-deploy-virtual-macro'
builders:
- shell:
!include-raw: ./daisy4nfv-virtual-deploy.sh
- builder:
- name: 'daisy4nfv-verify-smoke-test-macro'
+ name: 'daisy-verify-smoke-test-macro'
builders:
- shell: |
#!/bin/bash
diff --git a/jjb/dovetail/dovetail-ci-jobs.yml b/jjb/dovetail/dovetail-ci-jobs.yml
index 1dd1795cb..29212005d 100644
--- a/jjb/dovetail/dovetail-ci-jobs.yml
+++ b/jjb/dovetail/dovetail-ci-jobs.yml
@@ -81,6 +81,27 @@
SUT: compass
auto-trigger-name: 'daily-trigger-disabled'
<<: *colorado
+#apex CI PODs
+ - apex-verify-master:
+ slave-label: '{pod}'
+ SUT: apex
+ auto-trigger-name: 'daily-trigger-disabled'
+ <<: *master
+ - apex-daily-master:
+ slave-label: '{pod}'
+ SUT: apex
+ auto-trigger-name: 'daily-trigger-disabled'
+ <<: *master
+ - apex-verify-colorado:
+ slave-label: '{pod}'
+ SUT: apex
+ auto-trigger-name: 'daily-trigger-disabled'
+ <<: *colorado
+ - apex-daily-colorado:
+ slave-label: '{pod}'
+ SUT: apex
+ auto-trigger-name: 'daily-trigger-disabled'
+ <<: *colorado
#--------------------------------
# None-CI PODs
#--------------------------------
diff --git a/jjb/dovetail/dovetail-project-jobs.yml b/jjb/dovetail/dovetail-project-jobs.yml
index bf0552251..41fd8cdcb 100644
--- a/jjb/dovetail/dovetail-project-jobs.yml
+++ b/jjb/dovetail/dovetail-project-jobs.yml
@@ -57,9 +57,7 @@
- branch-compare-type: 'ANT'
branch-pattern: '**/{branch}'
builders:
- - shell: |
- echo "dovetail: verify job"
- #unittest will be added future
+ - dovetail-unit-tests
- job-template:
name: 'dovetail-merge-{stream}'
@@ -93,6 +91,31 @@
branch-pattern: '**/{branch}'
builders:
- - shell: |
- echo "dovetail: merge"
- #unittest will be added future
+ - dovetail-unit-tests
+
+################################
+#builders for dovetail project
+###############################
+- builder:
+ name: dovetail-unit-tests
+ builders:
+ - shell: |
+ #!/bin/bash
+ set -o errexit
+ set -o pipefail
+
+ echo "Running unit tests..."
+ cd $WORKSPACE
+ virtualenv $WORKSPACE/dovetail_venv
+ source $WORKSPACE/dovetail_venv/bin/activate
+
+ #packages installation
+ easy_install -U setuptools
+ easy_install -U pip
+ pip install -r unittests/requirements.txt
+ pip install -e .
+
+ #unit tests
+ /bin/bash $WORKSPACE/unittests/unittest.sh
+
+ deactivate
diff --git a/jjb/dovetail/dovetail-run.sh b/jjb/dovetail/dovetail-run.sh
index 3f7a47bee..098b7db0c 100755
--- a/jjb/dovetail/dovetail-run.sh
+++ b/jjb/dovetail/dovetail-run.sh
@@ -34,6 +34,10 @@ fi
opts="--privileged=true --rm"
envs="-e CI_DEBUG=${CI_DEBUG} \
+ -e INSTALLER_TYPE=${INSTALLER_TYPE} \
+ -e INSTALLER_IP=${INSTALLER_IP} \
+ -e DEPLOY_SCENARIO=${DEPLOY_SCENARIO} \
+ -e DEPLOY_TYPE=${DEPLOY_TYPE} \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/opnfv/dovetail/results:/home/opnfv/dovetail/results"
@@ -44,7 +48,7 @@ docker pull opnfv/dovetail:$DOCKER_TAG >$redirect
# Run docker
echo "Dovetail: docker running..."
sudo docker run ${opts} ${envs} ${labconfig} ${sshkey} opnfv/dovetail:${DOCKER_TAG} \
-"/home/opnfv/dovetail/scripts/run.py"
+"/home/opnfv/dovetail/dovetail/run.py"
echo "Dovetail: store results..."
sudo cp -r /home/opnfv/dovetail/results ./
diff --git a/jjb/fuel/fuel-build.sh b/jjb/fuel/fuel-build.sh
index 7e36a0c53..c66dc3d8d 100755
--- a/jjb/fuel/fuel-build.sh
+++ b/jjb/fuel/fuel-build.sh
@@ -11,6 +11,8 @@ set -o errexit
set -o nounset
set -o pipefail
+export TERM="vt220"
+
cd $WORKSPACE
# remove the expired items from cache
diff --git a/jjb/fuel/fuel-deploy.sh b/jjb/fuel/fuel-deploy.sh
index ef47ff0e3..48b1dac2f 100755
--- a/jjb/fuel/fuel-deploy.sh
+++ b/jjb/fuel/fuel-deploy.sh
@@ -10,6 +10,8 @@
set -o nounset
set -o pipefail
+export TERM="vt220"
+
# source the file so we get OPNFV vars
source latest.properties
diff --git a/jjb/functest/functest-ci-jobs.yml b/jjb/functest/functest-ci-jobs.yml
index 348779308..afeb1f92e 100644
--- a/jjb/functest/functest-ci-jobs.yml
+++ b/jjb/functest/functest-ci-jobs.yml
@@ -140,6 +140,10 @@
slave-label: '{pod}'
installer: fuel
<<: *master
+ - arm-pod3:
+ slave-label: '{pod}'
+ installer: fuel
+ <<: *master
- zte-pod1:
slave-label: '{pod}'
installer: fuel
@@ -164,6 +168,10 @@
slave-label: '{pod}'
installer: fuel
<<: *colorado
+ - arm-pod3:
+ slave-label: '{pod}'
+ installer: fuel
+ <<: *colorado
# PODs for verify jobs triggered by each patch upload
- ool-virtual1:
slave-label: '{pod}'
diff --git a/jjb/functest/functest-project-jobs.yml b/jjb/functest/functest-project-jobs.yml
index a9845459f..373ed89cd 100644
--- a/jjb/functest/functest-project-jobs.yml
+++ b/jjb/functest/functest-project-jobs.yml
@@ -61,5 +61,33 @@
pattern: 'docs/**|.gitignore'
builders:
+ - functest-unit-tests-and-docs-build
+
+ publishers:
+ - junit:
+ results: nosetests.xml
+ - cobertura:
+ report-file: "coverage.xml"
+ only-stable: "true"
+ health-auto-update: "true"
+ stability-auto-update: "true"
+ zoom-coverage-chart: "true"
+ targets:
+ - files:
+ healthy: 10
+ unhealthy: 20
+ failing: 30
+ - method:
+ healthy: 50
+ unhealthy: 40
+ failing: 30
+
+################################
+# job builders
+################################
+
+- builder:
+ name: functest-unit-tests-and-docs-build
+ builders:
- shell: |
- echo "Nothing to verify!"
+ $WORKSPACE/run_unit_tests.sh
diff --git a/jjb/infra/bifrost-verify-jobs.yml b/jjb/infra/bifrost-verify-jobs.yml
index 17796a832..d15bf7426 100644
--- a/jjb/infra/bifrost-verify-jobs.yml
+++ b/jjb/infra/bifrost-verify-jobs.yml
@@ -123,12 +123,6 @@
triggers:
- gerrit:
server-name: 'review.openstack.org'
- silent-start: true
- skip-vote:
- successful: true
- failed: true
- unstable: true
- notbuilt: true
escape-quotes: true
trigger-on:
- patchset-created-event:
@@ -137,6 +131,8 @@
exclude-no-code-change: 'false'
- comment-added-contains-event:
comment-contains-value: 'recheck'
+ custom-url: '* $JOB_NAME $BUILD_URL'
+ silent-start: true
projects:
- project-compare-type: 'PLAIN'
project-pattern: 'openstack/bifrost'
diff --git a/jjb/opnfv/opnfv-docs.yml b/jjb/opnfv/opnfv-docs.yml
index 0ac8aa7e0..307c1db44 100644
--- a/jjb/opnfv/opnfv-docs.yml
+++ b/jjb/opnfv/opnfv-docs.yml
@@ -85,6 +85,10 @@
name: GS_URL
default: '$GS_BASE{gs-pathname}'
description: "Directory where the build artifact will be located upon the completion of the build."
+ - string:
+ name: GERRIT_REFSPEC
+ default: 'refs/heads/{branch}'
+ description: "JJB configured GERRIT_REFSPEC parameter"
scm:
- gerrit-trigger-scm:
@@ -98,6 +102,8 @@
- change-merged-event
- comment-added-contains-event:
comment-contains-value: 'remerge'
+ - comment-added-contains-event:
+ comment-contains-value: 'rebuild docs'
projects:
- project-compare-type: 'ANT'
project-pattern: '*'
diff --git a/jjb/opnfv/opnfv-utils.yml b/jjb/opnfv/opnfv-utils.yml
index 94a99d451..717bb3cbc 100644
--- a/jjb/opnfv/opnfv-utils.yml
+++ b/jjb/opnfv/opnfv-utils.yml
@@ -19,7 +19,6 @@
name: SLAVE_NAME
description: Slaves to prune docker images
default-slaves:
- - arm-build1
- arm-build2
- ericsson-build4
- ericsson-build5
diff --git a/jjb/opnfv/slave-params.yml b/jjb/opnfv/slave-params.yml
index 4ffaff4ae..b46960fa7 100644
--- a/jjb/opnfv/slave-params.yml
+++ b/jjb/opnfv/slave-params.yml
@@ -162,7 +162,7 @@
description: 'Git URL to use on this Jenkins Slave'
- string:
name: LAB_CONFIG_URL
- default: ssh://git@git.enea.com/pharos/lab-config
+ default: ssh://jenkins-enea@gerrit.opnfv.org:29418/securedlab
description: 'Base URI to the configuration directory'
- parameter:
name: 'joid-baremetal-defaults'
@@ -227,7 +227,7 @@
description: 'Git URL to use on this Jenkins Slave'
- string:
name: LAB_CONFIG_URL
- default: ssh://git@git.enea.com/pharos/lab-config
+ default: ssh://jenkins-enea@gerrit.opnfv.org:29418/securedlab
description: 'Base URI to the configuration directory'
- parameter:
name: 'joid-virtual-defaults'
@@ -608,7 +608,25 @@
description: 'Git URL to use on this Jenkins Slave'
- string:
name: LAB_CONFIG_URL
- default: ssh://git@git.enea.com/pharos/lab-config
+ default: ssh://jenkins-enea@gerrit.opnfv.org:29418/securedlab
+ description: 'Base URI to the configuration directory'
+- parameter:
+ name: 'arm-pod3-defaults'
+ parameters:
+ - node:
+ name: SLAVE_NAME
+ description: 'Slave name on Jenkins'
+ allowed-slaves:
+ - arm-pod3
+ default-slaves:
+ - arm-pod3
+ - string:
+ name: GIT_BASE
+ default: https://gerrit.opnfv.org/gerrit/$PROJECT
+ description: 'Git URL to use on this Jenkins Slave'
+ - string:
+ name: LAB_CONFIG_URL
+ default: ssh://jenkins-enea@gerrit.opnfv.org:29418/securedlab
description: 'Base URI to the configuration directory'
- parameter:
name: 'intel-virtual6-defaults'
diff --git a/jjb/qtip/qtip-ci-jobs.yml b/jjb/qtip/qtip-ci-jobs.yml
index d0d6b47a3..cca8cee4c 100644
--- a/jjb/qtip/qtip-ci-jobs.yml
+++ b/jjb/qtip/qtip-ci-jobs.yml
@@ -40,6 +40,10 @@
installer: fuel
auto-trigger-name: 'qtip-daily-zte-pod2-trigger'
<<: *master
+ - zte-pod3:
+ installer: fuel
+ auto-trigger-name: 'qtip-daily-zte-pod3-trigger'
+ <<: *master
#--------------------------------
jobs:
@@ -120,5 +124,9 @@
- trigger:
name: 'qtip-daily-zte-pod2-trigger'
triggers:
- - timed: '0 5 * * *'
+ - timed: '0 7 * * *'
+- trigger:
+ name: 'qtip-daily-zte-pod3-trigger'
+ triggers:
+ - timed: '0 1 * * *'
diff --git a/jjb/releng-macros.yaml b/jjb/releng-macros.yaml
index d2dc1d1ec..2ebd7757b 100644
--- a/jjb/releng-macros.yaml
+++ b/jjb/releng-macros.yaml
@@ -176,7 +176,7 @@
mkdir -p upload
mv docs_output "$local_path"
- gsutil -m cp -r "$local_path" "gs://$GS_URL"
+ gsutil -m cp -r "$local_path" "gs://$gs_path"
gsutil -m setmeta \
-h "Content-Type:text/html" \
diff --git a/jjb/vswitchperf/vswitchperf.yml b/jjb/vswitchperf/vswitchperf.yml
index 363423de9..3f7f6bf2d 100644
--- a/jjb/vswitchperf/vswitchperf.yml
+++ b/jjb/vswitchperf/vswitchperf.yml
@@ -14,10 +14,12 @@
branch: '{stream}'
gs-pathname: ''
disabled: false
+ slave-label: 'opnfv-build-ubuntu'
- colorado:
branch: 'stable/{stream}'
gs-pathname: '/{stream}'
disabled: false
+ slave-label: 'intel-pod3'
- job-template:
@@ -72,7 +74,7 @@
project: '{project}'
- gerrit-parameter:
branch: '{branch}'
- - 'opnfv-build-ubuntu-defaults'
+ - '{slave-label}-defaults'
scm:
- gerrit-trigger-scm:
@@ -110,6 +112,8 @@
make
# run basic sanity test
make sanity
+ cd ../ci
+ ./build-vsperf.sh verify
- job-template:
name: 'vswitchperf-merge-{stream}'
@@ -132,7 +136,7 @@
project: '{project}'
- gerrit-parameter:
branch: '{branch}'
- - 'opnfv-build-ubuntu-defaults'
+ - '{slave-label}-defaults'
scm:
- gerrit-trigger-scm:
@@ -162,3 +166,5 @@
cd src
make clobber
make
+ cd ../ci
+ ./build-vsperf.sh merge
diff --git a/jjb/yardstick/yardstick-ci-jobs.yml b/jjb/yardstick/yardstick-ci-jobs.yml
index 962ea4743..9d80e42ae 100644
--- a/jjb/yardstick/yardstick-ci-jobs.yml
+++ b/jjb/yardstick/yardstick-ci-jobs.yml
@@ -172,6 +172,16 @@
installer: fuel
auto-trigger-name: 'daily-trigger-disabled'
<<: *colorado
+ - arm-pod3:
+ slave-label: '{pod}'
+ installer: fuel
+ auto-trigger-name: 'daily-trigger-disabled'
+ <<: *master
+ - arm-pod3:
+ slave-label: '{pod}'
+ installer: fuel
+ auto-trigger-name: 'daily-trigger-disabled'
+ <<: *colorado
- orange-pod2:
slave-label: '{pod}'
installer: joid
@@ -305,7 +315,7 @@
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
- parameter:
name: 'yardstick-params-armband-baremetal'
@@ -319,7 +329,7 @@
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
- parameter:
name: 'yardstick-params-joid-baremetal'
@@ -333,14 +343,14 @@
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
- parameter:
name: 'yardstick-params-intel-pod8'
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
- parameter:
name: 'yardstick-params-lf-pod1'
@@ -423,11 +433,19 @@
description: 'Arguments to use in order to choose the backend DB'
- parameter:
+ name: 'yardstick-params-arm-pod3'
+ parameters:
+ - string:
+ name: YARDSTICK_DB_BACKEND
+ default: '-i 104.197.68.199:8086'
+ description: 'Arguments to use in order to choose the backend DB'
+
+- parameter:
name: 'yardstick-params-virtual'
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
- parameter:
@@ -435,7 +453,7 @@
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
- parameter:
@@ -443,7 +461,7 @@
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
- parameter:
@@ -451,7 +469,7 @@
parameters:
- string:
name: YARDSTICK_DB_BACKEND
- default: ''
+ default: '-i 104.197.68.199:8086'
description: 'Arguments to use in order to choose the backend DB'
#######################
diff --git a/prototypes/bifrost/scripts/destroy-env.sh b/prototypes/bifrost/scripts/destroy-env.sh
index 674645777..cdc55df1b 100755
--- a/prototypes/bifrost/scripts/destroy-env.sh
+++ b/prototypes/bifrost/scripts/destroy-env.sh
@@ -46,7 +46,7 @@ fi
rm -rf /var/lib/libvirt/images/*.qcow2
echo "restarting services"
-service dnsmasq restart
+service dnsmasq restart || true
service libvirtd restart
service ironic-api restart
service ironic-conductor start
diff --git a/prototypes/puppet-infracloud/deploy_on_baremetal.md b/prototypes/puppet-infracloud/deploy_on_baremetal.md
new file mode 100644
index 000000000..334dff4d2
--- /dev/null
+++ b/prototypes/puppet-infracloud/deploy_on_baremetal.md
@@ -0,0 +1,57 @@
+How to deploy Infra Cloud on baremetal
+==================================
+
+Install bifrost controller
+--------------------------
+First step for deploying Infra Cloud is to install the bifrost controller. This can be virtualized, doesn't need to be on baremetal.
+To achieve that, first we can create a virtual machine with libvirt, with the proper network setup. This VM needs to share one physical interface (the PXE boot one), with the servers for the controller and compute nodes.
+Please follow documentation on: [https://git.openstack.org/cgit/openstack/bifrost/tree/tools/virsh_dev_env/README.md](https://git.openstack.org/cgit/openstack/bifrost/tree/tools/virsh_dev_env/README.md) to get sample templates and instructions for creating the bifrost VM.
+
+Once the **baremetal** VM is finished, you can login by ssh and start installing bifrost there. To proceed, follow this steps:
+
+ 1. Change to root user, install git
+ 2. Clone releng project (cd /opt, git clone https://gerrit.opnfv.org/gerrit/releng)
+ 3. cd /opt/releng/prototypes/puppet-infracloud
+ 4. Copy hiera to the right folder (cp hiera/common_baremetal.yaml /var/lib/hiera/common.yaml)
+ 5. Ensure hostname is properly set ( hostnamectl set-hostname baremetal.opnfvlocal , hostname -f )
+ 6. Install puppet and modules ( ./install_puppet.sh , ./install_modules.sh )
+ 7. Apply puppet to install bifrost (puppet apply manifests/site.pp --modulepath=/etc/puppet/modules:/opt/releng/prototypes/puppet-infracloud/modules)
+
+ With these steps you will have a bifrost controller up and running.
+
+Deploy baremetal servers
+--------------------------
+Once you have bifrost controller ready, you need to use it to start deployment of the baremetal servers.
+On the same bifrost VM, follow these steps:
+
+ 1. Source bifrost env vars: source /opt/stack/bifrost/env-vars
+ 2. Export baremetal servers inventory: export BIFROST_INVENTORY-SOURCE=/opt/stack/baremetal.json
+ 3. Enroll the servers: ansible-playbook -vvv -i inventory/bifrost_inventory.py enroll-dynamic.yaml -e @/etc/bifrost/bifrost_global_vars
+ 4. Deploy the servers: ansible-playbook -vvv -i inventory/bifrost_inventory.py deploy-dynamic.yaml -e @/etc/bifrost/bifrost_global_vars
+ 5. Wait until they are on **active** state, check it with: ironic node-list
+
+In case of some server needing to be redeployed, you can reset it and redeploy again with:
+
+ 1. ironic node-set-provision-state <name_of_server> deleted
+ 2. Wait and check with ironic node-list until the server is on **available** state
+ 3. Redeploy again: ansible-playbook -vvv -i inventory/bifrost_inventory.py deploy-dynamic.yaml -e @/etc/bifrost/bifrost_global_vars
+
+Deploy baremetal servers
+--------------------------
+Once all the servers are on **active** state, they can be accessed by ssh and InfraCloud manifests can be deployed on them, to properly deploy a controller and a compute.
+On each of those, follow that steps:
+
+ 1. ssh from the bifrost controller to their external ips: ssh root@172.30.13.90
+ 2. cd /opt, clone releng project (git clone https://gerrit.opnfv.org/gerrit/releng)
+ 3. Copy hiera to the right folder ( cp hiera/common_baremetal.yaml /var/lib/hiera/common.yaml)
+ 4. Install modules: ./install_modules.sh
+ 5. Apply puppet: puppet apply manifests/site.pp --modulepath=/etc/puppet/modules:/opt/releng/prototypes/puppet-infracloud/modules
+
+Once this has been done on controller and compute, you will have a working cloud. To start working with it, follow that steps:
+
+ 1. Ensure that controller00.opnfvlocal resolves properly to the external IP (this is already done in the bifrost controller)
+ 2. Copy releng/prototypes/puppet-infracloud/creds/clouds.yaml to $HOME/.config/openstack/clouds.yaml
+ 3. Install python-openstackclient
+ 4. Specify the cloud you want to use: export OS_CLOUD=opnfvlocal
+ 5. Now you can start operating in your cloud with openstack-client: openstack flavor list
+
diff --git a/prototypes/puppet-infracloud/hiera/common_baremetal.yaml b/prototypes/puppet-infracloud/hiera/common_baremetal.yaml
index 5ea00831c..9825ed367 100644
--- a/prototypes/puppet-infracloud/hiera/common_baremetal.yaml
+++ b/prototypes/puppet-infracloud/hiera/common_baremetal.yaml
@@ -115,7 +115,7 @@ default_network_interface: eno3
dhcp_static_mask: 255.255.255.128
dhcp_pool_start: 10.20.0.130
dhcp_pool_end: 10.20.0.254
-network_interface: eno1
+network_interface: eth1
ipv4_nameserver: 8.8.8.8
ipv4_subnet_mask: 255.255.255.0
ipv4_gateway: 172.30.13.1
@@ -131,6 +131,7 @@ ironic_inventory:
ansible_ssh_host: 172.30.13.90
ipv4_gateway: 172.30.13.1
ipv4_interface_mac: 00:1e:67:f9:9b:35
+ ipv4_subnet_mask: 255.255.255.192
name: controller00.opnfvlocal
nics:
- mac: a4:bf:01:01:a9:fc
@@ -151,6 +152,7 @@ ironic_inventory:
ipv4_address: 172.30.13.91
ansible_ssh_host: 172.30.13.91
ipv4_gateway: 172.30.13.1
+ ipv4_interface_mac: 00:1e:67:f6:9b:37
ipv4_subnet_mask: 255.255.255.0
name: compute00.opnfvlocal
nics:
@@ -168,3 +170,4 @@ neutron_subnet_gateway: '172.30.13.1'
neutron_subnet_allocation_pools:
- 'start=172.30.13.100,end=172.30.13.254'
virt_type: 'kvm'
+dib_dev_user_password: devuser
diff --git a/prototypes/puppet-infracloud/manifests/site.pp b/prototypes/puppet-infracloud/manifests/site.pp
index f09bfe2e9..8cbfef8c7 100644
--- a/prototypes/puppet-infracloud/manifests/site.pp
+++ b/prototypes/puppet-infracloud/manifests/site.pp
@@ -96,5 +96,6 @@ node 'baremetal.opnfvlocal', 'lfpod5-jumpserver' {
ipv4_nameserver => hiera('ipv4_nameserver'),
ipv4_subnet_mask => hiera('ipv4_subnet_mask'),
bridge_name => hiera('bridge_name'),
+ dib_dev_user_password => hiera('dib_dev_user_password'),
}
}
diff --git a/prototypes/puppet-infracloud/modules/opnfv/manifests/server.pp b/prototypes/puppet-infracloud/modules/opnfv/manifests/server.pp
index c4bff0962..6b608a7a7 100644
--- a/prototypes/puppet-infracloud/modules/opnfv/manifests/server.pp
+++ b/prototypes/puppet-infracloud/modules/opnfv/manifests/server.pp
@@ -224,6 +224,28 @@ class opnfv::server (
}
}
- # add hosts entries
+ # ensure that we have non-pass sudo, and
+ # not require tty
+ file_line { 'sudo_rule_no_pw':
+ path => '/etc/sudoers',
+ line => '%wheel ALL=(ALL) NOPASSWD: ALL',
+ }
+ file_line { 'sudo_rule_notty':
+ path => '/etc/sudoers',
+ line => 'Defaults requiretty',
+ match => '.*requiretty.*',
+ match_for_absence => true,
+ ensure => absent,
+ multiple => true,
+ }
+
+ # disable selinux in case of RHEL
+ if ($::osfamily == 'RedHat') {
+ class { 'selinux':
+ mode => 'disabled',
+ }
+ }
+
+ # update hosts
create_resources('host', hiera_hash('hosts'))
}
diff --git a/utils/installer-adapter/ApexAdapter.py b/utils/installer-adapter/ApexAdapter.py
new file mode 100644
index 000000000..17a27b10a
--- /dev/null
+++ b/utils/installer-adapter/ApexAdapter.py
@@ -0,0 +1,32 @@
+##############################################################################
+# Copyright (c) 2016 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+class ApexAdapter:
+
+ def __init__(self, installer_ip):
+ self.installer_ip = installer_ip
+
+ def get_deployment_info(self):
+ pass
+
+ def get_nodes(self):
+ pass
+
+ def get_controller_ips(self):
+ pass
+
+ def get_compute_ips(self):
+ pass
+
+ def get_file_from_installer(self, origin, target, options=None):
+ pass
+
+ def get_file_from_controller(self, origin, target, ip=None, options=None):
+ pass
diff --git a/utils/installer-adapter/CompassAdapter.py b/utils/installer-adapter/CompassAdapter.py
new file mode 100644
index 000000000..47cbc646d
--- /dev/null
+++ b/utils/installer-adapter/CompassAdapter.py
@@ -0,0 +1,32 @@
+##############################################################################
+# Copyright (c) 2016 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+class CompassAdapter:
+
+ def __init__(self, installer_ip):
+ self.installer_ip = installer_ip
+
+ def get_deployment_info(self):
+ pass
+
+ def get_nodes(self):
+ pass
+
+ def get_controller_ips(self):
+ pass
+
+ def get_compute_ips(self):
+ pass
+
+ def get_file_from_installer(self, origin, target, options=None):
+ pass
+
+ def get_file_from_controller(self, origin, target, ip=None, options=None):
+ pass
diff --git a/utils/installer-adapter/FuelAdapter.py b/utils/installer-adapter/FuelAdapter.py
new file mode 100644
index 000000000..672fd5175
--- /dev/null
+++ b/utils/installer-adapter/FuelAdapter.py
@@ -0,0 +1,236 @@
+##############################################################################
+# Copyright (c) 2016 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# George Paraskevopoulos (geopar@intracom-telecom.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import SSHUtils as ssh_utils
+import RelengLogger as rl
+
+
+class FuelAdapter:
+
+ def __init__(self, installer_ip, user="root", password="r00tme"):
+ self.installer_ip = installer_ip
+ self.installer_user = user
+ self.installer_password = password
+ self.installer_connection = ssh_utils.get_ssh_client(
+ installer_ip,
+ self.installer_user,
+ password=self.installer_password)
+ self.logger = rl.Logger("Handler").getLogger()
+
+ def runcmd_fuel_installer(self, cmd):
+ _, stdout, stderr = (self
+ .installer_connection
+ .exec_command(cmd))
+ error = stderr.readlines()
+ if len(error) > 0:
+ self.logger.error("error %s" % ''.join(error))
+ return error
+ output = ''.join(stdout.readlines())
+ return output
+
+ def runcmd_fuel_nodes(self):
+ return self.runcmd_fuel_installer('fuel nodes')
+
+ def runcmd_fuel_env(self):
+ return self.runcmd_fuel_installer('fuel env')
+
+ def get_clusters(self):
+ environments = []
+ output = self.runcmd_fuel_env()
+ lines = output.rsplit('\n')
+ if len(lines) < 2:
+ self.logger.infp("No environments found in the deployment.")
+ return None
+ else:
+ fields = lines[0].rsplit(' | ')
+
+ index_id = -1
+ index_status = -1
+ index_name = -1
+ index_release_id = -1
+
+ for i in range(0, len(fields) - 1):
+ if "id" in fields[i]:
+ index_id = i
+ elif "status" in fields[i]:
+ index_status = i
+ elif "name" in fields[i]:
+ index_name = i
+ elif "release_id" in fields[i]:
+ index_release_id = i
+
+ # order env info
+ for i in range(2, len(lines) - 1):
+ fields = lines[i].rsplit(' | ')
+ dict = {"id": fields[index_id].strip(),
+ "status": fields[index_status].strip(),
+ "name": fields[index_name].strip(),
+ "release_id": fields[index_release_id].strip()}
+ environments.append(dict)
+
+ return environments
+
+ def get_nodes(self, options=None):
+ nodes = []
+ output = self.runcmd_fuel_nodes()
+ lines = output.rsplit('\n')
+ if len(lines) < 2:
+ self.logger.info("No nodes found in the deployment.")
+ return None
+ else:
+ # get fields indexes
+ fields = lines[0].rsplit(' | ')
+
+ index_id = -1
+ index_status = -1
+ index_name = -1
+ index_cluster = -1
+ index_ip = -1
+ index_mac = -1
+ index_roles = -1
+ index_online = -1
+
+ for i in range(0, len(fields) - 1):
+ if "id" in fields[i]:
+ index_id = i
+ elif "status" in fields[i]:
+ index_status = i
+ elif "name" in fields[i]:
+ index_name = i
+ elif "cluster" in fields[i]:
+ index_cluster = i
+ elif "ip" in fields[i]:
+ index_ip = i
+ elif "mac" in fields[i]:
+ index_mac = i
+ elif "roles " in fields[i]:
+ index_roles = i
+ elif "online" in fields[i]:
+ index_online = i
+
+ # order nodes info
+ for i in range(2, len(lines) - 1):
+ fields = lines[i].rsplit(' | ')
+ dict = {"id": fields[index_id].strip(),
+ "status": fields[index_status].strip(),
+ "name": fields[index_name].strip(),
+ "cluster": fields[index_cluster].strip(),
+ "ip": fields[index_ip].strip(),
+ "mac": fields[index_mac].strip(),
+ "roles": fields[index_roles].strip(),
+ "online": fields[index_online].strip()}
+ if options and options['cluster']:
+ if fields[index_cluster].strip() == options['cluster']:
+ nodes.append(dict)
+ else:
+ nodes.append(dict)
+
+ return nodes
+
+ def get_controller_ips(self, options):
+ nodes = self.get_nodes(options=options)
+ controllers = []
+ for node in nodes:
+ if "controller" in node["roles"]:
+ controllers.append(node['ip'])
+ return controllers
+
+ def get_compute_ips(self, options=None):
+ nodes = self.get_nodes(options=options)
+ computes = []
+ for node in nodes:
+ if "compute" in node["roles"]:
+ computes.append(node['ip'])
+ return computes
+
+ def get_deployment_info(self):
+ str = "Deployment details:\n"
+ str += "\tInstaller: Fuel\n"
+ str += "\tScenario: Unknown\n"
+ sdn = "None"
+ clusters = self.get_clusters()
+ str += "\tN.Clusters: %s\n" % len(clusters)
+ for cluster in clusters:
+ cluster_dic = {'cluster': cluster['id']}
+ str += "\tCluster info:\n"
+ str += "\t ID: %s\n" % cluster['id']
+ str += "\t NAME: %s\n" % cluster['name']
+ str += "\t STATUS: %s\n" % cluster['status']
+ nodes = self.get_nodes(options=cluster_dic)
+ num_nodes = len(nodes)
+ for node in nodes:
+ if "opendaylight" in node['roles']:
+ sdn = "OpenDaylight"
+ elif "onos" in node['roles']:
+ sdn = "ONOS"
+ num_controllers = len(
+ self.get_controller_ips(options=cluster_dic))
+ num_computes = len(self.get_compute_ips(options=cluster_dic))
+ ha = False
+ if num_controllers > 1:
+ ha = True
+
+ str += "\t HA: %s\n" % ha
+ str += "\t NUM.NODES: %s\n" % num_nodes
+ str += "\t CONTROLLERS: %s\n" % num_controllers
+ str += "\t COMPUTES: %s\n" % num_computes
+ str += "\t SDN CONTR.: %s\n\n" % sdn
+ str += self.runcmd_fuel_nodes()
+ return str
+
+ def get_file_from_installer(self, remote_path, local_path, options=None):
+ self.logger.debug("Fetching %s from %s" %
+ (remote_path, self.installer_ip))
+ get_file_result = ssh_utils.get_file(self.installer_connection,
+ remote_path,
+ local_path)
+ if get_file_result is None:
+ self.logger.error("SFTP failed to retrieve the file.")
+ return 1
+ self.logger.info("%s successfully copied from Fuel to %s" %
+ (remote_path, local_path))
+
+ def get_file_from_controller(self,
+ remote_path,
+ local_path,
+ ip=None,
+ user='root',
+ options=None):
+ if ip is None:
+ controllers = self.get_controller_ips(options=options)
+ if len(controllers) == 0:
+ self.logger.info("No controllers found in the deployment.")
+ return 1
+ else:
+ target_ip = controllers[0]
+ else:
+ target_ip = ip
+
+ installer_jumphost = {
+ 'ip': self.installer_ip,
+ 'username': self.installer_user,
+ 'password': self.installer_password
+ }
+ controller_conn = ssh_utils.get_ssh_client(
+ target_ip,
+ user,
+ jumphost=installer_jumphost)
+
+ self.logger.debug("Fetching %s from %s" %
+ (remote_path, target_ip))
+
+ get_file_result = ssh_utils.get_file(controller_conn,
+ remote_path,
+ local_path)
+ if get_file_result is None:
+ self.logger.error("SFTP failed to retrieve the file.")
+ return 1
+ self.logger.info("%s successfully copied from %s to %s" %
+ (remote_path, target_ip, local_path))
diff --git a/utils/installer-adapter/InstallerHandler.py b/utils/installer-adapter/InstallerHandler.py
new file mode 100644
index 000000000..b81b806ca
--- /dev/null
+++ b/utils/installer-adapter/InstallerHandler.py
@@ -0,0 +1,78 @@
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+from FuelAdapter import FuelAdapter
+from ApexAdapter import ApexAdapter
+from CompassAdapter import CompassAdapter
+from JoidAdapter import JoidAdapter
+
+
+INSTALLERS = ["fuel", "apex", "compass", "joid"]
+
+
+class InstallerHandler:
+
+ def __init__(self,
+ installer,
+ installer_ip,
+ installer_user,
+ installer_pwd=None):
+ self.installer = installer.lower()
+ self.installer_ip = installer_ip
+ self.installer_user = installer_user
+ self.installer_pwd = installer_pwd
+
+ if self.installer == INSTALLERS[0]:
+ self.InstallerAdapter = FuelAdapter(self.installer_ip,
+ self.installer_user,
+ self.installer_pwd)
+ elif self.installer == INSTALLERS[1]:
+ self.InstallerAdapter = ApexAdapter(self.installer_ip)
+ elif self.installer == INSTALLERS[2]:
+ self.InstallerAdapter = CompassAdapter(self.installer_ip)
+ elif self.installer == INSTALLERS[3]:
+ self.InstallerAdapter = JoidAdapter(self.installer_ip)
+ else:
+ print("Installer %s is not valid. "
+ "Please use one of the followings: %s"
+ % (self.installer, INSTALLERS))
+ exit(1)
+
+ def get_deployment_info(self):
+ return self.InstallerAdapter.get_deployment_info()
+
+ def get_nodes(self, options=None):
+ return self.InstallerAdapter.get_nodes(options=options)
+
+ def get_controller_ips(self, options=None):
+ return self.InstallerAdapter.get_controller_ips(options=options)
+
+ def get_compute_ips(self, options=None):
+ return self.InstallerAdapter.get_compute_ips(options=options)
+
+ def get_file_from_installer(self,
+ remote_path,
+ local_path,
+ options=None):
+ return self.InstallerAdapter.get_file_from_installer(remote_path,
+ local_path,
+ options=options)
+
+ def get_file_from_controller(self,
+ remote_path,
+ local_path,
+ ip=None,
+ options=None):
+ return self.InstallerAdapter.get_file_from_controller(remote_path,
+ local_path,
+ ip=ip,
+ options=options)
+
+ def get_all(self):
+ pass
diff --git a/utils/installer-adapter/JoidAdapter.py b/utils/installer-adapter/JoidAdapter.py
new file mode 100644
index 000000000..be8c2ebac
--- /dev/null
+++ b/utils/installer-adapter/JoidAdapter.py
@@ -0,0 +1,32 @@
+##############################################################################
+# Copyright (c) 2016 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+class JoidAdapter:
+
+ def __init__(self, installer_ip):
+ self.installer_ip = installer_ip
+
+ def get_deployment_info(self):
+ pass
+
+ def get_nodes(self):
+ pass
+
+ def get_controller_ips(self):
+ pass
+
+ def get_compute_ips(self):
+ pass
+
+ def get_file_from_installer(self, origin, target, options=None):
+ pass
+
+ def get_file_from_controller(self, origin, target, ip=None, options=None):
+ pass
diff --git a/utils/installer-adapter/RelengLogger.py b/utils/installer-adapter/RelengLogger.py
new file mode 100644
index 000000000..6fa4ef2e2
--- /dev/null
+++ b/utils/installer-adapter/RelengLogger.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+#
+# jose.lausuch@ericsson.com
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Logging levels:
+# Level Numeric value
+# CRITICAL 50
+# ERROR 40
+# WARNING 30
+# INFO 20
+# DEBUG 10
+# NOTSET 0
+#
+# Usage:
+# import RelengLogger as rl
+# logger = fl.Logger("script_name").getLogger()
+# logger.info("message to be shown with - INFO - ")
+# logger.debug("message to be shown with - DEBUG -")
+
+import logging
+
+
+class Logger:
+
+ def __init__(self, logger_name, level="INFO"):
+
+ self.logger = logging.getLogger(logger_name)
+ self.logger.propagate = 0
+ self.logger.setLevel(logging.DEBUG)
+
+ ch = logging.StreamHandler()
+ formatter = logging.Formatter('%(asctime)s - %(name)s - '
+ '%(levelname)s - %(message)s')
+ ch.setFormatter(formatter)
+ if level.lower() == "debug":
+ ch.setLevel(logging.DEBUG)
+ else:
+ ch.setLevel(logging.INFO)
+ self.logger.addHandler(ch)
+
+ hdlr = logging.FileHandler('/tmp/releng.log')
+ hdlr.setFormatter(formatter)
+ hdlr.setLevel(logging.DEBUG)
+ self.logger.addHandler(hdlr)
+
+ def getLogger(self):
+ return self.logger
diff --git a/utils/installer-adapter/SSHUtils.py b/utils/installer-adapter/SSHUtils.py
new file mode 100644
index 000000000..c93888694
--- /dev/null
+++ b/utils/installer-adapter/SSHUtils.py
@@ -0,0 +1,120 @@
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+# Authors: George Paraskevopoulos (geopar@intracom-telecom.com)
+# Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+import paramiko
+import RelengLogger as rl
+import os
+
+logger = rl.Logger('SSHUtils').getLogger()
+
+
+def get_ssh_client(hostname, username, password=None, jumphost=None):
+ client = None
+ try:
+ if jumphost is None:
+ client = paramiko.SSHClient()
+ else:
+ client = JumpHostHopClient()
+ client.configure_jump_host(jumphost['ip'],
+ jumphost['username'],
+ jumphost['password'])
+
+ if client is None:
+ raise Exception('Could not connect to client')
+
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ client.connect(hostname,
+ username=username,
+ password=password)
+ return client
+ except Exception, e:
+ logger.error(e)
+ return None
+
+
+def get_file(ssh_conn, src, dest):
+ try:
+ sftp = ssh_conn.open_sftp()
+ sftp.get(src, dest)
+ return True
+ except Exception, e:
+ logger.error("Error [get_file(ssh_conn, '%s', '%s']: %s" %
+ (src, dest, e))
+ return None
+
+
+def put_file(ssh_conn, src, dest):
+ try:
+ sftp = ssh_conn.open_sftp()
+ sftp.put(src, dest)
+ return True
+ except Exception, e:
+ logger.error("Error [put_file(ssh_conn, '%s', '%s']: %s" %
+ (src, dest, e))
+ return None
+
+
+class JumpHostHopClient(paramiko.SSHClient):
+ '''
+ Connect to a remote server using a jumphost hop
+ '''
+ def __init__(self, *args, **kwargs):
+ self.logger = rl.Logger("JumpHostHopClient").getLogger()
+ self.jumphost_ssh = None
+ self.jumphost_transport = None
+ self.jumphost_channel = None
+ self.jumphost_ip = None
+ self.jumphost_ssh_key = None
+ self.local_ssh_key = os.path.join(os.getcwd(), 'id_rsa')
+ super(JumpHostHopClient, self).__init__(*args, **kwargs)
+
+ def configure_jump_host(self, jh_ip, jh_user, jh_pass,
+ jh_ssh_key='/root/.ssh/id_rsa'):
+ self.jumphost_ip = jh_ip
+ self.jumphost_ssh_key = jh_ssh_key
+ self.jumphost_ssh = paramiko.SSHClient()
+ self.jumphost_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ self.jumphost_ssh.connect(jh_ip,
+ username=jh_user,
+ password=jh_pass)
+ self.jumphost_transport = self.jumphost_ssh.get_transport()
+
+ def connect(self, hostname, port=22, username='root', password=None,
+ pkey=None, key_filename=None, timeout=None, allow_agent=True,
+ look_for_keys=True, compress=False, sock=None, gss_auth=False,
+ gss_kex=False, gss_deleg_creds=True, gss_host=None,
+ banner_timeout=None):
+ try:
+ if self.jumphost_ssh is None:
+ raise Exception('You must configure the jump '
+ 'host before calling connect')
+
+ get_file_res = get_file(self.jumphost_ssh,
+ self.jumphost_ssh_key,
+ self.local_ssh_key)
+ if get_file_res is None:
+ raise Exception('Could\'t fetch SSH key from jump host')
+ jumphost_key = (paramiko.RSAKey
+ .from_private_key_file(self.local_ssh_key))
+
+ self.jumphost_channel = self.jumphost_transport.open_channel(
+ "direct-tcpip",
+ (hostname, 22),
+ (self.jumphost_ip, 22))
+
+ self.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ super(JumpHostHopClient, self).connect(hostname,
+ username=username,
+ pkey=jumphost_key,
+ sock=self.jumphost_channel)
+ os.remove(self.local_ssh_key)
+ except Exception, e:
+ self.logger.error(e)
diff --git a/utils/test/result_collection_api/update/templates/__init__.py b/utils/installer-adapter/__init__.py
index e69de29bb..e69de29bb 100644
--- a/utils/test/result_collection_api/update/templates/__init__.py
+++ b/utils/installer-adapter/__init__.py
diff --git a/utils/installer-adapter/example.py b/utils/installer-adapter/example.py
new file mode 100644
index 000000000..804d79c3d
--- /dev/null
+++ b/utils/installer-adapter/example.py
@@ -0,0 +1,22 @@
+# This is an example of usage of this Tool
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+
+from InstallerHandler import InstallerHandler
+
+fuel_handler = InstallerHandler(installer='fuel',
+ installer_ip='10.20.0.2',
+ installer_user='root',
+ installer_pwd='r00tme')
+print("Nodes in cluster 1:\n%s\n" %
+ fuel_handler.get_nodes(options={'cluster': '1'}))
+print("Nodes in cluster 2:\n%s\n" %
+ fuel_handler.get_nodes(options={'cluster': '2'}))
+print("Nodes:\n%s\n" % fuel_handler.get_nodes())
+print("Controller nodes:\n%s\n" % fuel_handler.get_controller_ips())
+print("Compute nodes:\n%s\n" % fuel_handler.get_compute_ips())
+print("\n%s\n" % fuel_handler.get_deployment_info())
+fuel_handler.get_file_from_installer('/root/deploy/dea.yaml', './dea.yaml')
+fuel_handler.get_file_from_controller(
+ '/etc/neutron/neutron.conf', './neutron.conf')
+fuel_handler.get_file_from_controller(
+ '/root/openrc', './openrc')
diff --git a/utils/test/dashboard/README.rst b/utils/test/dashboard/README.rst
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/utils/test/dashboard/README.rst
diff --git a/utils/test/dashboard/dashboard/conf/config.py b/utils/test/dashboard/dashboard/conf/config.py
index 48fed8894..6114e90a9 100644
--- a/utils/test/dashboard/dashboard/conf/config.py
+++ b/utils/test/dashboard/dashboard/conf/config.py
@@ -1,5 +1,6 @@
#! /usr/bin/env python
+import urlparse
from ConfigParser import SafeConfigParser, NoOptionError
@@ -22,11 +23,12 @@ class APIConfig:
"""
def __init__(self):
- self._default_config_location = "../etc/config.ini"
+ self._default_config_location = "/etc/dashboard/config.ini"
self.es_url = 'http://localhost:9200'
self.es_creds = None
self.kibana_url = None
self.js_path = None
+ self.index_url = None
def _get_str_parameter(self, section, param):
try:
@@ -67,6 +69,8 @@ class APIConfig:
obj.es_creds = obj._get_str_parameter("elastic", "creds")
obj.kibana_url = obj._get_str_parameter("kibana", "url")
obj.js_path = obj._get_str_parameter("kibana", "js_path")
+ index = obj._get_str_parameter("elastic", "index")
+ obj.index_url = urlparse.urljoin(obj.es_url, index)
return obj
@@ -74,7 +78,9 @@ class APIConfig:
return "elastic_url = %s \n" \
"elastic_creds = %s \n" \
"kibana_url = %s \n" \
+ "index_url = %s \n" \
"js_path = %s \n" % (self.es_url,
self.es_creds,
self.kibana_url,
+ self.index_url,
self.js_path)
diff --git a/utils/test/dashboard/dashboard/conf/testcases.py b/utils/test/dashboard/dashboard/conf/testcases.py
index e120987dd..ff801b4c9 100644
--- a/utils/test/dashboard/dashboard/conf/testcases.py
+++ b/utils/test/dashboard/dashboard/conf/testcases.py
@@ -1,7 +1,7 @@
import yaml
-with open('./functest/testcases.yaml') as f:
+with open('/etc/dashboard/testcases.yaml') as f:
testcases_yaml = yaml.safe_load(f)
f.close()
diff --git a/utils/test/dashboard/dashboard/elastic2kibana/dashboard_assembler.py b/utils/test/dashboard/dashboard/elastic2kibana/dashboard_assembler.py
index da7ccfc24..651168bbb 100644
--- a/utils/test/dashboard/dashboard/elastic2kibana/dashboard_assembler.py
+++ b/utils/test/dashboard/dashboard/elastic2kibana/dashboard_assembler.py
@@ -1,7 +1,7 @@
import json
import utility
-from common import elastic_access
+from dashboard.common import elastic_access
class DashboardAssembler(object):
diff --git a/utils/test/dashboard/dashboard/elastic2kibana/main.py b/utils/test/dashboard/dashboard/elastic2kibana/main.py
index 9ee894279..112d2226e 100644
--- a/utils/test/dashboard/dashboard/elastic2kibana/main.py
+++ b/utils/test/dashboard/dashboard/elastic2kibana/main.py
@@ -1,13 +1,12 @@
#! /usr/bin/env python
import json
-import urlparse
import argparse
-from common import elastic_access
-from common import logger_utils
-from conf import config
-from conf import testcases
+from dashboard.common import elastic_access
+from dashboard.common import logger_utils
+from dashboard.conf import config
+from dashboard.conf import testcases
from dashboard_assembler import DashboardAssembler
from visualization_assembler import VisualizationAssembler
@@ -131,10 +130,9 @@ class KibanaConstructor(object):
}
})
- elastic_data = elastic_access.get_docs(
- urlparse.urljoin(CONF.es_url, '/test_results/mongo2elastic'),
- CONF.es_creds,
- query)
+ elastic_data = elastic_access.get_docs(CONF.index_url,
+ CONF.es_creds,
+ query)
pods_and_scenarios = {}
diff --git a/utils/test/dashboard/dashboard/elastic2kibana/utility.py b/utils/test/dashboard/dashboard/elastic2kibana/utility.py
index dccd28aed..55578bd8c 100644
--- a/utils/test/dashboard/dashboard/elastic2kibana/utility.py
+++ b/utils/test/dashboard/dashboard/elastic2kibana/utility.py
@@ -2,7 +2,7 @@ import json
from jinja2 import Environment, PackageLoader
-env = Environment(loader=PackageLoader('elastic2kibana', 'templates'))
+env = Environment(loader=PackageLoader('dashboard', 'elastic2kibana/templates'))
env.filters['jsonify'] = json.dumps
diff --git a/utils/test/dashboard/dashboard/elastic2kibana/visualization_assembler.py b/utils/test/dashboard/dashboard/elastic2kibana/visualization_assembler.py
index 1cb0ba8d1..d7e6e543a 100644
--- a/utils/test/dashboard/dashboard/elastic2kibana/visualization_assembler.py
+++ b/utils/test/dashboard/dashboard/elastic2kibana/visualization_assembler.py
@@ -1,7 +1,7 @@
import json
import utility
-from common import elastic_access
+from dashboard.common import elastic_access
class VisStateBuilder(object):
diff --git a/utils/test/dashboard/dashboard/elastic2kibana_main.py b/utils/test/dashboard/dashboard/elastic2kibana_main.py
deleted file mode 100644
index 3ec27cb40..000000000
--- a/utils/test/dashboard/dashboard/elastic2kibana_main.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from elastic2kibana.main import main
-
-if __name__ == '__main__':
- main()
diff --git a/utils/test/dashboard/dashboard/mongo2elastic/format.py b/utils/test/dashboard/dashboard/functest/format.py
index 0bbde1746..ef485bae0 100644
--- a/utils/test/dashboard/dashboard/mongo2elastic/format.py
+++ b/utils/test/dashboard/dashboard/functest/format.py
@@ -184,21 +184,3 @@ def format_vims(testcase):
}
}
return True
-
-
-def format_qpi(testcase):
- """
- Look for these and leave any of those:
- details.index
-
- If none are present, then return False
- """
- details = testcase['details']
- if 'index' not in details:
- return False
-
- for key, value in details.items():
- if key != 'index':
- del details[key]
-
- return True
diff --git a/utils/test/dashboard/dashboard/mongo2elastic/main.py b/utils/test/dashboard/dashboard/mongo2elastic/main.py
index 303d82c6f..688f55f7d 100644
--- a/utils/test/dashboard/dashboard/mongo2elastic/main.py
+++ b/utils/test/dashboard/dashboard/mongo2elastic/main.py
@@ -5,15 +5,15 @@ import json
import os
import subprocess
import traceback
-import urlparse
import uuid
import argparse
-from common import logger_utils, elastic_access
-from conf import testcases
-from conf.config import APIConfig
-from mongo2elastic import format
+from dashboard.common import elastic_access
+from dashboard.common import logger_utils
+from dashboard.conf import testcases
+from dashboard.conf.config import APIConfig
+from dashboard.mongo2elastic import format
logger = logger_utils.DashboardLogger('mongo2elastic').get
@@ -187,7 +187,7 @@ class DocumentsPublisher(object):
self._remove()
exit(-1)
- def get_existed_docs(self):
+ def get_exists(self):
if self.days == 0:
body = '''{{
"query": {{
@@ -241,10 +241,6 @@ class DocumentsPublisher(object):
def main():
- base_elastic_url = urlparse.urljoin(CONF.es_url, '/test_results/mongo2elastic')
- days = args.latest_days
- es_creds = CONF.es_creds
-
for project, case_dicts in testcases.testcases_yaml.items():
for case_dict in case_dicts:
case = case_dict.get('name')
@@ -252,6 +248,6 @@ def main():
DocumentsPublisher(project,
case,
fmt,
- days,
- base_elastic_url,
- es_creds).export().get_existed_docs().publish()
+ args.latest_days,
+ CONF.index_url,
+ CONF.es_creds).export().get_exists().publish()
diff --git a/utils/test/dashboard/dashboard/mongo2elastic_main.py b/utils/test/dashboard/dashboard/mongo2elastic_main.py
deleted file mode 100644
index 141d8f3ab..000000000
--- a/utils/test/dashboard/dashboard/mongo2elastic_main.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from mongo2elastic.main import main
-
-if __name__ == '__main__':
- main()
diff --git a/utils/test/dashboard/dashboard/qtip/format.py b/utils/test/dashboard/dashboard/qtip/format.py
new file mode 100644
index 000000000..b78fa5b9b
--- /dev/null
+++ b/utils/test/dashboard/dashboard/qtip/format.py
@@ -0,0 +1,19 @@
+#! /usr/bin/env python
+
+
+def format_qpi(testcase):
+ """
+ Look for these and leave any of those:
+ details.index
+
+ If none are present, then return False
+ """
+ details = testcase['details']
+ if 'index' not in details:
+ return False
+
+ for key, value in details.items():
+ if key != 'index':
+ del details[key]
+
+ return True
diff --git a/utils/test/dashboard/etc/config.ini b/utils/test/dashboard/etc/config.ini
index d9327981e..77adc1687 100644
--- a/utils/test/dashboard/etc/config.ini
+++ b/utils/test/dashboard/etc/config.ini
@@ -2,6 +2,7 @@
# the CONF object in config.ini must be updated
[elastic]
url = http://localhost:9200
+index = testapi/results
creds =
[kibana]
diff --git a/utils/test/dashboard/install.sh b/utils/test/dashboard/install.sh
new file mode 100755
index 000000000..9fd60d916
--- /dev/null
+++ b/utils/test/dashboard/install.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+usage="
+Script to install dashboard automatically.
+This script should be run under root.
+
+usage:
+ bash $(basename "$0") [-h|--help] [-t <test_name>]
+
+where:
+ -h|--help show this help text
+ -p|--project project dashboard
+ <project_name>"
+
+# Parse parameters
+while [[ $# > 0 ]]
+ do
+ key="$1"
+ case $key in
+ -h|--help)
+ echo "$usage"
+ exit 0
+ shift
+ ;;
+ -p|--project)
+ PROJECT="$2"
+ shift
+ ;;
+ *)
+ echo "unknown option $1 $2"
+ exit 1
+ ;;
+ esac
+ shift # past argument or value
+done
+
+if [[ $(whoami) != "root" ]]; then
+ echo "Error: This script must be run as root!"
+ exit 1
+fi
+
+if [ -z ${PROJECT+x} ]; then
+ echo "project must be specified"
+ exit 1
+fi
+
+if [ $PROJECT != "functest" ] && [ $PROJECT != "qtip" ];then
+ echo "unsupported project $PROJECT"
+ exit 1
+fi
+
+cp -f dashboard/$PROJECT/format.py dashboard/mongo2elastic
+cp -f dashboard/$PROJECT/testcases.yaml etc/
+python setup.py install
diff --git a/utils/test/dashboard/setup.cfg b/utils/test/dashboard/setup.cfg
new file mode 100644
index 000000000..dd0135861
--- /dev/null
+++ b/utils/test/dashboard/setup.cfg
@@ -0,0 +1,43 @@
+[metadata]
+name = dashboard
+summary = Test Result Collector
+description-file =
+ README.rst
+author = SerenaFeng
+author-email = feng.xiaowei@zte.com.cn
+#home-page = http://www.opnfv.org/
+classifier =
+ Environment :: opnfv
+ Intended Audience :: Information Technology
+ Intended Audience :: System Administrators
+ License :: OSI Approved :: Apache Software License
+ Operating System :: POSIX :: Linux
+ Programming Language :: Python
+ Programming Language :: Python :: 2
+ Programming Language :: Python :: 2.7
+
+[global]
+setup-hooks =
+ pbr.hooks.setup_hook
+
+[files]
+packages =
+ dashboard
+package_data =
+ dashboard =
+ elastic2kibana/templates/*.*
+data_files =
+ /etc/dashboard =
+ etc/config.ini
+ etc/testcases.yaml
+
+[entry_points]
+console_scripts =
+ dashboard_mongo2elastic = dashboard.mongo2elastic.main:main
+ dashboard_elastic2kibana = dashboard.elastic2kibana.main:main
+
+[egg_info]
+tag_build =
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/utils/test/dashboard/setup.py b/utils/test/dashboard/setup.py
new file mode 100644
index 000000000..59637a509
--- /dev/null
+++ b/utils/test/dashboard/setup.py
@@ -0,0 +1,8 @@
+import setuptools
+
+__author__ = 'serena'
+
+
+setuptools.setup(
+ setup_requires=['pbr>=1.8'],
+ pbr=True)
diff --git a/utils/test/reporting/functest/reporting-status.py b/utils/test/reporting/functest/reporting-status.py
index b527b7861..653448eaf 100755
--- a/utils/test/reporting/functest/reporting-status.py
+++ b/utils/test/reporting/functest/reporting-status.py
@@ -82,6 +82,10 @@ for version in conf.versions:
items = {}
scenario_result_criteria = {}
+ scenario_file_name = (conf.REPORTING_PATH +
+ "/functest/release/" + version +
+ "/scenario_history.txt")
+
# For all the scenarios get results
for s, s_result in scenario_results.items():
logger.info("---------------------------------")
@@ -185,11 +189,8 @@ for version in conf.versions:
scenario_criteria = conf.MAX_SCENARIO_CRITERIA
s_score = str(scenario_score) + "/" + str(scenario_criteria)
- s_score_percent = 0.0
- try:
- s_score_percent = float(scenario_score) / float(scenario_criteria) * 100
- except:
- logger.error("cannot calculate the score percent")
+ s_score_percent = utils.getScenarioPercent(scenario_score,
+ scenario_criteria)
s_status = "KO"
if scenario_score < scenario_criteria:
@@ -209,10 +210,7 @@ for version in conf.versions:
f.write(info)
# Save daily results in a file
- path_validation_file = (conf.REPORTING_PATH +
- "/functest/release/" + version +
- "/scenario_history.txt")
- with open(path_validation_file, "a") as f:
+ with open(scenario_file_name, "a") as f:
info = (reportingDate + "," + s + "," + installer +
"," + s_score + "," +
str(round(s_score_percent)) + "\n")
@@ -239,34 +237,39 @@ for version in conf.versions:
version=version,
date=reportingDate)
- with open(conf.REPORTING_PATH + "/functest/release/" + version +
- "/index-status-" + installer + ".html", "wb") as fh:
- fh.write(outputText)
+ # csv
+ # generate sub files based on scenario_history.txt
+ scenario_installer_file_name = (conf.REPORTING_PATH +
+ "/functest/release/" + version +
+ "/scenario_history_" + installer +
+ ".txt")
+ scenario_installer_file = open(scenario_installer_file_name, "a")
+ logger.info("Generate CSV...")
+ with open(scenario_file_name, "r") as f:
+ for line in f:
+ if installer in line:
+ logger.debug("Add new line... %s" % line)
+ scenario_installer_file.write(line)
+ scenario_installer_file.close
+
+ with open(conf.REPORTING_PATH + "/functest/release/" + version +
+ "/index-status-" + installer + ".html", "wb") as fh:
+ fh.write(outputText)
+ logger.info("CSV generated...")
- # Generate outputs for export
- # pdf
- try:
- pdf_path = ("http://testresults.opnfv.org/reporting/" +
- "functest/release/" + version +
- "/index-status-" + installer + ".html")
- pdf_doc_name = (conf.REPORTING_PATH +
- "/functest/release/" + version +
- "/status-" + installer + ".pdf")
- pdfkit.from_url(pdf_path, pdf_doc_name)
- except IOError:
- logger.info("pdf generated anyway...")
- except:
- logger.error("impossible to generate PDF")
- # csv
- # generate sub files based on scenario_history.txt
- scenario_installer_file_name = (conf.REPORTING_PATH +
- "/functest/release/" + version +
- "/scenario_history_" +
- installer + ".txt")
- scenario_installer_file = open(scenario_installer_file_name, "w")
-
- with open(path_validation_file, "r") as f:
- for line in f:
- if installer in line:
- scenario_installer_file.write(line)
- scenario_installer_file.close
+ # Generate outputs for export
+ # pdf
+ logger.info("Generate PDF...")
+ try:
+ pdf_path = ("http://testresults.opnfv.org/reporting/" +
+ "functest/release/" + version +
+ "/index-status-" + installer + ".html")
+ pdf_doc_name = (conf.REPORTING_PATH +
+ "/functest/release/" + version +
+ "/status-" + installer + ".pdf")
+ pdfkit.from_url(pdf_path, pdf_doc_name)
+ logger.info("PDF generated...")
+ except IOError:
+ logger.info("pdf generated anyway...")
+ except:
+ logger.error("impossible to generate PDF")
diff --git a/utils/test/reporting/functest/reportingUtils.py b/utils/test/reporting/functest/reportingUtils.py
index 9ba02e821..74d6f19c9 100644
--- a/utils/test/reporting/functest/reportingUtils.py
+++ b/utils/test/reporting/functest/reportingUtils.py
@@ -176,3 +176,11 @@ def getJenkinsUrl(build_tag):
print 'Impossible to get jenkins url:'
return jenkins_url
+
+def getScenarioPercent(scenario_score,scenario_criteria):
+ score = 0.0
+ try:
+ score = float(scenario_score) / float(scenario_criteria) * 100
+ except:
+ print 'Impossible to calculate the percentage score'
+ return score
diff --git a/utils/test/reporting/yardstick/reporting-status.py b/utils/test/reporting/yardstick/reporting-status.py
index 60f1523bb..49809e9d8 100644
--- a/utils/test/reporting/yardstick/reporting-status.py
+++ b/utils/test/reporting/yardstick/reporting-status.py
@@ -8,10 +8,7 @@
#
import datetime
import jinja2
-import requests
-import sys
-import time
-import yaml
+import os
import reportingUtils as utils
import reportingConf as conf
@@ -20,6 +17,7 @@ from scenarios import config as cf
# Logger
logger = utils.getLogger("Yardstick-Status")
+reportingDate = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
logger.info("*******************************************")
logger.info("* Generating reporting scenario status *")
@@ -35,21 +33,23 @@ for version in conf.versions:
# get scenarios results data
scenario_results = utils.getScenarioStatus(installer, version)
if 'colorado' == version:
- stable_result = utils.getScenarioStatus(installer, 'stable/colorado')
- for k,v in stable_result.items():
- if not scenario_results.has_key(k):
+ stable_result = utils.getScenarioStatus(installer,
+ 'stable/colorado')
+ for k, v in stable_result.items():
+ if k not in scenario_results.keys():
scenario_results[k] = []
scenario_results[k] += stable_result[k]
scenario_result_criteria = {}
for s in scenario_results.keys():
- if cf.has_key(installer) and cf[installer].has_key(s):
+ if installer in cf.keys() and s in cf[installer].keys():
scenario_results.pop(s)
# From each scenarios get results list
for s, s_result in scenario_results.items():
logger.info("---------------------------------")
- logger.info("installer %s, version %s, scenario %s:" % (installer, version, s))
+ logger.info("installer %s, version %s, scenario %s:" % (installer,
+ version, s))
ten_criteria = len(s_result)
ten_score = 0
@@ -62,15 +62,38 @@ for version in conf.versions:
for v in four_result:
four_score += v
- s_status = str(utils.get_status(four_result, s_result))
+ s_status = str(utils.get_percent(four_result, s_result))
s_four_score = str(four_score) + '/' + str(four_criteria)
s_ten_score = str(ten_score) + '/' + str(ten_criteria)
- scenario_result_criteria[s] = sr.ScenarioResult(s_status, s_four_score, s_ten_score)
+ s_score_percent = utils.get_percent(four_result, s_result)
if '100' == s_status:
logger.info(">>>>> scenario OK, save the information")
else:
- logger.info(">>>> scenario not OK, last 4 iterations = %s, last 10 days = %s" % (s_four_score, s_ten_score))
+ logger.info(">>>> scenario not OK, last 4 iterations = %s, \
+ last 10 days = %s" % (s_four_score, s_ten_score))
+
+ # Save daily results in a file
+ path_validation_file = (conf.REPORTING_PATH +
+ "/release/" + version +
+ "/scenario_history.txt")
+
+ if not os.path.exists(path_validation_file):
+ with open(path_validation_file, 'w') as f:
+ info = 'date,scenario,installer,details,score\n'
+ f.write(info)
+
+ with open(path_validation_file, "a") as f:
+ info = (reportingDate + "," + s + "," + installer +
+ "," + s_ten_score + "," +
+ str(s_score_percent) + "\n")
+ f.write(info)
+
+ scenario_result_criteria[s] = sr.ScenarioResult(s_status,
+ s_four_score,
+ s_ten_score,
+ s_score_percent)
+
logger.info("--------------------------")
templateLoader = jinja2.FileSystemLoader(conf.REPORTING_PATH)
@@ -82,7 +105,8 @@ for version in conf.versions:
outputText = template.render(scenario_results=scenario_result_criteria,
installer=installer,
period=conf.PERIOD,
- version=version)
+ version=version,
+ date=reportingDate)
with open(conf.REPORTING_PATH + "/release/" + version +
"/index-status-" + installer + ".html", "wb") as fh:
diff --git a/utils/test/reporting/yardstick/reportingUtils.py b/utils/test/reporting/yardstick/reportingUtils.py
index 71eb9196c..ec9ed76dc 100644
--- a/utils/test/reporting/yardstick/reportingUtils.py
+++ b/utils/test/reporting/yardstick/reportingUtils.py
@@ -32,7 +32,7 @@ def getLogger(module):
def getScenarioStatus(installer, version):
url = (conf.URL_BASE + "?case=" + "scenario_status" +
"&installer=" + installer +
- "&version=" + version +"&period=" + str(conf.PERIOD))
+ "&version=" + version + "&period=" + str(conf.PERIOD))
request = Request(url)
try:
@@ -53,7 +53,7 @@ def getScenarioStatus(installer, version):
scenario_results[r['scenario']] = []
scenario_results[r['scenario']].append(r)
- for k,v in scenario_results.items():
+ for k, v in scenario_results.items():
# scenario_results[k] = v[:conf.LASTEST_TESTS]
s_list = []
for element in v:
@@ -66,20 +66,25 @@ def getScenarioStatus(installer, version):
# return scenario_results
return result_dict
+
def subfind(given_list, pattern_list):
+
for i in range(len(given_list)):
- if given_list[i] == pattern_list[0] and given_list[i:i + conf.LASTEST_TESTS] == pattern_list:
+ if given_list[i] == pattern_list[0] and \
+ given_list[i:i + conf.LASTEST_TESTS] == pattern_list:
return True
return False
-def get_percent(status):
-
+
+def _get_percent(status):
+
if status * 100 % 6:
return round(float(status) * 100 / 6, 1)
else:
return status * 100 / 6
-def get_status(four_list, ten_list):
+
+def get_percent(four_list, ten_list):
four_score = 0
ten_score = 0
@@ -97,13 +102,13 @@ def get_status(four_list, ten_list):
else:
status = four_score + 1
- return get_percent(status)
+ return _get_percent(status)
def _test():
status = getScenarioStatus("compass", "master")
print "status:++++++++++++++++++++++++"
- print json.dumps(status,indent=4)
+ print json.dumps(status, indent=4)
if __name__ == '__main__': # pragma: no cover
diff --git a/utils/test/reporting/yardstick/scenarioResult.py b/utils/test/reporting/yardstick/scenarioResult.py
index 61ffb2ce7..1f7eb2b24 100644
--- a/utils/test/reporting/yardstick/scenarioResult.py
+++ b/utils/test/reporting/yardstick/scenarioResult.py
@@ -9,10 +9,12 @@
class ScenarioResult(object):
- def __init__(self, status, four_days_score='', ten_days_score=''):
+ def __init__(self, status, four_days_score='', ten_days_score='',
+ score_percent=0.0):
self.status = status
self.four_days_score = four_days_score
self.ten_days_score = ten_days_score
+ self.score_percent = score_percent
def getStatus(self):
return self.status
@@ -22,3 +24,6 @@ class ScenarioResult(object):
def getFourDaysScore(self):
return self.four_days_score
+
+ def getScorePercent(self):
+ return self.score_percent
diff --git a/utils/test/reporting/yardstick/template/index-status-tmpl.html b/utils/test/reporting/yardstick/template/index-status-tmpl.html
index 602ce8a74..5a4dc347c 100644
--- a/utils/test/reporting/yardstick/template/index-status-tmpl.html
+++ b/utils/test/reporting/yardstick/template/index-status-tmpl.html
@@ -3,9 +3,56 @@
<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">
+ <link href="../../../css/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" src="http://d3js.org/d3.v2.min.js"></script>
+ <script type="text/javascript" src="../../../js/gauge.js"></script>
+ <script type="text/javascript" src="../../../js/trend.js"></script>
+ <script>
+ function onDocumentReady() {
+ // Gauge management
+ {% for scenario in scenario_results.keys() -%}
+ var gaugeScenario{{loop.index}} = gauge('#gaugeScenario{{loop.index}}');
+ {%- endfor %}
+ // assign success rate to the gauge
+ function updateReadings() {
+ {% for scenario in scenario_results.keys() -%}
+ gaugeScenario{{loop.index}}.update({{scenario_results[scenario].getScorePercent()}});
+ {%- endfor %}
+ }
+ updateReadings();
+ }
+
+ // trend line management
+ //d3.csv("./scenario_history.txt", function(data) {
+ d3.csv("./scenario_history.txt", function(data) {
+ // ***************************************
+ // Create the trend line
+ {% for scenario in scenario_results.keys() -%}
+ // for scenario {{scenario}}
+ // Filter results
+ var trend{{loop.index}} = data.filter(function(row) {
+ return row["scenario"]=="{{scenario}}" && row["installer"]=="{{installer}}";
+ })
+ // Parse the date
+ trend{{loop.index}}.forEach(function(d) {
+ d.date = parseDate(d.date);
+ d.score = +d.score
+ });
+ // Draw the trend line
+ var mytrend = trend("#trend_svg{{loop.index}}",trend{{loop.index}})
+ // ****************************************
+ {%- endfor %}
+ });
+ if ( !window.isLoaded ) {
+ window.addEventListener("load", function() {
+ onDocumentReady();
+ }, false);
+ } else {
+ onDocumentReady();
+ }
+ </script>
<script type="text/javascript">
$(document).ready(function (){
$(".btn-more").click(function() {
@@ -18,10 +65,10 @@
<body>
<div class="container">
<div class="masthead">
- <h3 class="text-muted">Yardstick status page ({{version}})</h3>
+ <h3 class="text-muted">Yardstick status page ({{version}}, {{date}})</h3>
<nav>
<ul class="nav nav-justified">
- <li class="active"><a href="index.html">Home</a></li>
+ <li class="active"><a href="http://testresults.opnfv.org/reporting/index.html">Home</a></li>
<li><a href="index-status-apex.html">Apex</a></li>
<li><a href="index-status-compass.html">Compass</a></li>
<li><a href="index-status-fuel.html">Fuel</a></li>
@@ -42,15 +89,15 @@
<tr>
<th width="40%">Scenario</th>
<th width="20%">Status</th>
- <th width="20%">Last 4 Iterations</th>
- <th width="20%">Last 10 Days</th>
+ <th width="20%">Trend</th>
+ <th width="10%">Last 4 Iterations</th>
+ <th width="10%">Last 10 Days</th>
</tr>
{% for scenario,result in scenario_results.iteritems() -%}
<tr class="tr-ok">
<td>{{scenario}}</td>
- <td>
- <img src="../../img/gauge_{{ scenario_results[scenario].getStatus() }}.png">
- </td>
+ <td><div id="gaugeScenario{{loop.index}}"></div></td>
+ <td><div id="trend_svg{{loop.index}}"></div></td>
<td>{{scenario_results[scenario].getFourDaysScore()}}</td>
<td>{{scenario_results[scenario].getTenDaysScore()}}</td>
</tr>
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/.gitignore b/utils/test/testapi/3rd_party/static/.gitignore
index ebf4281dc..ebf4281dc 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/.gitignore
+++ b/utils/test/testapi/3rd_party/static/.gitignore
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/highlight.default.css b/utils/test/testapi/3rd_party/static/css/highlight.default.css
index e417fc179..e417fc179 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/highlight.default.css
+++ b/utils/test/testapi/3rd_party/static/css/highlight.default.css
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/hightlight.default.css b/utils/test/testapi/3rd_party/static/css/hightlight.default.css
index e417fc179..e417fc179 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/hightlight.default.css
+++ b/utils/test/testapi/3rd_party/static/css/hightlight.default.css
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/screen.css b/utils/test/testapi/3rd_party/static/css/screen.css
index 2882b8d66..2882b8d66 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/css/screen.css
+++ b/utils/test/testapi/3rd_party/static/css/screen.css
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/endpoint.html b/utils/test/testapi/3rd_party/static/endpoint.html
index 4ae3bde0c..4ae3bde0c 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/endpoint.html
+++ b/utils/test/testapi/3rd_party/static/endpoint.html
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/explorer_icons.png b/utils/test/testapi/3rd_party/static/images/explorer_icons.png
index ed9d2fffb..ed9d2fffb 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/explorer_icons.png
+++ b/utils/test/testapi/3rd_party/static/images/explorer_icons.png
Binary files differ
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/logo_small.png b/utils/test/testapi/3rd_party/static/images/logo_small.png
index 5496a6557..5496a6557 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/logo_small.png
+++ b/utils/test/testapi/3rd_party/static/images/logo_small.png
Binary files differ
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/pet_store_api.png b/utils/test/testapi/3rd_party/static/images/pet_store_api.png
index f9f9cd4ae..f9f9cd4ae 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/pet_store_api.png
+++ b/utils/test/testapi/3rd_party/static/images/pet_store_api.png
Binary files differ
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/throbber.gif b/utils/test/testapi/3rd_party/static/images/throbber.gif
index 063938892..063938892 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/throbber.gif
+++ b/utils/test/testapi/3rd_party/static/images/throbber.gif
Binary files differ
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/wordnik_api.png b/utils/test/testapi/3rd_party/static/images/wordnik_api.png
index dca4f1455..dca4f1455 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/images/wordnik_api.png
+++ b/utils/test/testapi/3rd_party/static/images/wordnik_api.png
Binary files differ
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/index.html b/utils/test/testapi/3rd_party/static/index.html
index db209f4a8..db209f4a8 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/index.html
+++ b/utils/test/testapi/3rd_party/static/index.html
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/backbone-min.js b/utils/test/testapi/3rd_party/static/lib/backbone-min.js
index c1c0d4fff..c1c0d4fff 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/backbone-min.js
+++ b/utils/test/testapi/3rd_party/static/lib/backbone-min.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/handlebars-1.0.0.js b/utils/test/testapi/3rd_party/static/lib/handlebars-1.0.0.js
index c70f09d1d..c70f09d1d 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/handlebars-1.0.0.js
+++ b/utils/test/testapi/3rd_party/static/lib/handlebars-1.0.0.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/highlight.7.3.pack.js b/utils/test/testapi/3rd_party/static/lib/highlight.7.3.pack.js
index 9a95a75ea..9a95a75ea 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/highlight.7.3.pack.js
+++ b/utils/test/testapi/3rd_party/static/lib/highlight.7.3.pack.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery-1.8.0.min.js b/utils/test/testapi/3rd_party/static/lib/jquery-1.8.0.min.js
index 066d72c7e..066d72c7e 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery-1.8.0.min.js
+++ b/utils/test/testapi/3rd_party/static/lib/jquery-1.8.0.min.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.ba-bbq.min.js b/utils/test/testapi/3rd_party/static/lib/jquery.ba-bbq.min.js
index bcbf24834..bcbf24834 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.ba-bbq.min.js
+++ b/utils/test/testapi/3rd_party/static/lib/jquery.ba-bbq.min.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.slideto.min.js b/utils/test/testapi/3rd_party/static/lib/jquery.slideto.min.js
index ba32cff36..ba32cff36 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.slideto.min.js
+++ b/utils/test/testapi/3rd_party/static/lib/jquery.slideto.min.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.wiggle.min.js b/utils/test/testapi/3rd_party/static/lib/jquery.wiggle.min.js
index 2adb0d6d5..2adb0d6d5 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/jquery.wiggle.min.js
+++ b/utils/test/testapi/3rd_party/static/lib/jquery.wiggle.min.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/shred.bundle.js b/utils/test/testapi/3rd_party/static/lib/shred.bundle.js
index 74d081689..74d081689 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/shred.bundle.js
+++ b/utils/test/testapi/3rd_party/static/lib/shred.bundle.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/shred/content.js b/utils/test/testapi/3rd_party/static/lib/shred/content.js
index b8051fedd..b8051fedd 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/shred/content.js
+++ b/utils/test/testapi/3rd_party/static/lib/shred/content.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/swagger-oauth.js b/utils/test/testapi/3rd_party/static/lib/swagger-oauth.js
index 7c8839a95..7c8839a95 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/swagger-oauth.js
+++ b/utils/test/testapi/3rd_party/static/lib/swagger-oauth.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/swagger.js b/utils/test/testapi/3rd_party/static/lib/swagger.js
index 78e8b2949..78e8b2949 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/swagger.js
+++ b/utils/test/testapi/3rd_party/static/lib/swagger.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/underscore-min.js b/utils/test/testapi/3rd_party/static/lib/underscore-min.js
index 5a0cb3b00..5a0cb3b00 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/lib/underscore-min.js
+++ b/utils/test/testapi/3rd_party/static/lib/underscore-min.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/o2c.html b/utils/test/testapi/3rd_party/static/o2c.html
index d32d130ec..d32d130ec 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/o2c.html
+++ b/utils/test/testapi/3rd_party/static/o2c.html
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/swagger-ui.js b/utils/test/testapi/3rd_party/static/swagger-ui.js
index 4c9922642..4c9922642 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/swagger-ui.js
+++ b/utils/test/testapi/3rd_party/static/swagger-ui.js
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/swagger-ui.min.js b/utils/test/testapi/3rd_party/static/swagger-ui.min.js
index 28cb9e6a4..28cb9e6a4 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/static/swagger-ui.min.js
+++ b/utils/test/testapi/3rd_party/static/swagger-ui.min.js
diff --git a/utils/test/result_collection_api/README.rst b/utils/test/testapi/README.rst
index c0075bc76..44ab2a475 100644
--- a/utils/test/result_collection_api/README.rst
+++ b/utils/test/testapi/README.rst
@@ -25,7 +25,7 @@ How to install
From within your environment, just run:
- python setup.py install
+ ./install.sh
How to run
^^^^^^^^^^
diff --git a/utils/test/result_collection_api/docker/Dockerfile b/utils/test/testapi/docker/Dockerfile
index ffee4c231..b0272e609 100644
--- a/utils/test/result_collection_api/docker/Dockerfile
+++ b/utils/test/testapi/docker/Dockerfile
@@ -46,7 +46,7 @@ RUN pip install --upgrade pip
RUN git config --global http.sslVerify false
RUN git clone https://gerrit.opnfv.org/gerrit/releng /home/releng
-WORKDIR /home/releng/utils/test/result_collection_api/
+WORKDIR /home/releng/utils/test/testapi/
RUN pip install -r requirements.txt
RUN python setup.py install
CMD ["bash", "docker/start-server.sh"]
diff --git a/utils/test/result_collection_api/docker/prepare-env.sh b/utils/test/testapi/docker/prepare-env.sh
index 99433cc8c..99433cc8c 100755
--- a/utils/test/result_collection_api/docker/prepare-env.sh
+++ b/utils/test/testapi/docker/prepare-env.sh
diff --git a/utils/test/result_collection_api/docker/start-server.sh b/utils/test/testapi/docker/start-server.sh
index 8bf6084ae..8bf6084ae 100755
--- a/utils/test/result_collection_api/docker/start-server.sh
+++ b/utils/test/testapi/docker/start-server.sh
diff --git a/utils/test/result_collection_api/etc/config.ini b/utils/test/testapi/etc/config.ini
index 0edb73a3f..0edb73a3f 100644
--- a/utils/test/result_collection_api/etc/config.ini
+++ b/utils/test/testapi/etc/config.ini
diff --git a/utils/test/testapi/install.sh b/utils/test/testapi/install.sh
new file mode 100755
index 000000000..43229eabb
--- /dev/null
+++ b/utils/test/testapi/install.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+usage="
+Script to install opnfv_tesgtapi automatically.
+This script should be run under root.
+
+usage:
+ bash $(basename "$0") [-h|--help] [-t <test_name>]
+
+where:
+ -h|--help show this help text"
+
+if [[ $(whoami) != "root" ]]; then
+ echo "Error: This script must be run as root!"
+ exit 1
+fi
+
+cp -fr 3rd_party/static opnfv_testapi/tornado_swagger
+python setup.py install
+rm -fr opnfv_testapi/tornado_swagger/static
diff --git a/utils/test/result_collection_api/opnfv_testapi/__init__.py b/utils/test/testapi/opnfv_testapi/__init__.py
index 363bc388e..363bc388e 100644
--- a/utils/test/result_collection_api/opnfv_testapi/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/cmd/__init__.py b/utils/test/testapi/opnfv_testapi/cmd/__init__.py
index 363bc388e..363bc388e 100644
--- a/utils/test/result_collection_api/opnfv_testapi/cmd/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/cmd/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/cmd/server.py b/utils/test/testapi/opnfv_testapi/cmd/server.py
index c3d734607..c3d734607 100644
--- a/utils/test/result_collection_api/opnfv_testapi/cmd/server.py
+++ b/utils/test/testapi/opnfv_testapi/cmd/server.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/common/__init__.py b/utils/test/testapi/opnfv_testapi/common/__init__.py
index 05c0c9392..05c0c9392 100644
--- a/utils/test/result_collection_api/opnfv_testapi/common/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/common/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/common/config.py b/utils/test/testapi/opnfv_testapi/common/config.py
index ecab88ae3..ecab88ae3 100644
--- a/utils/test/result_collection_api/opnfv_testapi/common/config.py
+++ b/utils/test/testapi/opnfv_testapi/common/config.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/common/constants.py b/utils/test/testapi/opnfv_testapi/common/constants.py
index 4d39a142d..4d39a142d 100644
--- a/utils/test/result_collection_api/opnfv_testapi/common/constants.py
+++ b/utils/test/testapi/opnfv_testapi/common/constants.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/__init__.py b/utils/test/testapi/opnfv_testapi/resources/__init__.py
index 05c0c9392..05c0c9392 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/resources/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/handlers.py b/utils/test/testapi/opnfv_testapi/resources/handlers.py
index 5059f5d77..5059f5d77 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/handlers.py
+++ b/utils/test/testapi/opnfv_testapi/resources/handlers.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/models.py b/utils/test/testapi/opnfv_testapi/resources/models.py
index e79308b53..e79308b53 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/models.py
+++ b/utils/test/testapi/opnfv_testapi/resources/models.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/pod_handlers.py b/utils/test/testapi/opnfv_testapi/resources/pod_handlers.py
index 8f44439e7..8f44439e7 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/pod_handlers.py
+++ b/utils/test/testapi/opnfv_testapi/resources/pod_handlers.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/pod_models.py b/utils/test/testapi/opnfv_testapi/resources/pod_models.py
index 7231806f6..7231806f6 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/pod_models.py
+++ b/utils/test/testapi/opnfv_testapi/resources/pod_models.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/project_handlers.py b/utils/test/testapi/opnfv_testapi/resources/project_handlers.py
index 1e9a97230..1e9a97230 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/project_handlers.py
+++ b/utils/test/testapi/opnfv_testapi/resources/project_handlers.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/project_models.py b/utils/test/testapi/opnfv_testapi/resources/project_models.py
index f70630cda..f70630cda 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/project_models.py
+++ b/utils/test/testapi/opnfv_testapi/resources/project_models.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/result_handlers.py b/utils/test/testapi/opnfv_testapi/resources/result_handlers.py
index 400b84ac1..400b84ac1 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/result_handlers.py
+++ b/utils/test/testapi/opnfv_testapi/resources/result_handlers.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/result_models.py b/utils/test/testapi/opnfv_testapi/resources/result_models.py
index f73f5c612..f73f5c612 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/result_models.py
+++ b/utils/test/testapi/opnfv_testapi/resources/result_models.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/testcase_handlers.py b/utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py
index 253aa6649..253aa6649 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/testcase_handlers.py
+++ b/utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/resources/testcase_models.py b/utils/test/testapi/opnfv_testapi/resources/testcase_models.py
index c9dce6088..c9dce6088 100644
--- a/utils/test/result_collection_api/opnfv_testapi/resources/testcase_models.py
+++ b/utils/test/testapi/opnfv_testapi/resources/testcase_models.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/router/__init__.py b/utils/test/testapi/opnfv_testapi/router/__init__.py
index 3fc79f1d5..3fc79f1d5 100644
--- a/utils/test/result_collection_api/opnfv_testapi/router/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/router/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/router/url_mappings.py b/utils/test/testapi/opnfv_testapi/router/url_mappings.py
index eb648ecbb..eb648ecbb 100644
--- a/utils/test/result_collection_api/opnfv_testapi/router/url_mappings.py
+++ b/utils/test/testapi/opnfv_testapi/router/url_mappings.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/__init__.py b/utils/test/testapi/opnfv_testapi/tests/__init__.py
index 9f28b0bfa..9f28b0bfa 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/tests/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/__init__.py b/utils/test/testapi/opnfv_testapi/tests/unit/__init__.py
index 3fc79f1d5..3fc79f1d5 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/fake_pymongo.py b/utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py
index 3dd87e603..3dd87e603 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/fake_pymongo.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_base.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_base.py
index ff1a1932c..ff1a1932c 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_base.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_base.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_fake_pymongo.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_fake_pymongo.py
index 5f50ba867..5f50ba867 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_fake_pymongo.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_fake_pymongo.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_pod.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_pod.py
index a1184d554..a1184d554 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_pod.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_pod.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_project.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_project.py
index 327ddf7b2..327ddf7b2 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_project.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_project.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_result.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_result.py
index 8479b35cd..8479b35cd 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_result.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_result.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_testcase.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_testcase.py
index cb767844a..cb767844a 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_testcase.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_testcase.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_version.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_version.py
index b6fbf45dc..b6fbf45dc 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tests/unit/test_version.py
+++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_version.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/README.md b/utils/test/testapi/opnfv_testapi/tornado_swagger/README.md
index d815f2161..d815f2161 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/README.md
+++ b/utils/test/testapi/opnfv_testapi/tornado_swagger/README.md
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/__init__.py b/utils/test/testapi/opnfv_testapi/tornado_swagger/__init__.py
index 363bc388e..363bc388e 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/__init__.py
+++ b/utils/test/testapi/opnfv_testapi/tornado_swagger/__init__.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/handlers.py b/utils/test/testapi/opnfv_testapi/tornado_swagger/handlers.py
index 2154b4697..2154b4697 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/handlers.py
+++ b/utils/test/testapi/opnfv_testapi/tornado_swagger/handlers.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/settings.py b/utils/test/testapi/opnfv_testapi/tornado_swagger/settings.py
index 88d0d0f88..88d0d0f88 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/settings.py
+++ b/utils/test/testapi/opnfv_testapi/tornado_swagger/settings.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/swagger.py b/utils/test/testapi/opnfv_testapi/tornado_swagger/swagger.py
index 3d21edefb..3d21edefb 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/swagger.py
+++ b/utils/test/testapi/opnfv_testapi/tornado_swagger/swagger.py
diff --git a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/views.py b/utils/test/testapi/opnfv_testapi/tornado_swagger/views.py
index 25083195b..25083195b 100644
--- a/utils/test/result_collection_api/opnfv_testapi/tornado_swagger/views.py
+++ b/utils/test/testapi/opnfv_testapi/tornado_swagger/views.py
diff --git a/utils/test/result_collection_api/requirements.txt b/utils/test/testapi/requirements.txt
index e1fd9e4cc..e1fd9e4cc 100644
--- a/utils/test/result_collection_api/requirements.txt
+++ b/utils/test/testapi/requirements.txt
diff --git a/utils/test/result_collection_api/run_test.sh b/utils/test/testapi/run_test.sh
index 9b25f8ffc..9b25f8ffc 100755
--- a/utils/test/result_collection_api/run_test.sh
+++ b/utils/test/testapi/run_test.sh
diff --git a/utils/test/result_collection_api/setup.cfg b/utils/test/testapi/setup.cfg
index 927957ac7..927957ac7 100644
--- a/utils/test/result_collection_api/setup.cfg
+++ b/utils/test/testapi/setup.cfg
diff --git a/utils/test/result_collection_api/setup.py b/utils/test/testapi/setup.py
index 15dda961f..15dda961f 100644
--- a/utils/test/result_collection_api/setup.py
+++ b/utils/test/testapi/setup.py
diff --git a/utils/test/result_collection_api/test-requirements.txt b/utils/test/testapi/test-requirements.txt
index ddbdefcfd..ddbdefcfd 100644
--- a/utils/test/result_collection_api/test-requirements.txt
+++ b/utils/test/testapi/test-requirements.txt
diff --git a/utils/test/result_collection_api/update/README.md b/utils/test/testapi/update/README.md
index cb0e67b33..cb0e67b33 100644
--- a/utils/test/result_collection_api/update/README.md
+++ b/utils/test/testapi/update/README.md
diff --git a/utils/test/result_collection_api/update/__init__.py b/utils/test/testapi/update/__init__.py
index 363bc388e..363bc388e 100644
--- a/utils/test/result_collection_api/update/__init__.py
+++ b/utils/test/testapi/update/__init__.py
diff --git a/utils/test/result_collection_api/update/playbook-update.sh b/utils/test/testapi/update/playbook-update.sh
index 86d30e4b2..86d30e4b2 100755
--- a/utils/test/result_collection_api/update/playbook-update.sh
+++ b/utils/test/testapi/update/playbook-update.sh
diff --git a/utils/test/testapi/update/templates/__init__.py b/utils/test/testapi/update/templates/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/utils/test/testapi/update/templates/__init__.py
diff --git a/utils/test/result_collection_api/update/templates/backup_mongodb.py b/utils/test/testapi/update/templates/backup_mongodb.py
index 7e0dd5545..7e0dd5545 100644
--- a/utils/test/result_collection_api/update/templates/backup_mongodb.py
+++ b/utils/test/testapi/update/templates/backup_mongodb.py
diff --git a/utils/test/result_collection_api/update/templates/changes_in_mongodb.py b/utils/test/testapi/update/templates/changes_in_mongodb.py
index 1a4d5a16f..1a4d5a16f 100644
--- a/utils/test/result_collection_api/update/templates/changes_in_mongodb.py
+++ b/utils/test/testapi/update/templates/changes_in_mongodb.py
diff --git a/utils/test/result_collection_api/update/templates/restore_mongodb.py b/utils/test/testapi/update/templates/restore_mongodb.py
index c45a0e621..c45a0e621 100644
--- a/utils/test/result_collection_api/update/templates/restore_mongodb.py
+++ b/utils/test/testapi/update/templates/restore_mongodb.py
diff --git a/utils/test/result_collection_api/update/templates/rm_images.sh b/utils/test/testapi/update/templates/rm_images.sh
index 6722573b4..6722573b4 100755
--- a/utils/test/result_collection_api/update/templates/rm_images.sh
+++ b/utils/test/testapi/update/templates/rm_images.sh
diff --git a/utils/test/result_collection_api/update/templates/rm_olds.sh b/utils/test/testapi/update/templates/rm_olds.sh
index c6bca1867..c6bca1867 100644
--- a/utils/test/result_collection_api/update/templates/rm_olds.sh
+++ b/utils/test/testapi/update/templates/rm_olds.sh
diff --git a/utils/test/result_collection_api/update/templates/update_mongodb.py b/utils/test/testapi/update/templates/update_mongodb.py
index ba4334aa3..ba4334aa3 100644
--- a/utils/test/result_collection_api/update/templates/update_mongodb.py
+++ b/utils/test/testapi/update/templates/update_mongodb.py
diff --git a/utils/test/result_collection_api/update/templates/utils.py b/utils/test/testapi/update/templates/utils.py
index a18ff0389..a18ff0389 100644
--- a/utils/test/result_collection_api/update/templates/utils.py
+++ b/utils/test/testapi/update/templates/utils.py
diff --git a/utils/test/result_collection_api/update/test.yml b/utils/test/testapi/update/test.yml
index a8868720d..a8868720d 100644
--- a/utils/test/result_collection_api/update/test.yml
+++ b/utils/test/testapi/update/test.yml
diff --git a/utils/test/result_collection_api/update/update.yml b/utils/test/testapi/update/update.yml
index e6663d905..e6663d905 100644
--- a/utils/test/result_collection_api/update/update.yml
+++ b/utils/test/testapi/update/update.yml
diff --git a/utils/test/result_collection_api/update/update_api.py b/utils/test/testapi/update/update_api.py
index db8ad2d90..db8ad2d90 100644
--- a/utils/test/result_collection_api/update/update_api.py
+++ b/utils/test/testapi/update/update_api.py