Merge "Create Test Reporting landing page"
authorMorgan Richomme <morgan.richomme@orange.com>
Wed, 4 Jan 2017 14:25:42 +0000 (14:25 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Wed, 4 Jan 2017 14:25:42 +0000 (14:25 +0000)
20 files changed:
jjb/doctor/doctor.yml
jjb/dovetail/dovetail-cleanup.sh
jjb/fuel/fuel-verify-jobs.yml
jjb/global/releng-macros.yml
jjb/kvmfornfv/kvmfornfv.yml
jjb/releng/opnfv-lint.yml
jjb/vswitchperf/vswitchperf.yml
jjb/yardstick/yardstick-ci-jobs.yml
jjb/yardstick/yardstick-daily.sh
prototypes/puppet-infracloud/manifests/site.pp
utils/fetch_os_creds.sh
utils/push-test-logs.sh
utils/test/testapi/install.sh
utils/test/testapi/opnfv_testapi/resources/handlers.py
utils/test/testapi/opnfv_testapi/resources/models.py
utils/test/testapi/opnfv_testapi/resources/pod_handlers.py
utils/test/testapi/opnfv_testapi/resources/project_handlers.py
utils/test/testapi/opnfv_testapi/resources/result_handlers.py
utils/test/testapi/opnfv_testapi/resources/result_models.py
utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py

index 2e26071..335eb71 100644 (file)
@@ -27,6 +27,7 @@
     jobs:
         - 'doctor-verify-{stream}'
         - 'doctor-verify-{installer}-{inspector}-{stream}'
+        - 'doctor-profiling-{stream}'
 
 - job-template:
     name: 'doctor-verify-{stream}'
     publishers:
         - archive:
             artifacts: 'tests/*.log'
+
+- job-template:
+    name: 'doctor-profiling-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    parameters:
+        - 'doctor-default'
+        - string:
+            name: PROFILER
+            default: poc
+            description: "Profiler to be used"
+
+    scm:
+        - git-scm-gerrit
+
+    triggers:
+        - 'doctor-experimental'
+
+#####################################
+# parameter macros
+#####################################
+# TODO(yujunz) replace common parameter in doctor-verify-{stream} with macro
+- parameter:
+    name: 'doctor-default'
+    parameters:
+    - project-parameter:
+        project: '{project}'
+    - gerrit-parameter:
+        branch: '{branch}'
+    - 'opnfv-build-ubuntu-defaults'
+
+#####################################
+# trigger macros
+#####################################
+- trigger:
+    name: 'doctor-experimental'
+    triggers:
+        - gerrit:
+            server-name: 'gerrit.opnfv.org'
+            trigger-on:
+                - comment-added-contains-event:
+                    comment-contains-value: 'check experimental'
+            projects:
+                - project-compare-type: 'ANT'
+                  project-pattern: '{project}'
+                  branches:
+                      - branch-compare-type: 'ANT'
+                        branch-pattern: '**/{branch}'
+                  file-paths:
+                      - compare-type: 'ANT'
+                        pattern: 'tests/**'
+            skip-vote:
+                successful: true
+                failed: true
+                unstable: true
+                notbuilt: true
index f215278..22b2ba2 100755 (executable)
@@ -2,14 +2,35 @@
 
 [[ $CI_DEBUG == true ]] && redirect="/dev/stdout" || redirect="/dev/null"
 
-echo "Cleaning up docker containers/images..."
-# Remove previous running containers if exist
+#clean up dependent project docker images, which has no containers and image tag None
+clean_images=(opnfv/functest opnfv/yardstick)
+for clean_image in "${clean_images[@]}"; do
+    echo "Removing image $image_id, which has no containers and image tag is None"
+    dangling_images=($(docker images -f "dangling=true" | grep ${clean_image} | awk '{print $3}'))
+    if [[ -n ${dangling_images} ]]; then
+        for image_id in "${dangling_images[@]}"; do
+            docker rmi $image_id >${redirect}
+        done
+    fi
+done
+
+echo "Remove containers with image dovetail:<None>..."
+dangling_images=($(docker images -f "dangling=true" | grep opnfv/dovetail | awk '{print $3}'))
+if [[ -n ${dangling_images} ]]; then
+    for image_id in "${dangling_images[@]}"; do
+        echo "Removing image $image_id with tag None and its related containers"
+        docker ps -a | grep $image_id | awk '{print $1}'| xargs docker rm -f >${redirect}
+        docker rmi $image_id >${redirect}
+    done
+fi
+
+echo "Cleaning up dovetail docker containers/images..."
 if [[ ! -z $(docker ps -a | grep opnfv/dovetail) ]]; then
     echo "Removing existing opnfv/dovetail containers..."
     docker ps -a | grep opnfv/dovetail | awk '{print $1}' | xargs docker rm -f >${redirect}
 fi
 
-# Remove existing images if exist
+echo "Remove dovetail existing images if exist..."
 if [[ ! -z $(docker images | grep opnfv/dovetail) ]]; then
     echo "Docker images to remove:"
     docker images | head -1 && docker images | grep opnfv/dovetail >${redirect}
index fe89853..4a76d9d 100644 (file)
 #####################################
     phase:
         - 'basic':
-            slave-label: 'opnfv-build'
+            slave-label: 'opnfv-build-ubuntu'
         - 'build':
             slave-label: 'opnfv-build-ubuntu'
         - 'deploy-virtual':
-            slave-label: 'opnfv-build'
+            slave-label: 'opnfv-build-ubuntu'
         - 'smoke-test':
-            slave-label: 'opnfv-build'
+            slave-label: 'opnfv-build-ubuntu'
 #####################################
 # jobs
 #####################################
@@ -97,7 +97,7 @@
             project: '{project}'
         - gerrit-parameter:
             branch: '{branch}'
-        - 'opnfv-build-defaults'
+        - 'opnfv-build-ubuntu-defaults'
         - 'fuel-verify-defaults':
             gs-pathname: '{gs-pathname}'
 
index cd92480..5b7ef50 100644 (file)
     name: check-bash-syntax
     builders:
         - shell: "find . -name '*.sh' | xargs bash -n"
+
+- builder:
+    name: lint-yaml-code
+    builders:
+        - shell: |
+            #!/bin/bash
+            set -o errexit
+            set -o pipefail
+            set -o xtrace
+            export PATH=$PATH:/usr/local/bin/
+
+            # install python packages
+            pip install "yamllint==1.6.0"
+
+            # generate and upload lint log
+            echo "Running yaml code on $PROJECT ..."
+
+            # 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
+
+            if [ -s "yaml-violation.log" ]; then
+              SHOWN=$(cat yaml-violation.log| grep -v "^$" |wc -l)
+              echo -e "First $SHOWN shown\n---" > lint.log
+              cat yaml-violation.log >> lint.log
+              sed -r -i '4,$s/^/ /g' lint.log
+            fi
+
index 33c73f9..8ab821c 100644 (file)
                   node-parameters: false
                   kill-phase-on: FAILURE
                   abort-all-job: true
-        - multijob:
-            name: test
-            condition: SUCCESSFUL
-            projects:
-                - name: 'kvmfornfv-verify-test-{stream}'
-                  current-parameters: false
-                  predefined-parameters: |
-                    GERRIT_BRANCH=$GERRIT_BRANCH
-                    GERRIT_REFSPEC=$GERRIT_REFSPEC
-                    GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
-                  node-parameters: false
-                  kill-phase-on: FAILURE
-                  abort-all-job: true
+#        - multijob:
+#            name: test
+#            condition: SUCCESSFUL
+#            projects:
+#                - name: 'kvmfornfv-verify-test-{stream}'
+#                  current-parameters: false
+#                  predefined-parameters: |
+#                    GERRIT_BRANCH=$GERRIT_BRANCH
+#                    GERRIT_REFSPEC=$GERRIT_REFSPEC
+#                    GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER
+#                  node-parameters: false
+#                  kill-phase-on: FAILURE
+#                  abort-all-job: true
 - job-template:
     name: 'kvmfornfv-verify-{phase}-{stream}'
 
     scm:
         - git-scm
 
-    triggers:
-        - timed: '@midnight'
+#    triggers:
+#        - timed: '@midnight'
 
     builders:
         - description-setter:
index 7115cce..a96fce6 100644 (file)
@@ -9,6 +9,7 @@
 
     jobs:
         - 'opnfv-lint-verify-{stream}'
+        - 'opnfv-yamllint-verify-{stream}'
 
     stream:
         - master:
     builders:
         - lint-python-code
         - report-lint-result-to-gerrit
+
+- job-template:
+    name: 'opnfv-yamllint-verify-{stream}'
+
+    disabled: '{obj:disabled}'
+
+    concurrent: true
+
+    parameters:
+        - project-parameter:
+            project: $GERRIT_PROJECT
+        - gerrit-parameter:
+            branch: '{branch}'
+        - node:
+            name: SLAVE_NAME
+            description: Slaves to execute yamllint
+            default-slaves:
+                - lf-build1
+            allowed-multiselect: true
+            ignore-offline-nodes: true
+
+    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: 'REG_EXP'
+                project-pattern: 'compass4nfv'
+                branches:
+                  - branch-compare-type: 'ANT'
+                    branch-pattern: '**/{branch}'
+                file-paths:
+                  - compare-type: ANT
+                    pattern: '**/*.yml'
+                  - compare-type: ANT
+                    pattern: '**/*.yaml'
+
+    builders:
+        - lint-yaml-code
+        - report-lint-result-to-gerrit
index 0d2c67b..fe8ea53 100644 (file)
@@ -46,7 +46,7 @@
             pwd
             cd src
             make clobber
-            make
+            make MORE_MAKE_FLAGS="-j 10"
             # run basic sanity test
             make sanity
             cd ../ci
             pwd
             cd src
             make clobber
-            make
+            make MORE_MAKE_FLAGS="-j 5"
             # run basic sanity test
             make sanity
             cd ../ci
             pwd
             cd src
             make clobber
-            make
+            make MORE_MAKE_FLAGS="-j 5"
             cd ../ci
             ./build-vsperf.sh merge
index 33f557a..1ad5417 100644 (file)
         - 'yardstick-cleanup'
         #- 'yardstick-fetch-os-creds'
         - 'yardstick-{testsuite}'
+        - 'yardstick-store-results'
 
     publishers:
         - email:
         - shell:
             !include-raw: ../../utils/fetch_os_creds.sh
 
+- builder:
+    name: yardstick-store-results
+    builders:
+        - shell:
+            !include-raw: ../../utils/push-test-logs.sh
+
 - builder:
     name: yardstick-cleanup
     builders:
index b370541..da9042b 100755 (executable)
@@ -37,8 +37,15 @@ envs="-e INSTALLER_TYPE=${INSTALLER_TYPE} -e INSTALLER_IP=${INSTALLER_IP} \
 echo "Yardstick: Pulling image opnfv/yardstick:${DOCKER_TAG}"
 docker pull opnfv/yardstick:$DOCKER_TAG >$redirect
 
+# map log directory
+branch=${GIT_BRANCH##*/}
+dir_result="${HOME}/opnfv/yardstick/results/${branch}"
+mkdir -p ${dir_result}
+sudo rm -rf ${dir_result}/*
+map_log_dir="-v ${dir_result}:/tmp/yardstick"
+
 # Run docker
-cmd="sudo docker run ${opts} ${envs} ${labconfig} ${sshkey} opnfv/yardstick:${DOCKER_TAG} \
+cmd="sudo docker run ${opts} ${envs} ${labconfig} ${map_log_dir} ${sshkey} opnfv/yardstick:${DOCKER_TAG} \
     exec_tests.sh ${YARDSTICK_DB_BACKEND} ${YARDSTICK_SCENARIO_SUITE_NAME}"
 echo "Yardstick: Running docker cmd: ${cmd}"
 ${cmd}
index 8cbfef8..3483b06 100644 (file)
@@ -10,13 +10,13 @@ node 'controller00.opnfvlocal' {
   $group = 'infracloud'
   include ::sudoers
 
-  class { 'opnfv::server':
+  class { '::opnfv::server':
     iptables_public_tcp_ports => [80,5000,5671,8774,9292,9696,35357], # logs,keystone,rabbit,nova,glance,neutron,keystone
     sysadmins                 => hiera('sysadmins', []),
     enable_unbound            => false,
     purge_apt_sources         => false,
   }
-  class { 'opnfv::controller':
+  class { '::opnfv::controller':
     keystone_rabbit_password         => hiera('keystone_rabbit_password'),
     neutron_rabbit_password          => hiera('neutron_rabbit_password'),
     nova_rabbit_password             => hiera('nova_rabbit_password'),
@@ -38,6 +38,7 @@ node 'controller00.opnfvlocal' {
     neutron_subnet_gateway           => hiera('neutron_subnet_gateway'),
     neutron_subnet_allocation_pools  => hiera('neutron_subnet_allocation_pools'),
     opnfv_password                   => hiera('opnfv_password'),
+    require                          => Class['::opnfv::server'],
   }
 }
 
@@ -45,13 +46,13 @@ node 'compute00.opnfvlocal' {
   $group = 'infracloud'
   include ::sudoers
 
-  class { 'opnfv::server':
+  class { '::opnfv::server':
     sysadmins                 => hiera('sysadmins', []),
     enable_unbound            => false,
     purge_apt_sources         => false,
   }
 
-  class { 'opnfv::compute':
+  class { '::opnfv::compute':
     nova_rabbit_password             => hiera('nova_rabbit_password'),
     neutron_rabbit_password          => hiera('neutron_rabbit_password'),
     neutron_admin_password           => hiera('neutron_admin_password'),
@@ -60,11 +61,12 @@ node 'compute00.opnfvlocal' {
     br_name                          => hiera('bridge_name'),
     controller_public_address        => 'controller00.opnfvlocal',
     virt_type                        => hiera('virt_type'),
+    require                          => Class['::opnfv::server'],
   }
 }
 
 node 'jumphost.opnfvlocal' {
-  class { 'opnfv::server':
+  class { '::opnfv::server':
     sysadmins                 => hiera('sysadmins', []),
     enable_unbound            => false,
     purge_apt_sources         => false,
@@ -97,5 +99,6 @@ node 'baremetal.opnfvlocal', 'lfpod5-jumpserver' {
     ipv4_subnet_mask          => hiera('ipv4_subnet_mask'),
     bridge_name               => hiera('bridge_name'),
     dib_dev_user_password     => hiera('dib_dev_user_password'),
+    require                   => Class['::opnfv::server'],
   }
 }
index 47fbc91..ecc571d 100755 (executable)
@@ -144,9 +144,17 @@ elif [ "$installer_type" == "compass" ]; then
     sshpass -p root scp 2>/dev/null $ssh_options root@${installer_ip}:~/admin-openrc.sh $dest_path &> /dev/null
 
     info "This file contains the mgmt keystone API, we need the public one for our rc file"
-    public_ip=$(sshpass -p root ssh $ssh_options root@${installer_ip} \
-        "ssh ${controller_ip} 'source /opt/admin-openrc.sh; openstack endpoint show identity '" \
-        | grep publicurl | awk '{print $4}')
+    grep "OS_AUTH_URL.*v2" $dest_path > /dev/null 2>&1
+    if [ $?  -eq 0 ] ; then
+        public_ip=$(sshpass -p root ssh $ssh_options root@${installer_ip} \
+            "ssh ${controller_ip} 'source /opt/admin-openrc.sh; openstack endpoint show identity '" \
+            | grep publicurl | awk '{print $4}')
+    else
+        public_ip=$(sshpass -p root ssh $ssh_options root@${installer_ip} \
+            "ssh ${controller_ip} 'source /opt/admin-openrc.sh; \
+                 openstack endpoint list --interface public --service identity '" \
+            | grep identity | awk '{print $14}')
+    fi
     info "public_ip: $public_ip"
 
 
index 586afce..913748f 100644 (file)
@@ -54,7 +54,7 @@ if [ -d "$dir_result" ]; then
         else
             gsutil ls gs://artifacts.opnfv.org/"$project"/ &>/dev/null
             if [ $? != 0 ]; then
-                echo "Not possible to push results to artifact: gsutil not installed.";
+                echo "Not possible to push results to artifact: some error happened when using gsutil";
             else
                 echo "Uploading logs to artifact $project_artifact"
                 gsutil -m cp -r "$dir_result"/* gs://artifacts.opnfv.org/"$project_artifact"/ >/dev/null 2>&1
index 43229ea..c55691a 100755 (executable)
@@ -10,9 +10,17 @@ usage:
 where:
     -h|--help         show this help text"
 
-if [[ $(whoami) != "root" ]]; then
-    echo "Error: This script must be run as root!"
-    exit 1
+# Ref :-  https://openstack.nimeyo.com/87286/openstack-packaging-all-definition-data-files-config-setup
+
+if [ -z "$VIRTUAL_ENV" ];
+then
+    if [[ $(whoami) != "root" ]];
+    then
+        echo "Error: This script must be run as root!"
+        exit 1
+    fi
+else
+    sed -i -e 's#/etc/opnfv_testapi =#etc/opnfv_testapi =#g' setup.cfg
 fi
 
 cp -fr 3rd_party/static opnfv_testapi/tornado_swagger
index 5059f5d..f1ad15e 100644 (file)
@@ -227,7 +227,7 @@ class GenericApiHandler(RequestHandler):
 
 
 class VersionHandler(GenericApiHandler):
-    @swagger.operation(nickname='list')
+    @swagger.operation(nickname='List all versions')
     def get(self):
         """
             @description: list all supported versions
index a281c66..f518c97 100644 (file)
@@ -70,6 +70,7 @@ class ModelBase(object):
         return t\r
 \r
 \r
+@swagger.model()\r
 class CreateResponse(ModelBase):\r
     def __init__(self, href=''):\r
         self.href = href\r
index 8f44439..631d4a9 100644 (file)
@@ -20,7 +20,7 @@ class GenericPodHandler(GenericApiHandler):
 
 
 class PodCLHandler(GenericPodHandler):
-    @swagger.operation(nickname='list-all')
+    @swagger.operation(nickname='List all Pods')
     def get(self):
         """
             @description: list all pods
@@ -29,7 +29,7 @@ class PodCLHandler(GenericPodHandler):
         """
         self._list()
 
-    @swagger.operation(nickname='create')
+    @swagger.operation(nickname='Create a Pod')
     def post(self):
         """
             @description: create a pod
@@ -54,7 +54,7 @@ class PodCLHandler(GenericPodHandler):
 
 
 class PodGURHandler(GenericPodHandler):
-    @swagger.operation(nickname='get-one')
+    @swagger.operation(nickname='Get a Pod by pod_name')
     def get(self, pod_name):
         """
             @description: get a single pod by pod_name
index 1e9a972..9cf6986 100644 (file)
@@ -22,7 +22,7 @@ class GenericProjectHandler(GenericApiHandler):
 
 
 class ProjectCLHandler(GenericProjectHandler):
-    @swagger.operation(nickname="list-all")
+    @swagger.operation(nickname="List all Projects")
     def get(self):
         """
             @description: list all projects
@@ -31,7 +31,7 @@ class ProjectCLHandler(GenericProjectHandler):
         """
         self._list()
 
-    @swagger.operation(nickname="create")
+    @swagger.operation(nickname="Create a Project")
     def post(self):
         """
             @description: create a project
@@ -56,7 +56,7 @@ class ProjectCLHandler(GenericProjectHandler):
 
 
 class ProjectGURHandler(GenericProjectHandler):
-    @swagger.operation(nickname='get-one')
+    @swagger.operation(nickname='Get a Project by project_name')
     def get(self, project_name):
         """
             @description: get a single project by project_name
@@ -66,7 +66,7 @@ class ProjectGURHandler(GenericProjectHandler):
         """
         self._get_one({'name': project_name})
 
-    @swagger.operation(nickname="update")
+    @swagger.operation(nickname="Update a Project by project_name")
     def put(self, project_name):
         """
             @description: update a single project by project_name
@@ -82,7 +82,7 @@ class ProjectGURHandler(GenericProjectHandler):
         db_keys = ['name']
         self._update(query, db_keys)
 
-    @swagger.operation(nickname='delete')
+    @swagger.operation(nickname='Delete a Project by project_name')
     def delete(self, project_name):
         """
             @description: delete a project by project_name
index 400b84a..fe13c09 100644 (file)
@@ -52,7 +52,7 @@ class GenericResultHandler(GenericApiHandler):
 
 
 class ResultsCLHandler(GenericResultHandler):
-    @swagger.operation(nickname="list-all")
+    @swagger.operation(nickname="List all Test Results")
     def get(self):
         """
             @description: Retrieve result(s) for a test project
@@ -127,7 +127,7 @@ class ResultsCLHandler(GenericResultHandler):
 
         self._list(self.set_query(), sort=[('start_date', -1)], last=last)
 
-    @swagger.operation(nickname="create")
+    @swagger.operation(nickname="Create a Test Result")
     def post(self):
         """
             @description: create a test result
@@ -169,7 +169,7 @@ class ResultsCLHandler(GenericResultHandler):
 
 
 class ResultsGURHandler(GenericResultHandler):
-    @swagger.operation(nickname='get-one')
+    @swagger.operation(nickname='Get a Test Result by result_id')
     def get(self, result_id):
         """
             @description: get a single result by result_id
@@ -181,7 +181,7 @@ class ResultsGURHandler(GenericResultHandler):
         query["_id"] = ObjectId(result_id)
         self._get_one(query)
 
-    @swagger.operation(nickname="update")
+    @swagger.operation(nickname="Update a Test Result by result_id")
     def put(self, result_id):
         """
             @description: update a single result by _id
index 3011902..50445fc 100644 (file)
@@ -112,7 +112,7 @@ class TestResult(models.ModelBase):
 @swagger.model()
 class TestResults(models.ModelBase):
     """
-        @property rgit esults:
+        @property results:
         @ptype results: C{list} of L{TestResult}
     """
     def __init__(self):
index 253aa66..3692b16 100644 (file)
@@ -22,7 +22,7 @@ class GenericTestcaseHandler(GenericApiHandler):
 
 
 class TestcaseCLHandler(GenericTestcaseHandler):
-    @swagger.operation(nickname="list-all")
+    @swagger.operation(nickname="List all TestCases by project_name")
     def get(self, project_name):
         """
             @description: list all testcases of a project by project_name
@@ -34,7 +34,7 @@ class TestcaseCLHandler(GenericTestcaseHandler):
         query['project_name'] = project_name
         self._list(query)
 
-    @swagger.operation(nickname="create")
+    @swagger.operation(nickname="Create a TestCase by project_name")
     def post(self, project_name):
         """
             @description: create a testcase of a project by project_name
@@ -72,7 +72,7 @@ class TestcaseCLHandler(GenericTestcaseHandler):
 
 
 class TestcaseGURHandler(GenericTestcaseHandler):
-    @swagger.operation(nickname='get-one')
+    @swagger.operation(nickname='Get a TestCase by project and case name')
     def get(self, project_name, case_name):
         """
             @description: get a single testcase
@@ -86,7 +86,7 @@ class TestcaseGURHandler(GenericTestcaseHandler):
         query["name"] = case_name
         self._get_one(query)
 
-    @swagger.operation(nickname="update")
+    @swagger.operation(nickname="Update a TestCase by project and case name")
     def put(self, project_name, case_name):
         """
             @description: update a single testcase
@@ -104,7 +104,7 @@ class TestcaseGURHandler(GenericTestcaseHandler):
         db_keys = ['name', 'project_name']
         self._update(query, db_keys)
 
-    @swagger.operation(nickname='delete')
+    @swagger.operation(nickname='Delete a TestCase by project and case name')
     def delete(self, project_name, case_name):
         """
             @description: delete a testcase by project_name and case_name