diff options
37 files changed, 652 insertions, 868 deletions
diff --git a/jjb/3rd_party_ci/functest-netvirt.sh b/jjb/3rd_party_ci/functest-netvirt.sh deleted file mode 100755 index adffaf42d..000000000 --- a/jjb/3rd_party_ci/functest-netvirt.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -e - -# wipe the WORKSPACE -/bin/rm -rf $WORKSPACE/* - -echo "Hello World" diff --git a/jjb/3rd_party_ci/odl-netvirt.yml b/jjb/3rd_party_ci/odl-netvirt.yml index ca1936156..054761ea7 100644 --- a/jjb/3rd_party_ci/odl-netvirt.yml +++ b/jjb/3rd_party_ci/odl-netvirt.yml @@ -20,8 +20,6 @@ slave-label: 'ericsson-virtual5' - 'install-netvirt': slave-label: 'odl-netvirt-virtual' - - 'functest': - slave-label: 'odl-netvirt-virtual' - 'postprocess': slave-label: 'odl-netvirt-virtual' ##################################### @@ -119,9 +117,8 @@ name: functest condition: SUCCESSFUL projects: - - name: 'functest-netvirt-virtual-suite-{stream}' + - name: 'functest-netvirt-virtual-daily-{stream}' predefined-parameters: | - FUNCTEST_SUITE_NAME=vping_userdata,bgpvpn RC_FILE_PATH=/home/jenkins/cloner-info/overcloudrc DEPLOY_SCENARIO=os-odl_l2-bgpvpn-noha node-parameters: true @@ -162,7 +159,7 @@ use-build-blocker: true blocking-jobs: - 'odl-netvirt-verify-virtual-install-.*' - - 'odl-netvirt-verify-virtual-functest-.*' + - 'functest-netvirt-virtual-daily-.*' - 'odl-netvirt-verify-virtual-postprocess-.*' block-level: 'NODE' @@ -200,11 +197,6 @@ - shell: !include-raw: ./install-netvirt.sh - builder: - name: 'netvirt-verify-functest-builder' - builders: - - shell: - !include-raw: ./functest-netvirt.sh -- builder: name: 'netvirt-verify-postprocess-builder' builders: - shell: diff --git a/jjb/compass4nfv/compass-verify-jobs.yml b/jjb/compass4nfv/compass-verify-jobs.yml index 6ef5fbb67..1af190e6b 100644 --- a/jjb/compass4nfv/compass-verify-jobs.yml +++ b/jjb/compass4nfv/compass-verify-jobs.yml @@ -22,6 +22,10 @@ disabled: false os-version: 'xenial' openstack-os-version: '' + - 'centos7': + disabled: false + os-version: 'centos7' + openstack-os-version: '' ##################################### # patch verification phases ##################################### @@ -240,3 +244,4 @@ name: COMPASS_OS_VERSION choices: - 'xenial' + - 'centos7' diff --git a/jjb/doctor/doctor.yml b/jjb/doctor/doctor.yml index ab9ef8f6c..62f89e686 100644 --- a/jjb/doctor/doctor.yml +++ b/jjb/doctor/doctor.yml @@ -24,10 +24,17 @@ - 'sample' - 'congress' + task: + - verify: + profiler: 'none' + auto-trigger-name: 'doctor-verify' + - profiling: + profiler: 'poc' + auto-trigger-name: 'experimental' + jobs: - 'doctor-verify-{stream}' - - 'doctor-verify-{installer}-{inspector}-{stream}' - - 'doctor-profiling-{stream}' + - 'doctor-{task}-{installer}-{inspector}-{stream}': - job-template: name: 'doctor-verify-{stream}' @@ -71,7 +78,7 @@ - shell: "[ -e tests/run.sh ] && bash -n ./tests/run.sh" - job-template: - name: 'doctor-verify-{installer}-{inspector}-{stream}' + name: 'doctor-{task}-{installer}-{inspector}-{stream}' node: '{slave-label}' @@ -107,7 +114,7 @@ default: '{project}' - string: name: TESTCASE_OPTIONS - default: '-e INSPECTOR_TYPE={inspector} -v $WORKSPACE:/home/opnfv/repos/doctor' + default: '-e INSPECTOR_TYPE={inspector} -e PROFILER_TYPE={profiler} -v $WORKSPACE:/home/opnfv/repos/doctor' description: 'Addtional parameters specific to test case(s)' # functest-parameter - string: @@ -131,32 +138,9 @@ - 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: '{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 + - '{auto-trigger-name}': + project: '{project}' + branch: '{branch}' builders: - 'functest-suite-builder' @@ -172,65 +156,36 @@ - archive: artifacts: 'tests/*.log' -- job-template: - name: 'doctor-profiling-{stream}' - - disabled: '{obj:disabled}' - - parameters: - - 'doctor-defaults': - project: '{project}' - branch: '{branch}' - - string: - name: PROFILER - default: poc - description: "Profiler to be used" - - scm: - - git-scm-gerrit - - triggers: - - 'experimental': - project: '{project}' - branch: '{branch}' - -##################################### -# parameter macros -##################################### -# TODO(yujunz) replace common parameter in doctor-verify-{stream} with macro -- parameter: - name: 'doctor-defaults' - parameters: - - project-parameter: - project: '{project}' - - gerrit-parameter: - branch: '{branch}' - - 'opnfv-build-ubuntu-defaults' ##################################### # trigger macros ##################################### -# TODO(yujunz) move to opnfv commom - trigger: - name: 'experimental' + name: 'doctor-verify' 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: 'check-experimental' + comment-contains-value: 'reverify' projects: - - project-compare-type: 'ANT' - project-pattern: '{project}' - branches: - - branch-compare-type: 'ANT' - branch-pattern: '**/{branch}' - file-paths: - - compare-type: 'ANT' - pattern: 'tests/**' + - 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 - silent-start: true diff --git a/jjb/fuel/fuel-daily-jobs.yml b/jjb/fuel/fuel-daily-jobs.yml index 87488c886..cd22c1ac2 100644 --- a/jjb/fuel/fuel-daily-jobs.yml +++ b/jjb/fuel/fuel-daily-jobs.yml @@ -15,10 +15,10 @@ branch: '{stream}' disabled: false gs-pathname: '' - colorado: &colorado - stream: colorado + danube: &danube + stream: danube branch: 'stable/{stream}' - disabled: false + disabled: true gs-pathname: '/{stream}' #-------------------------------- # POD, INSTALLER, AND BRANCH MAPPING @@ -34,10 +34,10 @@ <<: *master - baremetal: slave-label: fuel-baremetal - <<: *colorado + <<: *danube - virtual: slave-label: fuel-virtual - <<: *colorado + <<: *danube #-------------------------------- # None-CI PODs #-------------------------------- @@ -52,10 +52,10 @@ <<: *master - zte-pod1: slave-label: zte-pod1 - <<: *colorado + <<: *danube - zte-pod3: slave-label: zte-pod3 - <<: *colorado + <<: *danube #-------------------------------- # scenarios #-------------------------------- @@ -340,81 +340,81 @@ triggers: - timed: '' #----------------------------------------------- -# Triggers for job running on fuel-baremetal against colorado branch +# Triggers for job running on fuel-baremetal against danube branch #----------------------------------------------- # HA Scenarios - trigger: - name: 'fuel-os-nosdn-nofeature-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 20 * * *' - trigger: - name: 'fuel-os-odl_l2-nofeature-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 23 * * *' - trigger: - name: 'fuel-os-odl_l3-nofeature-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 2 * * *' - trigger: - name: 'fuel-os-onos-sfc-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 5 * * *' - trigger: - name: 'fuel-os-onos-nofeature-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 8 * * *' - trigger: - name: 'fuel-os-odl_l2-sfc-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 11 * * *' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 14 * * *' - trigger: - name: 'fuel-os-nosdn-kvm-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 17 * * *' - trigger: - name: 'fuel-os-nosdn-ovs-ha-baremetal-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-ha-baremetal-daily-danube-trigger' triggers: - timed: '0 20 * * *' # NOHA Scenarios - trigger: - name: 'fuel-os-nosdn-nofeature-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l3-nofeature-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-noha-baremetal-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-ovs-noha-baremetal-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-noha-baremetal-daily-danube-trigger' triggers: - timed: '' #----------------------------------------------- @@ -494,79 +494,79 @@ triggers: - timed: '5 9 * * *' #----------------------------------------------- -# Triggers for job running on fuel-virtual against colorado branch +# Triggers for job running on fuel-virtual against danube branch #----------------------------------------------- - trigger: - name: 'fuel-os-nosdn-nofeature-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l3-nofeature-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-ha-virtual-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-ovs-ha-virtual-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-ha-virtual-daily-danube-trigger' triggers: - timed: '' # NOHA Scenarios - trigger: - name: 'fuel-os-nosdn-nofeature-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-noha-virtual-daily-danube-trigger' triggers: - timed: '0 13 * * *' - trigger: - name: 'fuel-os-odl_l2-nofeature-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-noha-virtual-daily-danube-trigger' triggers: - timed: '30 15 * * *' - trigger: - name: 'fuel-os-odl_l3-nofeature-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-noha-virtual-daily-danube-trigger' triggers: - timed: '0 18 * * *' - trigger: - name: 'fuel-os-onos-sfc-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-noha-virtual-daily-danube-trigger' triggers: - timed: '30 20 * * *' - trigger: - name: 'fuel-os-onos-nofeature-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-noha-virtual-daily-danube-trigger' triggers: - timed: '0 23 * * *' - trigger: - name: 'fuel-os-odl_l2-sfc-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-noha-virtual-daily-danube-trigger' triggers: - timed: '30 1 * * *' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-noha-virtual-daily-danube-trigger' triggers: - timed: '0 4 * * *' - trigger: - name: 'fuel-os-nosdn-kvm-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-noha-virtual-daily-danube-trigger' triggers: - timed: '30 6 * * *' - trigger: - name: 'fuel-os-nosdn-ovs-noha-virtual-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-noha-virtual-daily-danube-trigger' triggers: - timed: '0 9 * * *' #----------------------------------------------- @@ -799,231 +799,231 @@ triggers: - timed: '' #----------------------------------------------- -# ZTE POD1 Triggers running against colorado branch +# ZTE POD1 Triggers running against danube branch #----------------------------------------------- - trigger: - name: 'fuel-os-nosdn-nofeature-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '0 2 * * *' - trigger: - name: 'fuel-os-odl_l3-nofeature-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-ovs-ha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-ha-zte-pod1-daily-danube-trigger' triggers: - timed: '' # NOHA Scenarios - trigger: - name: 'fuel-os-nosdn-nofeature-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l3-nofeature-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-ovs-noha-zte-pod1-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-noha-zte-pod1-daily-danube-trigger' triggers: - timed: '' #----------------------------------------------- -# ZTE POD2 Triggers running against colorado branch +# ZTE POD2 Triggers running against danube branch #----------------------------------------------- - trigger: - name: 'fuel-os-nosdn-nofeature-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l3-nofeature-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-ovs-ha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-ha-zte-pod2-daily-danube-trigger' triggers: - timed: '' # NOHA Scenarios - trigger: - name: 'fuel-os-nosdn-nofeature-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l3-nofeature-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-ovs-noha-zte-pod2-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-noha-zte-pod2-daily-danube-trigger' triggers: - timed: '' #----------------------------------------------- -# ZTE POD3 Triggers running against colorado branch +# ZTE POD3 Triggers running against danube branch #----------------------------------------------- - trigger: - name: 'fuel-os-nosdn-nofeature-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l3-nofeature-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '0 18 * * *' - trigger: - name: 'fuel-os-nosdn-ovs-ha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-ha-zte-pod3-daily-danube-trigger' triggers: - timed: '' # NOHA Scenarios - trigger: - name: 'fuel-os-nosdn-nofeature-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-nosdn-nofeature-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-nofeature-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l2-nofeature-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l3-nofeature-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l3-nofeature-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-sfc-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-onos-sfc-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-onos-nofeature-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-onos-nofeature-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-sfc-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l2-sfc-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-odl_l2-bgpvpn-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-odl_l2-bgpvpn-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-kvm-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-nosdn-kvm-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' - trigger: - name: 'fuel-os-nosdn-ovs-noha-zte-pod3-daily-colorado-trigger' + name: 'fuel-os-nosdn-ovs-noha-zte-pod3-daily-danube-trigger' triggers: - timed: '' diff --git a/jjb/fuel/fuel-plugin-build.sh b/jjb/fuel/fuel-plugin-build.sh deleted file mode 100755 index f7f613dc0..000000000 --- a/jjb/fuel/fuel-plugin-build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -if [[ "$JOB_NAME" =~ (verify|merge|daily|weekly) ]]; then - JOB_TYPE=${BASH_REMATCH[0]} -else - echo "Unable to determine job type!" - exit 1 -fi - -echo "Not activated!" diff --git a/jjb/fuel/fuel-plugin-test.sh b/jjb/fuel/fuel-plugin-test.sh deleted file mode 100755 index f7f613dc0..000000000 --- a/jjb/fuel/fuel-plugin-test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -if [[ "$JOB_NAME" =~ (verify|merge|daily|weekly) ]]; then - JOB_TYPE=${BASH_REMATCH[0]} -else - echo "Unable to determine job type!" - exit 1 -fi - -echo "Not activated!" diff --git a/jjb/fuel/fuel-plugin-verify-jobs.yml b/jjb/fuel/fuel-plugin-verify-jobs.yml deleted file mode 100644 index bf847edfe..000000000 --- a/jjb/fuel/fuel-plugin-verify-jobs.yml +++ /dev/null @@ -1,236 +0,0 @@ -- project: - name: 'fuel-plugin-verify-jobs' - - project: 'fuel-plugin' - - installer: 'fuel' -##################################### -# branch definitions -##################################### - stream: - - master: - upstream-branch: '{stream}' - opnfv-branch: 'experimental' - gs-pathname: '' - disabled: false -##################################### -# patch verification phases -##################################### - phase: - - 'build': - slave-label: 'opnfv-build-ubuntu' - - 'test': - slave-label: 'opnfv-build-ubuntu' -##################################### -# jobs -##################################### - jobs: - - 'fuel-verify-plugin-{stream}' - - 'fuel-verify-plugin-{phase}-{stream}' -##################################### -# job templates -##################################### -- job-template: - name: 'fuel-verify-plugin-{stream}' - - project-type: multijob - - disabled: '{obj:disabled}' - - concurrent: true - - properties: - - throttle: - enabled: true - max-total: 4 - option: 'project' - - parameters: - - project-parameter: - project: '{project}' - - gerrit-parameter: - branch: '{upstream-branch}' - description: 'OpenStack branch to use' - - string: - name: OPNFV_BRANCH - default: '{opnfv-branch}' - description: 'OPNFV branch to use' - - 'opnfv-build-defaults' - - 'fuel-verify-plugin-defaults': - gs-pathname: '{gs-pathname}' - - scm: - - git: - url: 'https://git.openstack.org/$GERRIT_PROJECT' - refspec: '$GERRIT_REFSPEC' - branches: - - 'origin/$GERRIT_BRANCH' - skip-tag: true - choosing-strategy: 'gerrit' - timeout: 10 - wipe-workspace: true - - wrappers: - - ssh-agent-wrapper - - timeout: - timeout: 360 - fail: true - - triggers: - - gerrit: - server-name: 'review.openstack.org' - silent-start: false - skip-vote: - successful: true - failed: true - unstable: true - notbuilt: true - escape-quotes: true - trigger-on: - - patchset-created-event: - exclude-drafts: 'false' - exclude-trivial-rebase: 'false' - exclude-no-code-change: 'false' - - comment-added-contains-event: - comment-contains-value: 'recheck' - - comment-added-contains-event: - comment-contains-value: 'reverify' - projects: - - project-compare-type: 'PLAIN' - project-pattern: 'openstack/fuel-plugin-bgpvpn' - branches: - - branch-compare-type: 'ANT' - branch-pattern: '**/{upstream-branch}' - forbidden-file-paths: - - compare-type: ANT - pattern: 'README.md|.gitignore|.gitreview' - - project-compare-type: 'PLAIN' - project-pattern: 'openstack/fuel-plugin-onos' - branches: - - branch-compare-type: 'ANT' - branch-pattern: '**/{upstream-branch}' - forbidden-file-paths: - - compare-type: ANT - pattern: 'README.md|.gitignore|.gitreview' - readable-message: true - - builders: - - description-setter: - description: "Built on $NODE_NAME" - - multijob: - name: build - condition: SUCCESSFUL - projects: - - name: 'fuel-verify-plugin-build-{stream}' - current-parameters: false - predefined-parameters: | - GERRIT_PROJECT=$GERRIT_PROJECT - 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 - - multijob: - name: test - condition: SUCCESSFUL - projects: - - name: 'fuel-verify-plugin-test-{stream}' - current-parameters: false - predefined-parameters: | - GERRIT_PROJECT=$GERRIT_PROJECT - 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 - -- job-template: - name: 'fuel-verify-plugin-{phase}-{stream}' - - disabled: '{obj:disabled}' - - concurrent: true - - properties: - - throttle: - enabled: true - max-total: 6 - option: 'project' - - build-blocker: - use-build-blocker: true - blocking-jobs: - - 'fuel-verify-plugin-test-.*' - block-level: 'NODE' - - parameters: - - project-parameter: - project: '{project}' - - gerrit-parameter: - branch: '{upstream-branch}' - description: 'OpenStack branch to use' - - string: - name: OPNFV_BRANCH - default: '{opnfv-branch}' - description: 'OPNFV branch to use' - - '{slave-label}-defaults' - - '{installer}-defaults' - - 'fuel-verify-plugin-defaults': - gs-pathname: '{gs-pathname}' - - scm: - - git: - url: 'https://git.openstack.org/$GERRIT_PROJECT' - refspec: '$GERRIT_REFSPEC' - branches: - - 'origin/$GERRIT_BRANCH' - skip-tag: true - choosing-strategy: 'gerrit' - timeout: 10 - wipe-workspace: true - - wrappers: - - ssh-agent-wrapper - - timeout: - timeout: 360 - fail: true - - builders: - - description-setter: - description: "Built on $NODE_NAME" - - 'fuel-verify-plugin-{phase}-macro' -##################################### -# builder macros -##################################### -- builder: - name: 'fuel-verify-plugin-build-macro' - builders: - - shell: - !include-raw: ./fuel-plugin-build.sh - -- builder: - name: 'fuel-verify-plugin-test-macro' - builders: - - shell: - !include-raw: ./fuel-plugin-test.sh -##################################### -# parameter macros -##################################### -- parameter: - name: 'fuel-verify-plugin-defaults' - parameters: - - string: - name: BUILD_DIRECTORY - default: $WORKSPACE/build_output - description: "Directory where the build artifact will be located upon the completion of the build." - - string: - name: CACHE_DIRECTORY - default: $HOME/opnfv/cache/$INSTALLER_TYPE - description: "Directory where the cache to be used during the build is located." - - string: - name: GS_URL - default: artifacts.opnfv.org/$PROJECT{gs-pathname} - description: "URL to Google Storage." diff --git a/jjb/fuel/fuel-project-jobs.yml b/jjb/fuel/fuel-project-jobs.yml index 8fdf8deae..731b9bd0d 100644 --- a/jjb/fuel/fuel-project-jobs.yml +++ b/jjb/fuel/fuel-project-jobs.yml @@ -13,10 +13,10 @@ branch: '{stream}' gs-pathname: '' disabled: false - - colorado: + - danube: branch: 'stable/{stream}' gs-pathname: '/{stream}' - disabled: false + disabled: true jobs: - 'fuel-build-daily-{stream}' diff --git a/jjb/fuel/fuel-verify-jobs.yml b/jjb/fuel/fuel-verify-jobs.yml index 4a76d9da7..c5f913e49 100644 --- a/jjb/fuel/fuel-verify-jobs.yml +++ b/jjb/fuel/fuel-verify-jobs.yml @@ -12,10 +12,10 @@ branch: '{stream}' gs-pathname: '' disabled: false - - colorado: + - danube: branch: 'stable/{stream}' gs-pathname: '/{stream}' - disabled: false + disabled: true ##################################### # patch verification phases ##################################### diff --git a/jjb/global/releng-macros.yml b/jjb/global/releng-macros.yml index 10835f6a3..404c3dd69 100644 --- a/jjb/global/releng-macros.yml +++ b/jjb/global/releng-macros.yml @@ -96,6 +96,30 @@ - branch-compare-type: 'ANT' branch-pattern: '**/{branch}' +- trigger: + name: '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 + silent-start: true + - wrapper: name: ssh-agent-wrapper wrappers: diff --git a/jjb/global/slave-params.yml b/jjb/global/slave-params.yml index 39a1b1b9c..9d08487a3 100644 --- a/jjb/global/slave-params.yml +++ b/jjb/global/slave-params.yml @@ -364,6 +364,20 @@ default: /root/.ssh/id_rsa description: 'SSH key to use for Apex' - parameter: + name: 'intel-pod9-defaults' + parameters: + - node: + name: SLAVE_NAME + description: 'Slave name on Jenkins' + allowed-slaves: + - intel-pod9 + default-slaves: + - intel-pod9 + - string: + name: GIT_BASE + default: https://gerrit.opnfv.org/gerrit/$PROJECT + description: 'Git URL to use on this Jenkins Slave' +- parameter: name: 'intel-pod3-defaults' parameters: - node: diff --git a/jjb/infra/bifrost-upload-logs.sh b/jjb/infra/bifrost-upload-logs.sh deleted file mode 100755 index 22d45bdda..000000000 --- a/jjb/infra/bifrost-upload-logs.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -# SPDX-license-identifier: Apache-2.0 -############################################################################## -# Copyright (c) 2016 SUSE. -# 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 -eu -set -o pipefail - -BIFROST_CONSOLE_LOG="${BUILD_URL}/consoleText" -BIFROST_GS_URL=${BIFROST_LOG_URL/http:/gs:} -BIFROST_COMPRESS_SUFFIX="tar.gz" -BIFROST_COMPRESSED_LOGS=() - -echo "Uploading build logs to ${BIFROST_LOG_URL}" - -echo "Uploading console output" -curl -L ${BIFROST_CONSOLE_LOG} | gsutil cp - ${BIFROST_GS_URL}/console.txt - -[[ ! -d ${WORKSPACE}/logs ]] && exit 0 - -pushd ${WORKSPACE}/logs/ &> /dev/null -for x in *.log; do - echo "Compressing and uploading $x" - tar -czf - $x | gsutil cp - ${BIFROST_GS_URL}/${x}.${BIFROST_COMPRESS_SUFFIX} 1>/dev/null - BIFROST_COMPRESSED_LOGS+=(${x}.${BIFROST_COMPRESS_SUFFIX}) -done -popd &> /dev/null - -echo "Generating the landing page" -cat > index.html << EOF -<html> -<h1>Build results for $GERRIT_NAME/$GERRIT_CHANGE_NUMBER/$GERRIT_PATCHSET_NUMBER</h1> -<h2>Job: $JOB_NAME</h2> -<ul> -<li><a href=${BIFROST_LOG_URL}/console.txt>console.txt</a></li> -EOF - -for x in ${BIFROST_COMPRESSED_LOGS[@]}; do - echo "<li><a href=${BIFROST_LOG_URL}/${x}>${x}</a></li>" >> index.html -done - -cat >> index.html << EOF -</ul> -</html> -EOF diff --git a/jjb/infra/bifrost-verify-jobs.yml b/jjb/infra/bifrost-verify-jobs.yml index 6232859ee..8184b6343 100644 --- a/jjb/infra/bifrost-verify-jobs.yml +++ b/jjb/infra/bifrost-verify-jobs.yml @@ -142,7 +142,6 @@ builders: - bifrost-set-name - bifrost-build - - bifrost-artifacts-upload publishers: - email: @@ -220,9 +219,3 @@ builders: - shell: !include-raw: ./bifrost-verify.sh - -- builder: - name: bifrost-artifacts-upload - builders: - - shell: - !include-raw: ./bifrost-upload-logs.sh diff --git a/jjb/infra/bifrost-verify.sh b/jjb/infra/bifrost-verify.sh index 9fbb1d0d9..dbe39762c 100755 --- a/jjb/infra/bifrost-verify.sh +++ b/jjb/infra/bifrost-verify.sh @@ -11,7 +11,51 @@ set -o errexit set -o nounset set -o pipefail -trap fix_ownership EXIT +trap cleanup_and_upload EXIT + +function upload_logs() { + BIFROST_CONSOLE_LOG="${BUILD_URL}/consoleText" + BIFROST_GS_URL=${BIFROST_LOG_URL/http:/gs:} + + echo "Uploading build logs to ${BIFROST_LOG_URL}" + + echo "Uploading console output" + curl -s -L ${BIFROST_CONSOLE_LOG} > ${WORKSPACE}/build_log.txt + gsutil -q cp -Z ${WORKSPACE}/build_log.txt ${BIFROST_GS_URL}/build_log.txt + rm ${WORKSPACE}/build_log.txt + + [[ ! -d ${WORKSPACE}/logs ]] && exit 0 + + pushd ${WORKSPACE}/logs/ &> /dev/null + for x in *.log; do + echo "Compressing and uploading $x" + gsutil -q cp -Z ${x} ${BIFROST_GS_URL}/${x} + done + + echo "Generating the landing page" + cat > index.html <<EOF +<html> +<h1>Build results for <a href=https://$GERRIT_NAME/#/c/$GERRIT_CHANGE_NUMBER/$GERRIT_PATCHSET_NUMBER>$GERRIT_NAME/$GERRIT_CHANGE_NUMBER/$GERRIT_PATCHSET_NUMBER</a></h1> +<h2>Job: $JOB_NAME</h2> +<ul> +<li><a href=${BIFROST_LOG_URL}/build_log.txt>build_log.txt</a></li> +EOF + + for x in *.log; do + echo "<li><a href=${BIFROST_LOG_URL}/${x}>${x}</a></li>" >> index.html + done + + cat >> index.html << EOF +</ul> +</html> +EOF + + gsutil -q cp index.html ${BIFROST_GS_URL}/index.html + + rm index.html + + popd &> /dev/null +} function fix_ownership() { if [ -z "${JOB_URL+x}" ]; then @@ -25,6 +69,13 @@ function fix_ownership() { fi } +function cleanup_and_upload() { + original_exit=$? + fix_ownership + upload_logs + exit $original_exit +} + # check distro to see if we support it if [[ ! "$DISTRO" =~ (trusty|centos7|suse) ]]; then echo "Distro $DISTRO is not supported!" diff --git a/jjb/releng/testapi-automate.yml b/jjb/releng/testapi-automate.yml index 0566c3fd6..c03835279 100644 --- a/jjb/releng/testapi-automate.yml +++ b/jjb/releng/testapi-automate.yml @@ -6,9 +6,50 @@ gs-pathname: '' jobs: - 'testapi-automate-{stream}' + - 'testapi-verify-{stream}' + project: 'releng' - job-template: + name: 'testapi-verify-{stream}' + + parameters: + - project-parameter: + project: '{project}' + - gerrit-parameter: + branch: '{branch}' + - 'opnfv-build-ubuntu-defaults' + + scm: + - git-scm + + 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: '{project}' + branches: + - branch-compare-type: 'ANT' + branch-pattern: '**/{branch}' + file-paths: + - compare-type: 'ANT' + pattern: 'utils/**' + + builders: + - run-unit-tests + +- job-template: name: 'testapi-automate-{stream}' parameters: @@ -16,6 +57,10 @@ project: '{project}' - gerrit-parameter: branch: '{branch}' + - string: + name: DOCKER_TAG + default: "latest" + description: "Tag name for testapi docker image" - 'opnfv-build-defaults' scm: @@ -39,6 +84,7 @@ pattern: 'utils/**' builders: + - docker-update - start-testapi-server - testapi-doc-build - upload-doc-artifact @@ -49,10 +95,16 @@ ################################ - builder: - name: testapi-doc-build + name: run-unit-tests builders: - shell: | - bash ./utils/test/testapi/htmlize/doc-build.sh + bash ./jjb/releng/testapi-run-tests.sh + +- builder: + name: docker-update + builders: + - shell: | + bash ./jjb/releng/testapi-docker-update.sh - builder: name: start-testapi-server @@ -61,13 +113,19 @@ bash ./utils/test/testapi/htmlize/prepare.sh - builder: - name: clean-testapi-server + name: testapi-doc-build builders: - shell: | - bash ./utils/test/testapi/htmlize/finish.sh + bash ./utils/test/testapi/htmlize/doc-build.sh - builder: name: upload-doc-artifact builders: - shell: | bash ./utils/test/testapi/htmlize/push-doc-artifact.sh + +- builder: + name: clean-testapi-server + builders: + - shell: | + bash ./utils/test/testapi/htmlize/finish.sh diff --git a/jjb/releng/testapi-docker-update.sh b/jjb/releng/testapi-docker-update.sh new file mode 100644 index 000000000..84f5c3217 --- /dev/null +++ b/jjb/releng/testapi-docker-update.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -o errexit +set -o nounset + +cd $WORKSPACE/utils/test/testapi/docker/ + +# Remove previous containers +docker ps -a | grep "opnfv/testapi" | awk '{ print $1 }' | xargs -r docker rm -f + +# Remove previous images +docker images | grep "opnfv/testapi" | awk '{ print $3 }' | xargs -r docker rmi -f + +# Start build +docker build --no-cache -t opnfv/testapi:$DOCKER_TAG . + +# Push Image +docker push opnfv/testapi:$DOCKER_TAG diff --git a/jjb/releng/testapi-run-tests.sh b/jjb/releng/testapi-run-tests.sh new file mode 100644 index 000000000..47691ed04 --- /dev/null +++ b/jjb/releng/testapi-run-tests.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -o errexit + +echo "Running unit tests..." + +# Creating virtual environment +virtualenv $WORKSPACE/testapi_test_venv +source $WORKSPACE/testapi_test_venv/bin/activate + +cd $WORKSPACE/utils/test/testapi/ + +# Install requirements +pip install -r requirements.txt +pip install -r test-requirements.txt + +# Run unit tests +bash run_test.sh diff --git a/jjb/storperf/storperf.yml b/jjb/storperf/storperf.yml index 902fff999..8f42f8c06 100644 --- a/jjb/storperf/storperf.yml +++ b/jjb/storperf/storperf.yml @@ -144,15 +144,14 @@ # Required Variables: # stream: branch with - in place of / (eg. stable) # branch: branch (eg. stable) - node: storperf-pod - - disabled: false + disabled: '{obj:disabled}' parameters: - project-parameter: project: '{project}' - gerrit-parameter: branch: '{branch}' + - 'intel-pod9-defaults' scm: - git-scm diff --git a/utils/push-test-logs.sh b/utils/push-test-logs.sh index 733ffbcb5..265ca6120 100644 --- a/utils/push-test-logs.sh +++ b/utils/push-test-logs.sh @@ -23,11 +23,12 @@ dir_result="${HOME}/opnfv/$project/results/${branch}" node_list=(\ 'lf-pod1' 'lf-pod2' 'intel-pod2' 'intel-pod3' \ 'intel-pod5' 'intel-pod6' 'intel-pod7' 'intel-pod8' \ -'ericsson-pod2' 'ericsson-pod3' 'ericsson-pod4' \ +'ericsson-pod1' 'ericsson-pod2' \ 'ericsson-virtual1' 'ericsson-virtual2' 'ericsson-virtual3' \ 'ericsson-virtual4' 'ericsson-virtual5' \ 'arm-pod1' 'arm-pod3' \ 'huawei-pod1' 'huawei-pod2' 'huawei-pod3' 'huawei-pod4' 'huawei-pod5' \ +'huawei-pod6' 'huawei-pod7' \ 'huawei-virtual1' 'huawei-virtual2' 'huawei-virtual3' 'huawei-virtual4') diff --git a/utils/test/declaration/addtestcase.php b/utils/test/declaration/addtestcase.php deleted file mode 100644 index 0e5bed689..000000000 --- a/utils/test/declaration/addtestcase.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php -function sendPostData($url, $post){ - $ch = curl_init($url); - $headers= array('Accept: application/json','Content-Type: application/json'); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - curl_setopt($ch, CURLOPT_POSTFIELDS,$post); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); - $result = curl_exec($ch); - curl_close($ch); - return $result; -} - -if(isset($_REQUEST['url'])){ - $url=$_REQUEST['url']; -} -if(isset($_REQUEST['name'])){ - $name=$_REQUEST['name']; -} -if(isset($_REQUEST['desc'])){ - $desc=$_REQUEST['desc']; -} -if(isset($_REQUEST['project'])){ - - $url_send=$_REQUEST['project']; - $url_send="http://testresults.opnfv.org:80/test/api/v1/projects/".$url_send."/cases"; - $str_data=array('url'=>$url,'name'=>$name,'description'=>$desc); - $str_data=json_encode($str_data); - $res=sendPostData($url_send, $str_data); - echo '<div class="alert alert-success"> <strong>Success!</strong> Added New test Case </div>'; - -}else{ - - echo '<div class="alert alert-danger"> <strong>Error!</strong> Failed to Add New test Case </div>'; - -} - -?> - diff --git a/utils/test/declaration/index.php b/utils/test/declaration/index.php deleted file mode 100644 index b2c5d0370..000000000 --- a/utils/test/declaration/index.php +++ /dev/null @@ -1,221 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <title>OPNFV DashBoard</title> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> - <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> - <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> -<script> -$(function() { - - $('form#new_testcase').on('submit', function(){ - var selected = $('select#sel_pro2').find("option:selected").val(); - var uri = $('input#uri').val(); - var name = $('input#name').val(); - var desc = $('textarea#desc').val(); - var new_url="http://testresults.opnfv.org:80/test/api/v1/projects/"+selected+"/cases"; - $.post("addtestcase.php", {"project":selected,"url":uri,"name":name,"description":desc}, function(result){ - $("div#result").html(result); - }); - }); - -}); - -$(function() { - - $('select#sel1').on('change', function(){ - var selected = $(this).find("option:selected").val(); - var new_url="http://testresults.opnfv.org:80/test/api/v1/projects/"+selected+"/cases"; - //$.post('testcases.php', {project: selected}); - console.log(selected); - $.post("testcases.php", {project: selected}, function(result){ - $("div#4a").html(result); - }); - - }); - -}); -</script> -<style> -body { - padding : 10px ; -} - -#exTab1 .tab-content { - color : black; - padding : 5px 15px; -} - -#exTab2 h3 { - color : white; - background-color: #428bca; - padding : 5px 15px; -} - -/* remove border radius for the tab */ - -#exTab1 .nav-pills > li > a { - border-radius: 0; -} - -/* change border radius for the tab , apply corners on top*/ - -#exTab3 .nav-pills > li > a { - border-radius: 4px 4px 0 0 ; -} - -#exTab3 .tab-content { - color : white; - background-color: #428bca; - padding : 5px 15px; -} - -</style> -</head> -<body> - -<div class="container"> - <h1>OPNFV DASHBOARD: </h1></div> -<div id="exTab1" class="container"> - <ul class="nav nav-pills"> - <li class="active"> - <a href="#1a" data-toggle="tab">PODS</a> - </li> - <li><a href="#2a" data-toggle="tab">PROJECTS</a> - </li> - <li><a href="#3a" data-toggle="tab">TESTCASES</a> - </li> - <li><a href="#5a" data-toggle="tab">ADD TESTCASE</a> - </li> - <li><a href="http://testresults.opnfv.org/kibana_dashboards/" >RESULTS</a> - </li> - </ul> - <div class="tab-content clearfix"> - <div class="tab-pane active" id="1a"> - <table class="table table-striped"> - <thead> - <tr> - <th>#</th> - <th>Pod Name</th> - <th>Creation Date</th> - <th>Role</th> - <th>Mode</th> - </tr> - </thead> - <?php - $url = "http://testresults.opnfv.org:80/test/api/v1/pods"; - $response = file_get_contents($url); - $data = json_decode($response); - $pods = $data->pods; - $i=1; - foreach ( $pods as $pod ){ - - $column_str=""; - $column_str="<tr><td>".$i."</td>"; - $column_str=$column_str."<td>".$pod->name."</td>"; - $column_str= $column_str."<td>".$pod->creation_date."</td>"; - $column_str= $column_str."<td>".$pod->role."</td>"; - $column_str= $column_str."<td>".$pod->mode."</td>"; - $column_str= $column_str."</tr>"; - echo $column_str; - $i=$i+1; - } - ?> - </table> - </div> - <div class="tab-pane" id="2a"> - <table class="table table-striped"> - <thead> - <tr> - <th>#</th> - <th>Project</th> - <th>Creation Date</th> - </tr> - </thead> - <?php - $url = "http://testresults.opnfv.org:80/test/api/v1/projects"; - $response = file_get_contents($url); - $data = json_decode($response); - $projects=$data->projects; - $i=0; - foreach ( $projects as $project ){ - - $column_str=""; - $column_str="<tr><td>".$i."</td>"; - $column_str=$column_str."<td>".$project->name."</td>"; - $column_str= $column_str."<td>".$project->creation_date."</td>"; - $column_str= $column_str."</tr>"; - echo $column_str; - $i=$i+1; - } -?> - </table> - </div> - <div class="tab-pane" id="3a"> -<div class="form-group"> - <label for="sel1">Select list:</label> - <select class="form-control" id="sel1"> -<?php - $url = "http://testresults.opnfv.org:80/test/api/v1/projects"; - $response = file_get_contents($url); - $data = json_decode($response); - $projects=$data->projects; - $i=0; - $firstvalue=$projects[0]->name; - foreach ( $projects as $project ){ - $column_str=""; - $column_str="<option>".$project->name."</option>"; - echo $column_str; - } - -?> -</select> -</div> - <div class="tab-pane" id="4a"> - <?php - require "testcases.php"; - ?> - </div> - </div> - <div class="tab-pane" id="5a"> - <form role="form" id="new_testcase"> -<div class="form-group"> - <label for="sel1">Select list:</label> - <select class="form-control" id="sel_pro2"> -<?php - $url = "http://testresults.opnfv.org:80/test/api/v1/projects"; - $response = file_get_contents($url); - $data = json_decode($response); - $projects=$data->projects; - $i=0; - $firstvalue=$projects[0]->name; - foreach ( $projects as $project ){ - $column_str=""; - $column_str="<option>".$project->name."</option>"; - echo $column_str; - } -?> -</select> -</div> -<div class="form-group"> <!-- Name field --> - <label class="control-label " for="name">TestCase URI</label> - <input class="form-control" id="uri" name="uri" type="text"/> - </div> -<div class="form-group"> <!-- Name field --> - <label class="control-label " for="name">TestCase Name</label> - <input class="form-control" id="name" name="name" type="text"/> - </div> -<div class="form-group"> <!-- Name field --> - <label class="control-label " for="name">Description</label> - <textarea class="form-control" rows="5" id="desc"></textarea> - </div> - <button type="submit" class="btn btn-default">Submit</button> -</form> - </div> -<div class="container" id="result"></div> - </div> -</div> -</body> -</html> diff --git a/utils/test/declaration/testcases.php b/utils/test/declaration/testcases.php deleted file mode 100644 index 20645807e..000000000 --- a/utils/test/declaration/testcases.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - if(isset($_REQUEST['project'])){ - $selected=$_REQUEST['project']; - } - else{ - $url = "http://testresults.opnfv.org:80/test/api/v1/projects"; - $response = file_get_contents($url); - $data = json_decode($response); - $projects=$data->projects; - $selected=$projects[0]->name; - } - $new_url="http://testresults.opnfv.org:80/test/api/v1/projects/".$selected."/cases"; - $response = file_get_contents($new_url); - $data = json_decode($response); - $testcases=$data->testcases; - $i=0; - $column_str=""; - $column_str=$column_str."<table class=\"table table-striped\"><tr>"; - $column_str=$column_str."<th>#</th><th>Test Case Name</th>"; - $column_str=$column_str."<th>Creation Date</th>"; - $column_str=$column_str."<th>Description</th></tr>"; - foreach ( $testcases as $testcase ){ - $i=$i+1; - $column_str=$column_str."<tr>"; - $column_str=$column_str."<td>".$i."</td>"; - $column_str=$column_str."<td>".$testcase->name."</td>"; - $column_str=$column_str."<td>".$testcase->creation_date."</td>"; - $column_str=$column_str."<td>".$testcase->description."</td>"; - $column_str=$column_str."</tr>"; - - } - $column_str=$column_str."</table>"; - echo $column_str; - -?> - diff --git a/utils/test/testapi/htmlize/doc-build.sh b/utils/test/testapi/htmlize/doc-build.sh index e492c97b5..427b4378b 100644 --- a/utils/test/testapi/htmlize/doc-build.sh +++ b/utils/test/testapi/htmlize/doc-build.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -o errexit + # Create virtual environment source $WORKSPACE/testapi_venv/bin/activate diff --git a/utils/test/testapi/htmlize/htmlize.py b/utils/test/testapi/htmlize/htmlize.py index 68d02febd..c07f98ecf 100644 --- a/utils/test/testapi/htmlize/htmlize.py +++ b/utils/test/testapi/htmlize/htmlize.py @@ -28,7 +28,10 @@ def main(args): # Generating html page cmd = 'java -jar swagger-codegen-cli.jar generate \ -i specs.json -l html2 -o %s' % (args.output_directory) - os.system(cmd) + if os.system(cmd) == 0: + exit(0) + else: + exit(1) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Create \ diff --git a/utils/test/testapi/opnfv_testapi/resources/handlers.py b/utils/test/testapi/opnfv_testapi/resources/handlers.py index 9fc5d6be1..5f6c3df57 100644 --- a/utils/test/testapi/opnfv_testapi/resources/handlers.py +++ b/utils/test/testapi/opnfv_testapi/resources/handlers.py @@ -228,7 +228,7 @@ class GenericApiHandler(RequestHandler): class VersionHandler(GenericApiHandler): - @swagger.operation(nickname='List all versions') + @swagger.operation(nickname='listAllVersions') def get(self): """ @description: list all supported versions diff --git a/utils/test/testapi/opnfv_testapi/resources/pod_handlers.py b/utils/test/testapi/opnfv_testapi/resources/pod_handlers.py index 631d4a91d..e1bd9d359 100644 --- a/utils/test/testapi/opnfv_testapi/resources/pod_handlers.py +++ b/utils/test/testapi/opnfv_testapi/resources/pod_handlers.py @@ -20,7 +20,7 @@ class GenericPodHandler(GenericApiHandler): class PodCLHandler(GenericPodHandler): - @swagger.operation(nickname='List all Pods') + @swagger.operation(nickname='listAllPods') def get(self): """ @description: list all pods @@ -29,7 +29,7 @@ class PodCLHandler(GenericPodHandler): """ self._list() - @swagger.operation(nickname='Create a Pod') + @swagger.operation(nickname='createPod') def post(self): """ @description: create a pod @@ -54,7 +54,7 @@ class PodCLHandler(GenericPodHandler): class PodGURHandler(GenericPodHandler): - @swagger.operation(nickname='Get a Pod by pod_name') + @swagger.operation(nickname='getPodByName') def get(self, pod_name): """ @description: get a single pod by pod_name diff --git a/utils/test/testapi/opnfv_testapi/resources/project_handlers.py b/utils/test/testapi/opnfv_testapi/resources/project_handlers.py index 9cf698623..94c65b722 100644 --- a/utils/test/testapi/opnfv_testapi/resources/project_handlers.py +++ b/utils/test/testapi/opnfv_testapi/resources/project_handlers.py @@ -22,7 +22,7 @@ class GenericProjectHandler(GenericApiHandler): class ProjectCLHandler(GenericProjectHandler): - @swagger.operation(nickname="List all Projects") + @swagger.operation(nickname="listAllProjects") def get(self): """ @description: list all projects @@ -31,7 +31,7 @@ class ProjectCLHandler(GenericProjectHandler): """ self._list() - @swagger.operation(nickname="Create a Project") + @swagger.operation(nickname="createProject") def post(self): """ @description: create a project @@ -56,7 +56,7 @@ class ProjectCLHandler(GenericProjectHandler): class ProjectGURHandler(GenericProjectHandler): - @swagger.operation(nickname='Get a Project by project_name') + @swagger.operation(nickname='getProjectByName') 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 a Project by project_name") + @swagger.operation(nickname="updateProjectByName") 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 a Project by project_name') + @swagger.operation(nickname='deleteProjectByName') def delete(self, project_name): """ @description: delete a project by project_name diff --git a/utils/test/testapi/opnfv_testapi/resources/result_handlers.py b/utils/test/testapi/opnfv_testapi/resources/result_handlers.py index fe13c09b7..2a1ed56ee 100644 --- a/utils/test/testapi/opnfv_testapi/resources/result_handlers.py +++ b/utils/test/testapi/opnfv_testapi/resources/result_handlers.py @@ -52,7 +52,7 @@ class GenericResultHandler(GenericApiHandler): class ResultsCLHandler(GenericResultHandler): - @swagger.operation(nickname="List all Test Results") + @swagger.operation(nickname="queryTestResults") 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 a Test Result") + @swagger.operation(nickname="createTestResult") def post(self): """ @description: create a test result @@ -169,7 +169,7 @@ class ResultsCLHandler(GenericResultHandler): class ResultsGURHandler(GenericResultHandler): - @swagger.operation(nickname='Get a Test Result by result_id') + @swagger.operation(nickname='getTestResultById') 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 a Test Result by result_id") + @swagger.operation(nickname="updateTestResultById") def put(self, result_id): """ @description: update a single result by _id diff --git a/utils/test/testapi/opnfv_testapi/resources/scenario_handlers.py b/utils/test/testapi/opnfv_testapi/resources/scenario_handlers.py index 7bf3d5d53..a9b89eb89 100644 --- a/utils/test/testapi/opnfv_testapi/resources/scenario_handlers.py +++ b/utils/test/testapi/opnfv_testapi/resources/scenario_handlers.py @@ -14,18 +14,56 @@ class GenericScenarioHandler(GenericApiHandler): class ScenariosCLHandler(GenericScenarioHandler): - @swagger.operation(nickname="List scenarios by queries") + @swagger.operation(nickname="queryScenarios") def get(self): """ @description: Retrieve scenario(s). @notes: Retrieve scenario(s) - @return 200: all scenarios consist with query, + Available filters for this request are : + - name : scenario name + + GET /scenarios?name=scenario_1 + @param name: scenario name + @type name: L{string} + @in name: query + @required name: False + @param installer: installer type + @type installer: L{string} + @in installer: query + @required installer: False + @param version: version + @type version: L{string} + @in version: query + @required version: False + @param project: project name + @type project: L{string} + @in project: query + @required project: False + @return 200: all scenarios satisfy queries, empty list if no scenario is found @rtype: L{Scenarios} """ - self._list() - @swagger.operation(nickname="Create a new scenario") + def _set_query(): + query = dict() + elem_query = dict() + for k in self.request.query_arguments.keys(): + v = self.get_query_argument(k) + if k == 'installer': + elem_query["installer"] = v + elif k == 'version': + elem_query["versions.version"] = v + elif k == 'project': + elem_query["versions.projects.project"] = v + else: + query[k] = v + if elem_query: + query['installers'] = {'$elemMatch': elem_query} + return query + + self._list(_set_query()) + + @swagger.operation(nickname="createScenario") def post(self): """ @description: create a new scenario by name @@ -50,7 +88,7 @@ class ScenariosCLHandler(GenericScenarioHandler): class ScenarioGURHandler(GenericScenarioHandler): - @swagger.operation(nickname='Get the scenario by name') + @swagger.operation(nickname='getScenarioByName') def get(self, name): """ @description: get a single scenario by name @@ -58,14 +96,15 @@ class ScenarioGURHandler(GenericScenarioHandler): @return 200: scenario exist @raise 404: scenario not exist """ + self._get_one({'name': name}) pass - @swagger.operation(nickname="Update the scenario by name") + @swagger.operation(nickname="updateScenarioByName") def put(self, name): """ @description: update a single scenario by name @param body: fields to be updated - @type body: L{string} + @type body: L{ScenarioCreateRequest} @in body: body @rtype: L{Scenario} @return 200: update success diff --git a/utils/test/testapi/opnfv_testapi/resources/scenario_models.py b/utils/test/testapi/opnfv_testapi/resources/scenario_models.py index b4bb3634b..f89a12428 100644 --- a/utils/test/testapi/opnfv_testapi/resources/scenario_models.py +++ b/utils/test/testapi/opnfv_testapi/resources/scenario_models.py @@ -11,7 +11,7 @@ class ScenarioTI(models.ModelBase): @swagger.model() class ScenarioScore(models.ModelBase): - def __init__(self, date=None, score=''): + def __init__(self, date=None, score='0'): self.date = date self.score = score @@ -27,14 +27,19 @@ class ScenarioProject(models.ModelBase): @ptype trust_indicators: C{list} of L{ScenarioTI} """ def __init__(self, - name='', + project='', customs=None, scores=None, trust_indicators=None): - self.name = name + self.project = project self.customs = customs self.scores = scores - self.trust_indicator = trust_indicators + self.trust_indicators = trust_indicators + + @staticmethod + def attr_parser(): + return {'scores': ScenarioScore, + 'trust_indicators': ScenarioTI} @swagger.model() @@ -43,10 +48,14 @@ class ScenarioVersion(models.ModelBase): @property projects: @ptype projects: C{list} of L{ScenarioProject} """ - def __init__(self, version, projects=None): + def __init__(self, version=None, projects=None): self.version = version self.projects = projects + @staticmethod + def attr_parser(): + return {'projects': ScenarioProject} + @swagger.model() class ScenarioInstaller(models.ModelBase): @@ -54,11 +63,14 @@ class ScenarioInstaller(models.ModelBase): @property versions: @ptype versions: C{list} of L{ScenarioVersion} """ - def __init__(self, installer=None, owner=None, versions=None): + def __init__(self, installer=None, versions=None): self.installer = installer - self.owner = owner self.versions = versions if versions else list() + @staticmethod + def attr_parser(): + return {'versions': ScenarioVersion} + @swagger.model() class ScenarioCreateRequest(models.ModelBase): @@ -70,6 +82,10 @@ class ScenarioCreateRequest(models.ModelBase): self.name = name self.installers = installers if installers else list() + @staticmethod + def attr_parser(): + return {'installers': ScenarioInstaller} + @swagger.model() class Scenario(models.ModelBase): @@ -83,6 +99,10 @@ class Scenario(models.ModelBase): self.creation_date = create_date self.installers = installers if installers else list() + @staticmethod + def attr_parser(): + return {'installers': ScenarioInstaller} + @swagger.model() class Scenarios(models.ModelBase): diff --git a/utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py b/utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py index 3692b164f..100a4fd91 100644 --- a/utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py +++ b/utils/test/testapi/opnfv_testapi/resources/testcase_handlers.py @@ -22,7 +22,7 @@ class GenericTestcaseHandler(GenericApiHandler): class TestcaseCLHandler(GenericTestcaseHandler): - @swagger.operation(nickname="List all TestCases by project_name") + @swagger.operation(nickname="listAllTestCases") 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 a TestCase by project_name") + @swagger.operation(nickname="createTestCase") 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 a TestCase by project and case name') + @swagger.operation(nickname='getTestCaseByName') 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 a TestCase by project and case name") + @swagger.operation(nickname="updateTestCaseByName") 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 a TestCase by project and case name') + @swagger.operation(nickname='deleteTestCaseByName') def delete(self, project_name, case_name): """ @description: delete a testcase by project_name and case_name diff --git a/utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py b/utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py index d86d8eadf..3c4fd01a3 100644 --- a/utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py +++ b/utils/test/testapi/opnfv_testapi/tests/unit/fake_pymongo.py @@ -55,7 +55,8 @@ class MemCursor(object): class MemDb(object): - def __init__(self): + def __init__(self, name): + self.name = name self.contents = [] pass @@ -109,8 +110,59 @@ class MemDb(object): return True return False - @staticmethod - def _in(content, *args): + def _in(self, content, *args): + if self.name == 'scenarios': + return self._in_scenarios(content, *args) + else: + return self._in_others(content, *args) + + def _in_scenarios_installer(self, installer, content): + hit = False + for s_installer in content['installers']: + if installer == s_installer['installer']: + hit = True + + return hit + + def _in_scenarios_version(self, version, content): + hit = False + for s_installer in content['installers']: + for s_version in s_installer['versions']: + if version == s_version['version']: + hit = True + return hit + + def _in_scenarios_project(self, project, content): + hit = False + for s_installer in content['installers']: + for s_version in s_installer['versions']: + for s_project in s_version['projects']: + if project == s_project['project']: + hit = True + + return hit + + def _in_scenarios(self, content, *args): + for arg in args: + for k, v in arg.iteritems(): + if k == 'installers': + for inner in v.values(): + for i_k, i_v in inner.iteritems(): + if i_k == 'installer': + return self._in_scenarios_installer(i_v, + content) + elif i_k == 'versions.version': + return self._in_scenarios_version(i_v, + content) + elif i_k == 'versions.projects.project': + return self._in_scenarios_project(i_v, + content) + elif content.get(k, None) != v: + return False + + return True + + def _in_others(self, content, *args): for arg in args: for k, v in arg.iteritems(): if k == 'start_date': @@ -185,8 +237,8 @@ def __getattr__(name): return globals()[name] -pods = MemDb() -projects = MemDb() -testcases = MemDb() -results = MemDb() -scenarios = MemDb() +pods = MemDb('pods') +projects = MemDb('projects') +testcases = MemDb('testcases') +results = MemDb('results') +scenarios = MemDb('scenarios') diff --git a/utils/test/testapi/opnfv_testapi/tests/unit/scenario-create.json b/utils/test/testapi/opnfv_testapi/tests/unit/scenario-c1.json index eba8b6c0a..187802215 100644 --- a/utils/test/testapi/opnfv_testapi/tests/unit/scenario-create.json +++ b/utils/test/testapi/opnfv_testapi/tests/unit/scenario-c1.json @@ -35,4 +35,4 @@ ] } ] -}
\ No newline at end of file +} diff --git a/utils/test/testapi/opnfv_testapi/tests/unit/scenario-c2.json b/utils/test/testapi/opnfv_testapi/tests/unit/scenario-c2.json new file mode 100644 index 000000000..b6a3b83ab --- /dev/null +++ b/utils/test/testapi/opnfv_testapi/tests/unit/scenario-c2.json @@ -0,0 +1,73 @@ +{ + "name": "odl_2-nofeature-ha", + "installers": + [ + { + "installer": "fuel", + "versions": + [ + { + "owner": "Lucky", + "version": "colorado", + "projects": + [ + { + "project": "functest", + "customs": [ "healthcheck", "vping_ssh"], + "scores": [], + "trust_indicators": [ + { + "date": "2017-01-18 22:46:44", + "status": "silver" + } + + ] + }, + { + "project": "yardstick", + "customs": ["suite-a"], + "scores": [ + { + "date": "2017-01-08 22:46:44", + "score": "0" + } + ], + "trust_indicators": [ + { + "date": "2017-01-18 22:46:44", + "status": "gold" + } + ] + } + ] + }, + { + "owner": "Luke", + "version": "colorado", + "projects": + [ + { + "project": "functest", + "customs": [ "healthcheck", "vping_ssh"], + "scores": + [ + { + "date": "2017-01-09 22:46:44", + "score": "11/14" + } + + ], + "trust_indicators": [] + }, + { + "project": "yardstick", + "customs": [], + "scores": [], + "trust_indicators": [] + } + ] + } + ] + } + ] +} diff --git a/utils/test/testapi/opnfv_testapi/tests/unit/test_base.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_base.py index 9343ab2fb..fc780e44c 100644 --- a/utils/test/testapi/opnfv_testapi/tests/unit/test_base.py +++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_base.py @@ -47,11 +47,11 @@ class TestBase(AsyncHTTPTestCase): return self.create_help(self.basePath, req, *args) def create_help(self, uri, req, *args): - if req and not isinstance(req, str): - req = json.dumps(req.format()) + if req and not isinstance(req, str) and hasattr(req, 'format'): + req = req.format() res = self.fetch(self._update_uri(uri, *args), method='POST', - body=req if req else json.dumps(None), + body=json.dumps(req), headers=self.headers) return self._get_return(res, self.create_res) @@ -97,7 +97,7 @@ class TestBase(AsyncHTTPTestCase): return uri.count('%s') def _get_query_uri(self, query): - return self.basePath + '?' + query + return self.basePath + '?' + query if query else self.basePath def _get_uri(self, *args): return self._update_uri(self.basePath, *args) diff --git a/utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py b/utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py index 8e827813c..ff5979524 100644 --- a/utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py +++ b/utils/test/testapi/opnfv_testapi/tests/unit/test_scenario.py @@ -4,15 +4,20 @@ import os from opnfv_testapi.common.constants import HTTP_BAD_REQUEST from opnfv_testapi.common.constants import HTTP_FORBIDDEN from opnfv_testapi.common.constants import HTTP_OK +from opnfv_testapi.resources.scenario_models import Scenario from opnfv_testapi.resources.scenario_models import ScenarioCreateRequest +from opnfv_testapi.resources.scenario_models import Scenarios from test_testcase import TestBase class TestScenarioBase(TestBase): def setUp(self): super(TestScenarioBase, self).setUp() + self.get_res = Scenario + self.list_res = Scenarios self.basePath = '/api/v1/scenarios' - self.load_request('scenario-create.json') + self.req_d = self._load_request('scenario-c1.json') + self.req_2 = self._load_request('scenario-c2.json') def tearDown(self): pass @@ -20,10 +25,26 @@ class TestScenarioBase(TestBase): def assert_body(self, project, req=None): pass - def load_request(self, f_req): - with open(os.path.join(os.path.dirname(__file__), f_req), 'r') as f: - self.req_d = json.dumps(json.load(f)) + @staticmethod + def _load_request(f_req): + abs_file = os.path.join(os.path.dirname(__file__), f_req) + with open(abs_file, 'r') as f: + loader = json.load(f) f.close() + return loader + + def create_return_name(self, req): + _, res = self.create(req) + return res.href.split('/')[-1] + + def assert_res(self, code, scenario, req=None): + self.assertEqual(code, HTTP_OK) + if req is None: + req = self.req_d + scenario_dict = scenario.format_http() + self.assertIsNotNone(scenario_dict['_id']) + self.assertIsNotNone(scenario_dict['creation_date']) + self.assertDictContainsSubset(req, scenario_dict) class TestScenarioCreate(TestScenarioBase): @@ -53,3 +74,60 @@ class TestScenarioCreate(TestScenarioBase): (code, body) = self.create_d() self.assertEqual(code, HTTP_FORBIDDEN) self.assertIn('already exists', body) + + +class TestScenarioGet(TestScenarioBase): + def setUp(self): + super(TestScenarioGet, self).setUp() + self.scenario_1 = self.create_return_name(self.req_d) + self.scenario_2 = self.create_return_name(self.req_2) + + def test_getByName(self): + code, body = self.get(self.scenario_1) + self.assert_res(code, body, req=self.req_d) + + def test_getAll(self): + self._query_and_assert(query=None, reqs=[self.req_d, self.req_2]) + + def test_queryName(self): + query = self._set_query('name=nosdn-nofeature-ha') + self._query_and_assert(query, reqs=[self.req_d]) + + def test_queryInstaller(self): + query = self._set_query('installer=apex') + self._query_and_assert(query, reqs=[self.req_d]) + + def test_queryVersion(self): + query = self._set_query('version=master') + self._query_and_assert(query, reqs=[self.req_d]) + + def test_queryProject(self): + query = self._set_query('project=functest') + self._query_and_assert(query, reqs=[self.req_d, self.req_2]) + + def test_queryCombination(self): + query = self._set_query('name=nosdn-nofeature-ha', + 'installer=apex', + 'version=master', + 'project=functest') + + self._query_and_assert(query, reqs=[self.req_d]) + + @staticmethod + def _set_query(*args): + uri = '' + for arg in args: + uri += arg + '&' + return uri[0: -1] + + def _query_and_assert(self, query, found=True, reqs=None): + code, body = self.query(query) + if not found: + self.assertEqual(code, HTTP_OK) + self.assertEqual(0, len(body.scenarios)) + else: + self.assertEqual(len(reqs), len(body.scenarios)) + for req in reqs: + for scenario in body.scenarios: + if req['name'] == scenario.name: + self.assert_res(code, scenario, req) |