summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--docs/jenkins-job-builder/opnfv-jjb-usage.rst18
-rw-r--r--jjb/compass4nfv/compass-dovetail-jobs.yml4
-rw-r--r--jjb/container4nfv/container4nfv-project.yml18
-rw-r--r--jjb/global/releng-macros.yml93
-rw-r--r--jjb/global/slave-params.yml6
-rw-r--r--jjb/kvmfornfv/kvmfornfv.yml2
-rw-r--r--jjb/opnfvdocs/docs-rtd.yaml5
-rw-r--r--jjb/opnfvdocs/opnfvdocs.yml29
-rw-r--r--jjb/pharos/pharos.yml8
-rw-r--r--jjb/qtip/qtip-experimental-jobs.yml2
-rw-r--r--jjb/qtip/qtip-validate-jobs.yml8
-rw-r--r--jjb/releng/functest-docker.yml256
-rw-r--r--jjb/releng/opnfv-docs.yml115
-rwxr-xr-xjjb/releng/opnfv-manifest.sh42
-rw-r--r--jjb/vswitchperf/vswitchperf.yml26
-rw-r--r--modules/requirements.txt2
-rw-r--r--modules/setup.py2
-rw-r--r--modules/test-requirements.txt2
-rw-r--r--utils/test/testapi/.gitignore2
-rw-r--r--utils/test/testapi/3rd_party/static/testapi-ui/Gruntfile.js155
-rw-r--r--utils/test/testapi/3rd_party/static/testapi-ui/package.json18
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/UI/e2e/podsControllerSpec.js188
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/UI/karma.conf.js14
-rw-r--r--utils/test/testapi/opnfv_testapi/tests/UI/protractor-conf.js18
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/about/about.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/about/about.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/auth-failure/authFailureController.js (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/auth-failure/authFailureController.js)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/home/home.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/home/home.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/logout/logout.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/logout/logout.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/logout/logoutController.js (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/logout/logoutController.js)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/pods/pods.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/pods/pods.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/pods/podsController.js (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/pods/podsController.js)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/profile/importPubKeyModal.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/profile/importPubKeyModal.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/profile/profile.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/profile/profile.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/profile/profileController.js (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/profile/profileController.js)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/profile/showPubKeyModal.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/profile/showPubKeyModal.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/results-report/partials/editTestModal.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/results-report/partials/fullTestListModal.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/fullTestListModal.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/results-report/partials/reportDetails.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/results-report/resultsReport.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/resultsReport.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/results-report/resultsReportController.js (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/resultsReportController.js)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/results/results.html (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/results/results.html)0
-rw-r--r--utils/test/testapi/opnfv_testapi/ui/results/resultsController.js (renamed from utils/test/testapi/3rd_party/static/testapi-ui/components/results/resultsController.js)0
-rw-r--r--utils/test/testapi/setup.cfg1
44 files changed, 783 insertions, 252 deletions
diff --git a/.gitignore b/.gitignore
index eeabaeb63..2c1894879 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,4 @@ testapi_venv/
.tox
*.retry
job_output/
+utils/test/testapi/opnfv_testapi/tests/UI/coverage
diff --git a/docs/jenkins-job-builder/opnfv-jjb-usage.rst b/docs/jenkins-job-builder/opnfv-jjb-usage.rst
index f34833f5c..062cf8223 100644
--- a/docs/jenkins-job-builder/opnfv-jjb-usage.rst
+++ b/docs/jenkins-job-builder/opnfv-jjb-usage.rst
@@ -29,7 +29,7 @@ Submit the change to gerrit::
git review -v
-Follow the link to gerrit https://gerrit.opnfv.org/gerrit/51 in a few moments
+Follow the link given in the stdoutput to gerrit eg: https://gerrit.opnfv.org/gerrit/"Your_Change_ID"
the verify job will have completed and you will see Verified +1 jenkins-ci in
the gerrit ui.
@@ -65,24 +65,12 @@ it will reset the verified status to 0. If you want to keep the verified
status, use **recheck-experimental** in commit message to trigger both
verify and experimental jobs.
-You can add below persons as reviewers to your patch in order to get it
+You can look in the releng/INFO file for a list of current committers to add as reviewers to your patch in order to get it
reviewed and submitted.
-* fatih.degirmenci@ericsson.com
-* agardner@linuxfoundation.org
-* trozet@redhat.com
-* morgan.richomme@orange.com
-* vlaza@cloudbasesolutions.com
-* matthew.lijun@huawei.com
-* meimei@huawei.com
-* jose.lausuch@ericsson.com
-* koffirodrigue@gmail.com
-* r-mibu@cq.jp.nec.com
-* tbramwell@linuxfoundation.org
-
Or Add the group releng-contributors
-Or just email a request for submission to opnfv-helpdesk@rt.linuxfoundation.org
+Or just email a request for review to helpdesk@opnfv.org
The Current merge and verify jobs for jenkins job builder can be found
in `releng-jobs.yaml`_.
diff --git a/jjb/compass4nfv/compass-dovetail-jobs.yml b/jjb/compass4nfv/compass-dovetail-jobs.yml
index f0e1c2d3f..c09086348 100644
--- a/jjb/compass4nfv/compass-dovetail-jobs.yml
+++ b/jjb/compass4nfv/compass-dovetail-jobs.yml
@@ -184,9 +184,9 @@
- trigger:
name: 'compass-os-nosdn-nofeature-ha-baremetal-weekly-danube-trigger'
triggers:
- - timed: 'H H * * 0'
+ - timed: '' # 'H H * * 0'
- trigger:
name: 'dovetail-weekly-trigger'
triggers:
- - timed: 'H H * * 0'
+ - timed: '' # 'H H * * 0'
diff --git a/jjb/container4nfv/container4nfv-project.yml b/jjb/container4nfv/container4nfv-project.yml
index 76e5e2f5e..9e2d313c8 100644
--- a/jjb/container4nfv/container4nfv-project.yml
+++ b/jjb/container4nfv/container4nfv-project.yml
@@ -31,6 +31,12 @@
- project-parameter:
project: '{project}'
branch: '{branch}'
+ # yamllint disable rule:line-length
+ - string:
+ name: GIT_BASE
+ default: https://gerrit.opnfv.org/gerrit/$PROJECT
+ description: "Used for overriding the GIT URL coming from Global Jenkins configuration in case if the stuff is done on none-LF HW."
+ # yamllint enable rule:line-length
- 'opnfv-build-ubuntu-defaults'
scm:
@@ -82,13 +88,19 @@
- project-parameter:
project: '{project}'
branch: '{branch}'
+ # yamllint disable rule:line-length
+ - string:
+ name: GIT_BASE
+ default: https://gerrit.opnfv.org/gerrit/$PROJECT
+ description: "Used for overriding the GIT URL coming from Global Jenkins configuration in case if the stuff is done on none-LF HW."
+ # yamllint enable rule:line-length
- node:
name: SLAVE_NAME
description: 'Slave name on Jenkins'
allowed-slaves:
- - huawei-virtaul6
+ - huawei-virtual6
default-slaves:
- - huawei-virtaul6
+ - huawei-virtual6
scm:
- git-scm
@@ -97,6 +109,6 @@
- timed: '@midnight'
builders:
- - shell:
+ - shell: |
cd $WORKSPACE/ci
./deploy.sh
diff --git a/jjb/global/releng-macros.yml b/jjb/global/releng-macros.yml
index 59415f5ca..17c451c9d 100644
--- a/jjb/global/releng-macros.yml
+++ b/jjb/global/releng-macros.yml
@@ -136,6 +136,20 @@
pattern: '{files}'
- trigger:
+ name: gerrit-trigger-tag-created
+ triggers:
+ - gerrit:
+ server-name: 'gerrit.opnfv.org'
+ trigger-on:
+ - ref-updated
+ projects:
+ - project-compare-type: 'ANT'
+ project-pattern: '{project}'
+ branches:
+ - branch-compare-type: 'ANT'
+ branch-pattern: 'refs/tags/**'
+
+- trigger:
name: 'experimental'
triggers:
- gerrit:
@@ -182,17 +196,6 @@
sudo chown -R $USER:$USER $WORKSPACE || exit 1
- builder:
- name: build-html-and-pdf-docs-output
- builders:
- - shell: |
- #!/bin/bash
- set -o errexit
- set -o xtrace
- export PATH=$PATH:/usr/local/bin/
- git clone ssh://gerrit.opnfv.org:29418/opnfvdocs docs_build/_opnfvdocs
- GERRIT_COMMENT=gerrit_comment.txt ./docs_build/_opnfvdocs/scripts/docs-build.sh
-
-- builder:
name: upload-under-review-docs-to-opnfv-artifacts
builders:
- shell: |
@@ -203,7 +206,7 @@
export PATH=$PATH:/usr/local/bin/
[[ $GERRIT_CHANGE_NUMBER =~ .+ ]]
- [[ -d docs_output ]] || exit 0
+ [[ -d docs/_build/ ]] || exit 0
echo
echo "###########################"
@@ -216,7 +219,7 @@
local_path="upload/$GERRIT_CHANGE_NUMBER"
mkdir -p upload
- mv docs_output "$local_path"
+ mv docs/_build/html/ "$local_path"
gsutil -m cp -r "$local_path" "gs://$gs_base"
gsutil -m setmeta \
@@ -228,46 +231,6 @@
find "$local_path" | grep -e 'index.html$' -e 'pdf$' | \
sed -e "s|^$local_path| http://$gs_path|" >> gerrit_comment.txt
-- builder:
- name: upload-generated-docs-to-opnfv-artifacts
- builders:
- - shell: |
- #!/bin/bash
- set -o errexit
- set -o pipefail
- set -o xtrace
- export PATH=$PATH:/usr/local/bin/
-
- [[ -d docs_output ]] || exit 0
-
- echo
- echo "########################"
- echo "UPLOADING GENERATED DOCS"
- echo "########################"
- echo
-
- echo "gs_path="$GS_URL/docs""
- echo "local_path="upload/docs""
-
- gs_path="$GS_URL/docs"
- local_path="upload/docs"
-
- mkdir -p upload
- mv docs_output "$local_path"
- ls "$local_path"
-
- echo "gsutil -m cp -r "$local_path"/* "gs://$gs_path""
- gsutil -m cp -r "$local_path"/* "gs://$gs_path"
-
- gsutil -m setmeta \
- -h "Content-Type:text/html" \
- -h "Cache-Control:private, max-age=0, no-transform" \
- "gs://$gs_path"/**.html > /dev/null 2>&1
-
- echo "Document link(s):" >> gerrit_comment.txt
- find "$local_path" | grep -e 'index.html$' -e 'pdf$' | \
- sed -e "s|^$local_path| http://$gs_path|" >> gerrit_comment.txt
-
# To take advantage of this macro, have your build write
# out the file 'gerrit_comment.txt' with information to post
# back to gerrit and include this macro in the list of builders.
@@ -417,19 +380,10 @@
- builder:
name: upload-review-docs
builders:
- - build-html-and-pdf-docs-output
- upload-under-review-docs-to-opnfv-artifacts
- report-build-result-to-gerrit
- builder:
- name: upload-merged-docs
- builders:
- - build-html-and-pdf-docs-output
- - upload-generated-docs-to-opnfv-artifacts
- - report-build-result-to-gerrit
- - remove-old-docs-from-opnfv-artifacts
-
-- builder:
name: check-bash-syntax
builders:
- shell: "find . -name '*.sh' | xargs bash -n"
@@ -450,18 +404,19 @@
# generate and upload lint log
echo "Running yaml code on $PROJECT ..."
+ # Get list of yaml files
+ YAML_FILES=$(git --no-pager diff --diff-filter=MCRAT --name-only HEAD^1 | egrep "ya?ml$")
+
# Ensure we start with a clean environment
rm -f yaml-violation.log lint.log
- # Get number of yaml violations. If none, this will be an
- # empty string: ""
- find . \
- -type f -name "*.yml" -print \
- -o -name "*.yaml" -print | \
- xargs yamllint > yaml-violation.log || true
+ # Yamllint files only in patchset
+ for yamlfile in $YAML_FILES; do
+ yamllint $yamlfile >> yaml-violation.log || true
+ done
if [ -s "yaml-violation.log" ]; then
- SHOWN=$(cat yaml-violation.log| grep -v "^$" |wc -l)
+ SHOWN=$(grep -c -v "^$" yaml-violation.log)
echo -e "First $SHOWN shown\n---" > lint.log
cat yaml-violation.log >> lint.log
sed -r -i '4,$s/^/ /g' lint.log
diff --git a/jjb/global/slave-params.yml b/jjb/global/slave-params.yml
index 5b94607e5..0ea37d941 100644
--- a/jjb/global/slave-params.yml
+++ b/jjb/global/slave-params.yml
@@ -742,15 +742,15 @@
description: 'pxe bridge for booting of Daisy master'
- parameter:
- name: zte-pod4-defaults
+ name: zte-virtual5-defaults
parameters:
- node:
name: SLAVE_NAME
description: 'Slave name on Jenkins'
allowed-slaves:
- - zte-pod4
+ - zte-virtual5
default-slaves:
- - zte-pod4
+ - zte-virtual5
- string:
name: GIT_BASE
default: https://gerrit.opnfv.org/gerrit/$PROJECT
diff --git a/jjb/kvmfornfv/kvmfornfv.yml b/jjb/kvmfornfv/kvmfornfv.yml
index ad497e97d..aae6e028e 100644
--- a/jjb/kvmfornfv/kvmfornfv.yml
+++ b/jjb/kvmfornfv/kvmfornfv.yml
@@ -8,7 +8,7 @@
- master:
branch: '{stream}'
gs-pathname: ''
- disabled: false
+ disabled: true
- euphrates:
branch: 'stable/{stream}'
gs-pathname: '/{stream}'
diff --git a/jjb/opnfvdocs/docs-rtd.yaml b/jjb/opnfvdocs/docs-rtd.yaml
index c98959524..28f9354fa 100644
--- a/jjb/opnfvdocs/docs-rtd.yaml
+++ b/jjb/opnfvdocs/docs-rtd.yaml
@@ -8,6 +8,8 @@
stream:
- master:
branch: 'master'
+ - danube:
+ branch: 'stable/{stream}'
- euphrates:
branch: 'stable/{stream}'
@@ -36,6 +38,7 @@
files: 'docs/**/*.*'
builders:
+ - 'remove-old-docs-from-opnfv-artifacts'
- shell: |
if [ $GERRIT_BRANCH == "master" ]; then
RTD_BUILD_VERSION=latest
@@ -89,4 +92,6 @@
pip install --upgrade pip
pip freeze
pip install tox
+ sed -i s,\-b\ html,\-b\ singlehtml,g tox.ini
tox -edocs
+ - 'upload-review-docs'
diff --git a/jjb/opnfvdocs/opnfvdocs.yml b/jjb/opnfvdocs/opnfvdocs.yml
index 95bc8a9dd..3dfb9d155 100644
--- a/jjb/opnfvdocs/opnfvdocs.yml
+++ b/jjb/opnfvdocs/opnfvdocs.yml
@@ -11,7 +11,6 @@
jobs:
- 'opnfvdocs-verify-shellcheck-{stream}'
- 'opnfvdocs-merge-shellcheck-{stream}'
- - 'opnfvdocs-daily-{stream}'
stream:
- master:
@@ -109,31 +108,3 @@
builders:
- check-bash-syntax
-
-- job-template:
- name: 'opnfvdocs-daily-{stream}'
-
- disabled: true
-
- parameters:
- - project-parameter:
- project: '{project}'
- branch: '{branch}'
- - string:
- 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: GIT_CLONE_BASE
- default: ssh://gerrit.opnfv.org:29418
- description: "Used for overriding the GIT URL coming from parameters macro."
-
- scm:
- - git-scm
-
- triggers:
- - timed: '0 H/6 * * *'
-
- builders:
- - build-html-and-pdf-docs-output
-# - upload-generated-docs-to-opnfv-artifacts
diff --git a/jjb/pharos/pharos.yml b/jjb/pharos/pharos.yml
index 0c104c0c0..7af4f0fa6 100644
--- a/jjb/pharos/pharos.yml
+++ b/jjb/pharos/pharos.yml
@@ -6,10 +6,12 @@
- project:
name: pharos
- project: '{name}'
+ project:
+ - '{name}'
+ - '{name}-tools'
jobs:
- - 'pharos-verify-{stream}'
+ - '{project}-verify-{stream}'
stream:
- master:
@@ -22,7 +24,7 @@
disabled: false
- job-template:
- name: 'pharos-verify-{stream}'
+ name: '{project}-verify-{stream}'
disabled: '{obj:disabled}'
diff --git a/jjb/qtip/qtip-experimental-jobs.yml b/jjb/qtip/qtip-experimental-jobs.yml
index 4c336d1d5..fdfed2601 100644
--- a/jjb/qtip/qtip-experimental-jobs.yml
+++ b/jjb/qtip/qtip-experimental-jobs.yml
@@ -33,7 +33,7 @@
branch: '{branch}'
# Pin the tests on zte-pod4 with apex deployment
- apex-defaults
- - zte-pod4-defaults
+ - zte-virtual5-defaults
scm:
- git-scm-gerrit
diff --git a/jjb/qtip/qtip-validate-jobs.yml b/jjb/qtip/qtip-validate-jobs.yml
index 42240ed95..febe28619 100644
--- a/jjb/qtip/qtip-validate-jobs.yml
+++ b/jjb/qtip/qtip-validate-jobs.yml
@@ -26,19 +26,19 @@
qpi:
- compute:
installer: apex
- pod: zte-pod4
+ pod: zte-virtual5
<<: *master
- storage:
installer: apex
- pod: zte-pod4
+ pod: zte-virtual5
<<: *master
- compute:
installer: apex
- pod: zte-pod4
+ pod: zte-virtual5
<<: *euphrates
- storage:
installer: apex
- pod: zte-pod4
+ pod: zte-virtual5
<<: *euphrates
# -------------------------------
diff --git a/jjb/releng/functest-docker.yml b/jjb/releng/functest-docker.yml
new file mode 100644
index 000000000..2e24685ee
--- /dev/null
+++ b/jjb/releng/functest-docker.yml
@@ -0,0 +1,256 @@
+---
+##############################################
+# job configuration for docker build and push
+##############################################
+- project:
+
+ name: functest-docker
+
+ project: functest
+
+ stream:
+ - master:
+ branch: '{stream}'
+ disabled: false
+ - euphrates:
+ branch: 'stable/{stream}'
+ disabled: false
+
+ arch_tag:
+ - 'amd64':
+ slave_label: 'opnfv-build-ubuntu'
+ - 'arm64':
+ slave_label: 'opnfv-build-ubuntu-arm'
+
+ # yamllint disable rule:key-duplicates
+ image:
+ - 'core'
+ - 'healthcheck'
+ - 'features'
+ - 'components'
+ - 'parser'
+ - 'smoke'
+ - 'vnf'
+ - 'restapi'
+
+ # settings for jobs run in multijob phases
+ build-job-settings: &build-job-settings
+ current-parameters: false
+ git-revision: true
+ node-parameters: true
+ predefined-parameters: |
+ PUSH_IMAGE=$PUSH_IMAGE
+ COMMIT_ID=$COMMIT_ID
+ RELEASE_VERSION=$RELEASE_VERSION
+ DOCKERFILE=$DOCKERFILE
+ ARCH_TAG=$ARCH_TAG
+ kill-phase-on: FAILURE
+ abort-all-jobs: false
+
+ manifest-job-settings: &manifest-job-settings
+ current-parameters: false
+ git-revision: true
+ node-parameters: true
+ predefined-parameters: |
+ RELEASE_VERSION=$RELEASE_VERSION
+ ARCH_TAG=$ARCH_TAG
+ kill-phase-on: FAILURE
+ abort-all-jobs: false
+
+ # yamllint enable rule:key-duplicates
+ jobs:
+ - "functest-docker-build-push-{arch_tag}-{stream}"
+ - "functest-{image}-build-push-{arch_tag}-{stream}"
+ - "functest-{image}-create-manifest-{arch_tag}-{stream}"
+########################
+# job templates
+########################
+- job-template:
+ name: 'functest-docker-build-push-{arch_tag}-{stream}'
+
+ project-type: multijob
+
+ disabled: '{obj:disabled}'
+
+ parameters:
+ - job-parameters:
+ project: '{project}'
+ branch: '{branch}'
+ slave_label: '{slave_label}'
+ arch_tag: '{arch_tag}'
+ - string:
+ name: ARCH_TAG
+ default: "{arch_tag}"
+ description: "If set, this value will be added to the docker image tag as a prefix"
+
+ properties:
+ - throttle:
+ max-per-node: 1
+ option: 'project'
+
+ scm:
+ - git-scm
+
+ triggers:
+ - pollscm:
+ cron: "*/30 * * * *"
+
+ builders:
+ - multijob:
+ name: 'build-base-img-create-manifest'
+ execution-type: SEQUENTIAL
+ projects:
+ - name: 'functest-core-build-push-{stream}'
+ <<: *build-job-settings
+ - name: 'functest-core-create-manifest-{stream}'
+ <<: *manifest-job-settings
+ - multijob:
+ name: 'build-child-img'
+ condition: SUCCESSFUL
+ execution-type: PARALLEL
+ projects:
+ - name: 'functest-healthcheck-build-push-{stream}'
+ <<: *build-job-settings
+ - name: 'functest-features-build-push-{stream}'
+ <<: *build-job-settings
+ - name: 'functest-components-build-push-{stream}'
+ <<: *build-job-settings
+ - name: 'functest-parser-build-push-{stream}'
+ <<: *build-job-settings
+ - name: 'functest-smoke-build-push-{stream}'
+ <<: *build-job-settings
+ - name: 'functest-vnf-build-push-{stream}'
+ <<: *build-job-settings
+ - name: 'functest-restapi-build-push-{stream}'
+ <<: *build-job-settings
+ - multijob:
+ name: 'create-img-manifest'
+ condition: SUCCESSFUL
+ execution-type: PARALLEL
+ projects:
+ - name: 'functest-healthcheck-create-manifest-{stream}'
+ <<: *manifest-job-settings
+ - name: 'functest-features-create-manifest-{stream}'
+ <<: *manifest-job-settings
+ - name: 'functest-components-create-manifest-{stream}'
+ <<: *manifest-job-settings
+ - name: 'functest-parser-create-manifest-{stream}'
+ <<: *manifest-job-settings
+ - name: 'functest-smoke-create-manifest-{stream}'
+ <<: *manifest-job-settings
+ - name: 'functest-vnf-create-manifest-{stream}'
+ <<: *manifest-job-settings
+ - name: 'functest-restapi-create-manifest-{stream}'
+ <<: *manifest-job-settings
+
+ publishers:
+ - 'functest-{arch_tag}-recipients'
+
+- job-template:
+
+ name: 'functest-{image}-build-push-{arch_tag}-{stream}'
+
+ disabled: '{obj:disabled}'
+
+ parameters:
+ - job-parameters:
+ project: '{project}'
+ branch: '{branch}'
+ slave_label: '{slave_label}'
+ arch_tag: '{arch_tag}'
+ - string:
+ name: DOCKER_REPO_NAME
+ default: "opnfv/functest-{image}"
+ description: "Dockerhub repo to be pushed to."
+ - string:
+ name: DOCKER_DIR
+ default: "docker/{image}"
+ description: "Directory containing files needed by the Dockerfile"
+
+ builders:
+ - shell:
+ !include-raw-escape: ./opnfv-docker.sh
+
+- job-template:
+
+ name: 'functest-{image}-create-manifest-{arch_tag}-{stream}'
+
+ disabled: '{obj:disabled}'
+
+ parameters:
+ - job-parameters:
+ project: '{project}'
+ branch: '{branch}'
+ slave_label: '{slave_label}'
+ arch_tag: '{arch_tag}'
+ - string:
+ name: DOCKER_REPO_NAME
+ default: "opnfv/functest-{image}"
+ description: "Dockerhub repo to be pushed to."
+ - string:
+ name: DOCKER_DIR
+ default: "docker/{image}"
+ description: "Directory containing files needed by the Dockerfile"
+
+ builders:
+ - shell:
+ !include-raw-escape: ./opnfv-manifest.sh
+
+# parameter macro
+- parameter:
+ name: job-parameters
+ parameters:
+ - project-parameter:
+ project: '{project}'
+ branch: '{branch}'
+ - label:
+ name: SLAVE_LABEL
+ default: '{slave_label}'
+ description: 'Slave label on Jenkins'
+ - string:
+ name: GIT_BASE
+ default: https://gerrit.opnfv.org/gerrit/$PROJECT
+ description: 'Git URL to use on this Jenkins Slave'
+ - string:
+ name: PUSH_IMAGE
+ default: "true"
+ description: "To enable/disable pushing the image to Dockerhub."
+ - string:
+ name: COMMIT_ID
+ default: ""
+ description: "commit id to make a snapshot docker image"
+ - string:
+ name: RELEASE_VERSION
+ default: ""
+ description: "Docker tag to be built, e.g. 5.0.0, opnfv-5.0.0, 5.0.RC1"
+ - string:
+ name: DOCKERFILE
+ default: "Dockerfile"
+ description: "Dockerfile to use for creating the image."
+ - string:
+ name: ARCH_TAG
+ default: "{arch_tag}"
+ description: "If set, this value will be added to the docker image tag as a prefix"
+ - string:
+ name: PROJECT
+ default: "{project}"
+ description: "Project name used to enable job conditions"
+
+# publisher macros
+- publisher:
+ name: 'functest-arm64-recipients'
+ publishers:
+ - email:
+ recipients: >
+ cristina.pauna@enea.com
+ alexandru.avadanii@enea.com
+ delia.popescu@enea.com
+
+- publisher:
+ name: 'functest-amd64-recipients'
+ publishers:
+ - email:
+ recipients: >
+ jalausuch@suse.com morgan.richomme@orange.com
+ cedric.ollivier@orange.com feng.xiaowei@zte.com.cn
+ juha.kosonen@nokia.com wangwulin@huawei.com
diff --git a/jjb/releng/opnfv-docs.yml b/jjb/releng/opnfv-docs.yml
deleted file mode 100644
index 740274518..000000000
--- a/jjb/releng/opnfv-docs.yml
+++ /dev/null
@@ -1,115 +0,0 @@
----
-########################
-# Job configuration for opnfv-docs
-########################
-- project:
-
- name: opnfv-docs
-
- project: opnfv-docs
-
- jobs:
- - 'opnfv-docs-verify-{stream}'
- - 'opnfv-docs-merge-{stream}'
-
- stream:
- - master:
- branch: '{stream}'
- doc-version: ''
- gs-pathname: ''
- disabled: false
- - euphrates:
- branch: 'stable/{stream}'
- doc-version: '5.0.0'
- gs-pathname: '/{stream}/{doc-version}'
- disabled: false
-
-########################
-# job templates
-########################
-
-- job-template:
- name: 'opnfv-docs-verify-{stream}'
-
- disabled: '{obj:disabled}'
-
- parameters:
- - project-parameter:
- project: $GERRIT_PROJECT
- branch: '{branch}'
-
- scm:
- - git-scm-gerrit
-
- triggers:
- - gerrit:
- server-name: 'gerrit.opnfv.org'
- trigger-on:
- - patchset-created-event:
- exclude-drafts: 'false'
- exclude-trivial-rebase: 'false'
- exclude-no-code-change: 'false'
- - draft-published-event
- - comment-added-contains-event:
- comment-contains-value: 'recheck'
- - comment-added-contains-event:
- comment-contains-value: 'reverify'
- projects:
- - project-compare-type: 'ANT'
- project-pattern: '*'
- branches:
- - branch-compare-type: 'ANT'
- branch-pattern: '**/{branch}'
- file-paths:
- - compare-type: ANT
- pattern: docs/**
- - compare-type: ANT
- pattern: yardstick/**
-
- builders:
- - upload-review-docs
-
-- job-template:
- name: 'opnfv-docs-merge-{stream}'
-
- disabled: '{obj:disabled}'
-
- parameters:
- - project-parameter:
- project: $GERRIT_PROJECT
- branch: '{branch}'
- - string:
- 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:
- - git-scm
-
- triggers:
- - gerrit:
- server-name: 'gerrit.opnfv.org'
- trigger-on:
- - 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: '*'
- branches:
- - branch-compare-type: 'ANT'
- branch-pattern: '**/{branch}'
- file-paths:
- - compare-type: ANT
- pattern: docs/**
- - compare-type: ANT
- pattern: yardstick/**
-
- builders:
- - upload-merged-docs
diff --git a/jjb/releng/opnfv-manifest.sh b/jjb/releng/opnfv-manifest.sh
new file mode 100755
index 000000000..a740491c2
--- /dev/null
+++ b/jjb/releng/opnfv-manifest.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+# SPDX-license-identifier: Apache-2.0
+##############################################################################
+# 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
+##############################################################################
+
+
+set -o errexit
+set -o nounset
+set -o pipefail
+
+# Starting creating manifest image for $DOCKER_REPO_NAME
+
+ARCH=(amd64 arm64)
+DOCKER_REPO_NAME=${DOCKER_REPO_NAME-}
+RELEASE_VERSION=${RELEASE_VERSION-}
+BRANCH=${BRANCH-}
+ARCH_TAG=${ARCH_TAG-}
+
+# Before script install manifest-tool:
+# cd .. && git clone https://github.com/estesp/manifest-tool
+# cd ../manifest-tool && sudo -E make && sudo -E make install
+
+if [[ "$BRANCH" == "master" ]]; then
+ DOCKER_TAG="latest"
+elif [[ "$BRANCH" == "euphrates" ]]; then
+ DOCKER_TAG="euphrates"
+elif [[ -n "${RELEASE_VERSION}" ]]; then
+ DOCKER_TAG="${RELEASE_VERSION}"
+else
+ DOCKER_TAG="stable"
+fi
+if [[ "${ARCH_TAG}" =~ "arm64" || "${ARCH_TAG}" =~ "amd64" ]]; then
+ sudo manifest-tool push from-args --platforms linux/amd64,linux/arm64 \
+ --template "${DOCKER_REPO_NAME}":"${ARCH[0]}"-"${DOCKER_TAG}" \
+ --template "${DOCKER_REPO_NAME}":"${ARCH[1]}"-"${DOCKER_TAG}" \
+ --target "${DOCKER_REPO_NAME}":"${DOCKER_TAG}"
+fi
+
diff --git a/jjb/vswitchperf/vswitchperf.yml b/jjb/vswitchperf/vswitchperf.yml
index bab8b24c2..16ceb2e52 100644
--- a/jjb/vswitchperf/vswitchperf.yml
+++ b/jjb/vswitchperf/vswitchperf.yml
@@ -15,12 +15,10 @@
branch: '{stream}'
gs-pathname: ''
disabled: false
- slave-label: 'opnfv-build-ubuntu'
- euphrates:
branch: 'stable/{stream}'
gs-pathname: '/{stream}'
disabled: false
- slave-label: 'opnfv-build-ubuntu'
- job-template:
@@ -74,7 +72,17 @@
- project-parameter:
project: '{project}'
branch: '{branch}'
- - '{slave-label}-defaults'
+ - string:
+ name: GIT_BASE
+ default: https://gerrit.opnfv.org/gerrit/$PROJECT
+ description: 'Git URL to use on this Jenkins Slave'
+ - node:
+ name: SLAVE_NAME
+ description: 'Slave name on Jenkins'
+ allowed-slaves:
+ - ericsson-build4
+ default-slaves:
+ - ericsson-build4
scm:
- git-scm-gerrit
@@ -136,7 +144,17 @@
- project-parameter:
project: '{project}'
branch: '{branch}'
- - '{slave-label}-defaults'
+ - string:
+ name: GIT_BASE
+ default: https://gerrit.opnfv.org/gerrit/$PROJECT
+ description: 'Git URL to use on this Jenkins Slave'
+ - node:
+ name: SLAVE_NAME
+ description: 'Slave name on Jenkins'
+ allowed-slaves:
+ - ericsson-build4
+ default-slaves:
+ - ericsson-build4
scm:
- git-scm
diff --git a/modules/requirements.txt b/modules/requirements.txt
index 2793dd4cf..0718fa3b0 100644
--- a/modules/requirements.txt
+++ b/modules/requirements.txt
@@ -1,3 +1,3 @@
paramiko>=2.0 # LGPLv2.1+
mock>=2.0 # BSD
-requests!=2.12.2,>=2.10.0 # Apache-2.0
+requests>=2.14.2 # Apache-2.0
diff --git a/modules/setup.py b/modules/setup.py
index a1e9b3bb2..46309ef1c 100644
--- a/modules/setup.py
+++ b/modules/setup.py
@@ -18,5 +18,5 @@ except ImportError:
pass
setuptools.setup(
- setup_requires=['pbr>=1.8'],
+ setup_requires=['pbr>=2.0.0'],
pbr=True)
diff --git a/modules/test-requirements.txt b/modules/test-requirements.txt
index c264540c0..1ae13c002 100644
--- a/modules/test-requirements.txt
+++ b/modules/test-requirements.txt
@@ -1,2 +1,2 @@
nose # LGPL
-coverage>=4.0 # Apache-2.0
+coverage!=4.4,>=4.0 # Apache-2.0
diff --git a/utils/test/testapi/.gitignore b/utils/test/testapi/.gitignore
index 21bb264e4..e34365e60 100644
--- a/utils/test/testapi/.gitignore
+++ b/utils/test/testapi/.gitignore
@@ -11,3 +11,5 @@ build
.tox
.ven
docs/_build
+opnfv_testapi/tests/UI/coverage
+3rd_party/static/testapi-ui/testapi-ui \ No newline at end of file
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/Gruntfile.js b/utils/test/testapi/3rd_party/static/testapi-ui/Gruntfile.js
new file mode 100644
index 000000000..8ff280278
--- /dev/null
+++ b/utils/test/testapi/3rd_party/static/testapi-ui/Gruntfile.js
@@ -0,0 +1,155 @@
+
+module.exports = function (grunt) {
+ require('load-grunt-tasks')(grunt);
+ require('grunt-protractor-coverage')(grunt);
+ grunt.loadNpmTasks('grunt-shell-spawn');
+ grunt.loadNpmTasks('grunt-wait');
+ grunt.loadNpmTasks('grunt-contrib-copy');
+ grunt.loadNpmTasks('grunt-contrib-connect');
+ grunt.initConfig({
+ connect: {
+ server: {
+ options: {
+ port: 8000,
+ base: './',
+ middleware: function(connect, options, middlewares) {
+ middlewares.unshift(function(req, res, next) {
+ if (req.method.toUpperCase() == 'POST') req.method='GET';
+ return next();
+ });
+ return middlewares;
+ }
+ }
+ }
+ },
+ copy: {
+ assets: {
+ expand: true,
+ cwd: 'assets',
+ src: '**',
+ dest: 'testapi-ui/assets',
+ },
+ components: {
+ expand: true,
+ cwd: 'components',
+ src: '**',
+ dest: 'testapi-ui/components',
+ },
+ shared: {
+ expand: true,
+ cwd: 'shared',
+ src: '**',
+ dest: 'testapi-ui/shared',
+ },
+ filesPng: {
+ expand: true,
+ src: '*.png',
+ dest: 'testapi-ui/',
+ },
+ filesIco: {
+ expand: true,
+ src: '*.ico',
+ dest: 'testapi-ui/',
+ },
+ filesJs: {
+ expand: true,
+ src: 'app.js',
+ dest: 'testapi-ui/',
+ },
+ filesJson: {
+ expand: true,
+ src: 'config.json',
+ dest: 'testapi-ui/',
+ }
+ },
+ wait: {
+ default: {
+ options: {
+ delay: 3000
+ }
+ }
+ },
+ shell: {
+ updateSelenium: {
+ command: 'node_modules/protractor/bin/webdriver-manager update',
+ options: {
+ async: false
+ }
+ },
+ startSelenium: {
+ command: 'node_modules/protractor/bin/webdriver-manager start',
+ options: {
+ async: true
+ }
+ },
+ options: {
+ stdout: false,
+ stderr: false
+ }
+ },
+ instrument: {
+ files: ['components/**/*.js'],
+ options: {
+ lazy: false,
+ basePath: "./testapi-ui/"
+ }
+ },
+ karma: {
+ unit: {
+ configFile: '../../../opnfv_testapi/tests/UI/karma.conf.js'
+ }
+ },
+ protractor_coverage: {
+ options: {
+ keepAlive: true,
+ noColor: false,
+ coverageDir: '../../../opnfv_testapi/tests/UI/coverage',
+ args: {
+ specs: ['../../../opnfv_testapi/tests/UI/e2e/podsControllerSpec.js']
+ }
+ },
+ local: {
+ options: {
+ configFile: '../../../opnfv_testapi/tests/UI/protractor-conf.js'
+ }
+ }
+ },
+ makeReport: {
+ src: '../../../opnfv_testapi/tests/UI/coverage/*.json',
+ options: {
+ print: 'detail'
+ }
+ },
+ protractor: {
+ e2e: {
+ options: {
+ args: {
+ specs: ['../../../opnfv_testapi/tests/UI/e2e/podsControllerSpec.js']
+ },
+ configFile: '../../../opnfv_testapi/tests/UI/protractor-conf.js',
+ keepAlive: true
+ }
+ }
+ }
+ });
+ grunt.registerTask('test', [
+ 'karma:unit'
+ ]);
+ grunt.registerTask('e2e', [
+ 'copy:assets',
+ 'copy:components',
+ 'copy:shared',
+ 'copy:filesPng',
+ 'copy:filesIco',
+ 'copy:filesJs',
+ 'copy:filesJson',
+ 'instrument',
+ 'connect',
+ 'shell:updateSelenium',
+ 'shell:startSelenium',
+ 'wait:default',
+ 'protractor_coverage',
+ 'makeReport'
+ // 'protractor'
+ ]);
+}
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/package.json b/utils/test/testapi/3rd_party/static/testapi-ui/package.json
new file mode 100644
index 000000000..dc992390d
--- /dev/null
+++ b/utils/test/testapi/3rd_party/static/testapi-ui/package.json
@@ -0,0 +1,18 @@
+{
+ "devDependencies": {
+ "grunt": "~1.0.1",
+ "grunt-contrib-connect": "^1.0.2",
+ "grunt-contrib-copy": "^1.0.0",
+ "grunt-karma": "~2.0.0",
+ "grunt-protractor-coverage": "^0.2.18",
+ "grunt-protractor-runner": "~5.0.0",
+ "grunt-shell-spawn": "~0.3.10",
+ "grunt-wait": "~0.1.0",
+ "karma": "~1.7.1",
+ "karma-chrome-launcher": "~2.2.0",
+ "karma-coverage": "~1.1.1",
+ "karma-jasmine": "~1.1.0",
+ "load-grunt-tasks": "~3.5.2",
+ "protractor-http-mock": "^0.10.0"
+ }
+}
diff --git a/utils/test/testapi/opnfv_testapi/tests/UI/e2e/podsControllerSpec.js b/utils/test/testapi/opnfv_testapi/tests/UI/e2e/podsControllerSpec.js
new file mode 100644
index 000000000..66a57f2f2
--- /dev/null
+++ b/utils/test/testapi/opnfv_testapi/tests/UI/e2e/podsControllerSpec.js
@@ -0,0 +1,188 @@
+'use strict';
+
+var mock = require('protractor-http-mock');
+var baseURL = "http://localhost:8000"
+describe('testing the Pods page for anonymous user', function () {
+
+ beforeEach(function(){
+ mock([{
+ request: {
+ path: '/api/v1/pods',
+ method: 'GET'
+ },
+ response: {
+ data: {
+ pods: [{role: "community-ci", name: "test", owner: "testUser", details: "DemoDetails", mode: "metal", _id: "59f02f099a07c84bfc5c7aed", creation_date: "2017-10-25 11:58:25.926168"}]
+ }
+ }
+ }]);
+ });
+
+ it( 'should navigate to pods link ', function() {
+ browser.get(baseURL);
+ var podslink = element(by.linkText('Pods')).click();
+ var EC = browser.ExpectedConditions;
+ browser.wait(EC.urlContains(baseURL+ '/#/pods'), 10000);
+ });
+
+ it('create button is not visible for anonymous user', function () {
+ browser.get(baseURL+'#/pods');
+ var buttonCreate = element(by.buttonText('Create'));
+ expect(buttonCreate.isDisplayed()).toBeFalsy();
+ });
+
+ it('filter button is visible for anonymous user', function () {
+ var buttonFilter = element(by.buttonText('Filter'));
+ expect(buttonFilter.isDisplayed()).toBe(true)
+ });
+
+ it('clear button is visible for anonymous user', function () {
+ var buttonClear = element(by.buttonText('Clear'));
+ expect(buttonClear.isDisplayed()).toBe(true)
+ });
+
+ it('Show results when click filter button', function () {
+ var buttonFilter = element(by.buttonText('Filter'));
+ buttonFilter.click();
+ var pod = element(by.css('.show-pod'));
+ expect(pod.isPresent()).toBe(true);
+ });
+
+ it('Show results when click clear button', function () {
+ browser.get(baseURL+'#/pods');
+ var buttonClear = element(by.buttonText('Clear'));
+ buttonClear.click();
+ var pod = element(by.css('.show-pod'));
+ expect(pod.isPresent()).toBe(true);
+ });
+
+ it('If details is not shown then show details when click the link',function() {
+ expect(element(by.css('.show-pod.hidden')).isPresent()).toBe(true);
+ var podslink = element(by.linkText('test')).click();
+ expect(element(by.css('.show-pod.hidden')).isPresent()).toBe(false);
+ });
+
+ it('If details is shown then hide details when click the link',function() {
+ expect(element(by.css('.show-pod.hidden')).isPresent()).toBe(false);
+ var podslink = element(by.linkText('test')).click();
+ expect(element(by.css('.show-pod.hidden')).isPresent()).toBe(true);
+ });
+
+ it('If backend is not responding then show error when click filter button', function () {
+ browser.get(baseURL + '/#/pods');
+ mock.teardown();
+ var buttonFilter = element(by.buttonText('Filter'));
+ buttonFilter.click().then(function(){
+ expect(element(by.css('.alert.alert-danger.ng-binding.ng-scope')).isDisplayed()).toBe(true);
+ });
+ });
+
+});
+
+describe('testing the Pods page for authorized user', function () {
+
+ beforeEach(function(){
+ mock([
+ {
+ request: {
+ path: '/api/v1/pods',
+ method: 'POST'
+ },
+ response: {
+ data: {
+ href: baseURL+"/api/v1/pods/test"
+ }
+ }
+ },
+ {
+ request: {
+ path: '/api/v1/pods',
+ method: 'POST',
+ data: {
+ name: 'test1',
+ details : 'DemoDetails',
+ role : 'community-ci',
+ mode : 'metal'
+ }
+ },
+ response: {
+ status : 403
+ }
+ },
+ {
+ request: {
+ path: '/api/v1/profile',
+ method: 'GET'
+ },
+ response: {
+ data: {
+ "fullname": "Test User", "_id": "79f82eey9a00c84bfhc7aed", "user": "testUser", "groups": ["opnfv-testapi-users"], "email": "testuser@test.com"
+ }
+ }
+ }
+ ]);
+ });
+
+ it('create button is visible for authorized user', function () {
+ browser.get(baseURL + '/#/pods');
+ var buttonCreate = element(by.buttonText('Create'));
+ expect(buttonCreate.isDisplayed()).toBe(true);
+ });
+
+ it('Do not show error if input is acceptable', function () {
+ var name = element(by.model('ctrl.name'));
+ var details = element(by.model('ctrl.details'));
+ name.sendKeys('test');
+ details.sendKeys('DemoDetails');
+ var buttonCreate = element(by.buttonText('Create'));
+ buttonCreate.click().then(function(){
+ expect(element(by.css('.alert.alert-danger.ng-binding.ng-scope')).isDisplayed()).toBe(false);
+ });
+ });
+
+ it('Show error when user click the create button with a empty name', function () {
+ browser.get(baseURL+ '/#/pods');
+ var details = element(by.model('ctrl.details'));
+ details.sendKeys('DemoDetails');
+ var buttonCreate = element(by.buttonText('Create'));
+ buttonCreate.click();
+ expect(element(by.cssContainingText(".alert","Name is missing.")).isDisplayed()).toBe(true);
+ });
+
+ it('Show error when user click the create button with an already existing name', function () {
+ browser.get(baseURL+ '/#/pods');
+ var name = element(by.model('ctrl.name'));
+ var details = element(by.model('ctrl.details'));
+ name.sendKeys('test1');
+ details.sendKeys('DemoDetails');
+ var buttonCreate = element(by.buttonText('Create'));
+ buttonCreate.click();
+ expect(element(by.cssContainingText(".alert","Error creating the new pod from server: Pod's name already exists")).isDisplayed()).toBe(true);
+ });
+
+ it('If backend is not responding then show error when user click the create button',function(){
+ mock.teardown();
+ mock([
+ {
+ request: {
+ path: '/api/v1/profile',
+ method: 'GET'
+ },
+ response: {
+ data: {
+ "fullname": "Test User", "_id": "79f82eey9a00c84bfhc7aed", "user": "testUser", "groups": ["opnfv-testapi-users"], "email": "testuser@test.com"
+ }
+ }
+ }
+ ]);
+ browser.get(baseURL+ '/#/pods');
+ var name = element(by.model('ctrl.name'));
+ var details = element(by.model('ctrl.details'));
+ name.sendKeys('test');
+ details.sendKeys('DemoDetails');
+ var buttonCreate = element(by.buttonText('Create'));
+ buttonCreate.click().then(function(){
+ expect(element(by.css('.alert.alert-danger.ng-binding.ng-scope')).isDisplayed()).toBe(true);
+ });
+ })
+}); \ No newline at end of file
diff --git a/utils/test/testapi/opnfv_testapi/tests/UI/karma.conf.js b/utils/test/testapi/opnfv_testapi/tests/UI/karma.conf.js
new file mode 100644
index 000000000..eaded5a1d
--- /dev/null
+++ b/utils/test/testapi/opnfv_testapi/tests/UI/karma.conf.js
@@ -0,0 +1,14 @@
+module.exports = function (config) {
+ config.set({
+ frameworks: ['jasmine'],
+ files: [
+ "assets/lib/angular/angular.js",
+ "assets/lib/angular-mocks/angular-mocks.js",
+ ],
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: true,
+ reporters: ['progress', 'coverage'],
+ preprocessors: { 'src/*.js': ['coverage'] }
+ });
+};
diff --git a/utils/test/testapi/opnfv_testapi/tests/UI/protractor-conf.js b/utils/test/testapi/opnfv_testapi/tests/UI/protractor-conf.js
new file mode 100644
index 000000000..affbe5d26
--- /dev/null
+++ b/utils/test/testapi/opnfv_testapi/tests/UI/protractor-conf.js
@@ -0,0 +1,18 @@
+exports.config = {
+ seleniumAddress: 'http://localhost:4444/wd/hub',
+ capabilities: {
+ 'browserName': 'chrome',
+ 'chromeOptions': {
+ 'args': ['show-fps-counter=true', '--disable-web-security', "no-sandbox", "--headless", "--disable-gpu"]
+ }
+ },
+ jasmineNodeOpts: {
+ showColors: true,
+ defaultTimeoutInterval: 30000
+ },
+ onPrepare: function(){
+ require('protractor-http-mock').config = {
+ rootDirectory: __dirname
+ };
+ }
+};
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/about/about.html b/utils/test/testapi/opnfv_testapi/ui/about/about.html
index 65860a8cc..65860a8cc 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/about/about.html
+++ b/utils/test/testapi/opnfv_testapi/ui/about/about.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/auth-failure/authFailureController.js b/utils/test/testapi/opnfv_testapi/ui/auth-failure/authFailureController.js
index 29d1d70fa..29d1d70fa 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/auth-failure/authFailureController.js
+++ b/utils/test/testapi/opnfv_testapi/ui/auth-failure/authFailureController.js
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/home/home.html b/utils/test/testapi/opnfv_testapi/ui/home/home.html
index 47d747fd8..47d747fd8 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/home/home.html
+++ b/utils/test/testapi/opnfv_testapi/ui/home/home.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/logout/logout.html b/utils/test/testapi/opnfv_testapi/ui/logout/logout.html
index 38a5c3698..38a5c3698 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/logout/logout.html
+++ b/utils/test/testapi/opnfv_testapi/ui/logout/logout.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/logout/logoutController.js b/utils/test/testapi/opnfv_testapi/ui/logout/logoutController.js
index 1b6d78c63..1b6d78c63 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/logout/logoutController.js
+++ b/utils/test/testapi/opnfv_testapi/ui/logout/logoutController.js
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/pods/pods.html b/utils/test/testapi/opnfv_testapi/ui/pods/pods.html
index 22f29347b..22f29347b 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/pods/pods.html
+++ b/utils/test/testapi/opnfv_testapi/ui/pods/pods.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/pods/podsController.js b/utils/test/testapi/opnfv_testapi/ui/pods/podsController.js
index 489fa8a8d..489fa8a8d 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/pods/podsController.js
+++ b/utils/test/testapi/opnfv_testapi/ui/pods/podsController.js
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/importPubKeyModal.html b/utils/test/testapi/opnfv_testapi/ui/profile/importPubKeyModal.html
index 0f55c27fd..0f55c27fd 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/importPubKeyModal.html
+++ b/utils/test/testapi/opnfv_testapi/ui/profile/importPubKeyModal.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/profile.html b/utils/test/testapi/opnfv_testapi/ui/profile/profile.html
index 763f5d120..763f5d120 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/profile.html
+++ b/utils/test/testapi/opnfv_testapi/ui/profile/profile.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/profileController.js b/utils/test/testapi/opnfv_testapi/ui/profile/profileController.js
index 5dbdf7b1a..5dbdf7b1a 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/profileController.js
+++ b/utils/test/testapi/opnfv_testapi/ui/profile/profileController.js
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/showPubKeyModal.html b/utils/test/testapi/opnfv_testapi/ui/profile/showPubKeyModal.html
index 5f63a5ef6..5f63a5ef6 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/profile/showPubKeyModal.html
+++ b/utils/test/testapi/opnfv_testapi/ui/profile/showPubKeyModal.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html b/utils/test/testapi/opnfv_testapi/ui/results-report/partials/editTestModal.html
index 583c9b92b..583c9b92b 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html
+++ b/utils/test/testapi/opnfv_testapi/ui/results-report/partials/editTestModal.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/fullTestListModal.html b/utils/test/testapi/opnfv_testapi/ui/results-report/partials/fullTestListModal.html
index 6db198b02..6db198b02 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/fullTestListModal.html
+++ b/utils/test/testapi/opnfv_testapi/ui/results-report/partials/fullTestListModal.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html b/utils/test/testapi/opnfv_testapi/ui/results-report/partials/reportDetails.html
index 517e569c7..517e569c7 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html
+++ b/utils/test/testapi/opnfv_testapi/ui/results-report/partials/reportDetails.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/resultsReport.html b/utils/test/testapi/opnfv_testapi/ui/results-report/resultsReport.html
index 5527121ba..5527121ba 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/resultsReport.html
+++ b/utils/test/testapi/opnfv_testapi/ui/results-report/resultsReport.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/resultsReportController.js b/utils/test/testapi/opnfv_testapi/ui/results-report/resultsReportController.js
index 591ad402b..591ad402b 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/results-report/resultsReportController.js
+++ b/utils/test/testapi/opnfv_testapi/ui/results-report/resultsReportController.js
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/results/results.html b/utils/test/testapi/opnfv_testapi/ui/results/results.html
index 2ae5339a0..2ae5339a0 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/results/results.html
+++ b/utils/test/testapi/opnfv_testapi/ui/results/results.html
diff --git a/utils/test/testapi/3rd_party/static/testapi-ui/components/results/resultsController.js b/utils/test/testapi/opnfv_testapi/ui/results/resultsController.js
index cc6cc0b6e..cc6cc0b6e 100644
--- a/utils/test/testapi/3rd_party/static/testapi-ui/components/results/resultsController.js
+++ b/utils/test/testapi/opnfv_testapi/ui/results/resultsController.js
diff --git a/utils/test/testapi/setup.cfg b/utils/test/testapi/setup.cfg
index 62a193c30..b3394d44f 100644
--- a/utils/test/testapi/setup.cfg
+++ b/utils/test/testapi/setup.cfg
@@ -26,6 +26,7 @@ packages =
data_files =
/etc/opnfv_testapi = etc/config.ini
/usr/local/share/opnfv_testapi = 3rd_party/static/*
+ /usr/local/share/opnfv_testapi/testapi-ui/components = opnfv_testapi/ui/*
[entry_points]
console_scripts =