#!/bin/bash# Copyright (c) 2018 Cisco and/or its affiliates.# Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at:## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.set -xo pipefail
# Space separated list of available testbeds, described by topology filesTOPOLOGIES="topologies/available/lf_testbed1.yaml \ topologies/available/lf_testbed2.yaml \ topologies/available/lf_testbed3.yaml"SCRIPT_DIR="$(cd"$( dirname "${BASH_SOURCE[0]}")"&&pwd)"# Reservation dirRESERVATION_DIR="/tmp/reservation_dir"INSTALLATION_DIR="/tmp/install_dir"JOB_ARCHIVE_ARTIFACTS=(log.html output.xml report.html)LOG_ARCHIVE_ARTIFACTS=(log.html output.xml report.html)JOB_ARCHIVE_DIR="archive"LOG_ARCHIVE_DIR="$WORKSPACE/archives"
mkdir -p ${JOB_ARCHIVE_DIR}
mkdir -p ${LOG_ARCHIVE_DIR}# If we run this script from CSIT jobs we want to use stable vpp versionif[[${JOB_NAME}== csit-* ]];then
mkdir vpp_download
cd vpp_download
if[[${TEST_TAG}== *DAILY ]]||\[[${TEST_TAG}== *WEEKLY ]];then# Download the latest VPP build .deb install packagesecho Downloading VPP packages...
bash ${SCRIPT_DIR}/resources/tools/scripts/download_install_vpp_pkgs.sh --skip-install
VPP_DEBS="$( readlink -f *.deb | tr '\n'' ')"# Take vpp package and get the vpp versionVPP_STABLE_VER="$( expr match $(ls *.deb | head -n 1)'vpp-\(.*\)-deb.deb')"elseDPDK_STABLE_VER=$(cat ${SCRIPT_DIR}/DPDK_STABLE_VER)_amd64
VPP_REPO_URL=$(cat ${SCRIPT_DIR}/VPP_REPO_URL_UBUNTU)VPP_STABLE_VER=$(cat ${SCRIPT_DIR}/VPP_STABLE_VER_UBUNTU)VPP_CLASSIFIER="-deb"# Download vpp build from nexus and set VPP_DEBS variable
wget -q "${VPP_REPO_URL}/vpp/${VPP_STABLE_VER}/vpp-${VPP_STABLE_VER}${VPP_CLASSIFIER}.deb"||exit
wget -q "${VPP_REPO_URL}/vpp-dbg/${VPP_STABLE_VER}/vpp-dbg-${VPP_STABLE_VER}${VPP_CLASSIFIER}.deb"||exit
wget -q "${VPP_REPO_URL}/vpp-dev/${VPP_STABLE_VER}/vpp-dev-${VPP_STABLE_VER}${VPP_CLASSIFIER}.deb"||exit
wget -q "${VPP_REPO_URL}/vpp-dpdk-dkms/${DPDK_STABLE_VER}/vpp-dpdk-dkms-${DPDK_STABLE_VER}${VPP_CLASSIFIER}.deb"||exit
wget -q "${VPP_REPO_URL}/vpp-lib/${VPP_STABLE_VER}/vpp-lib-${VPP_STABLE_VER}${VPP_CLASSIFIER}.deb"||exit
wget -q "${VPP_REPO_URL}/vpp-plugins/${VPP_STABLE_VER}/vpp-plugins-${VPP_STABLE_VER}${VPP_CLASSIFIER}.deb"||exitVPP_DEBS="$( readlink -f *.deb | tr '\n'' ')"ficd${SCRIPT_DIR}# If we run this script from vpp project we want to use local buildelif[[${JOB_NAME}== vpp-* ]];then# Use local packages provided as argument list# Jenkins VPP deb paths (convert to full path)VPP_DEBS="$( readlink -f $@| tr '\n'' ')"# Take vpp package and get the vpp versionVPP_STABLE_VER="$( expr match $1'vpp-\(.*\)-deb.deb')"elseecho"Unable to identify job type based on JOB_NAME variable: ${JOB_NAME}"exit1fiWORKING_TOPOLOGY=""exportPYTHONPATH=${SCRIPT_DIR}
sudo apt-get -y update
sudo apt-get -y install libpython2.7-dev python-virtualenv
virtualenv --system-site-packages env
. env/bin/activate
echo pip install
pip install -r requirements.txt
# We iterate over available topologies and wait until we reserve topologywhile :;dofor TOPOLOGY in ${TOPOLOGIES};do
python ${SCRIPT_DIR}/resources/tools/scripts/topo_reservation.py -t ${TOPOLOGY}if[$? -eq 0];thenWORKING_TOPOLOGY=${TOPOLOGY}echo"Reserved: ${WORKING_TOPOLOGY}"breakfidoneif[ ! -z "${WORKING_TOPOLOGY}"];then# Exit the infinite while loop if we made a reservationbreakfi# Wait ~3minutes before next trySLEEP_TIME=$[($RANDOM % 20) + 180]s
echo"Sleeping ${SLEEP_TIME}"
sleep ${SLEEP_TIME}donefunction cancel_all {
python ${SCRIPT_DIR}/resources/tools/scripts/topo_installation.py -c -d ${INSTALLATION_DIR} -t $1
python ${SCRIPT_DIR}/resources/tools/scripts/topo_reservation.py -c -t $1}# On script exit we cancel the reservation and installation and delete all vpp# packagestrap"cancel_all ${WORKING_TOPOLOGY}" EXIT
python ${SCRIPT_DIR}/resources/tools/scripts/topo_installation.py \
-t ${WORKING_TOPOLOGY} -d ${INSTALLATION_DIR} -p ${VPP_DEBS}if[$? -eq 0];thenecho"VPP Installed on hosts from: ${WORKING_TOPOLOGY}"elseecho"Failed to copy vpp deb files to DUTs"exit1fi# Based on job we will identify DUTif[[${JOB_NAME}== *hc2vpp* ]];thenDUT="hc2vpp"elif[[${JOB_NAME}== *vpp* ]];thenDUT="vpp"elif[[${JOB_NAME}== *ligato* ]];thenDUT="kubernetes"elif[[${JOB_NAME}== *dpdk* ]];thenDUT="dpdk"elseecho"Unable to identify dut type based on JOB_NAME variable: ${JOB_NAME}"exit1fiPYBOT_ARGS="--consolewidth 120 --loglevel TRACE --variable TOPOLOGY_PATH:${WORKING_TOPOLOGY} --suite tests.${DUT}.perf"case"$TEST_TAG" in
# select specific performance tests based on jenkins job type variable
PERFTEST_DAILY )TAGS=('ndrdiscANDnic_intel-x520-da2AND1t1c''ndrdiscANDnic_intel-x520-da2AND2t2c''ndrpdrANDnic_intel-x520-da2AND1t1c''ndrpdrANDnic_intel-x520-da2AND2t2c''ndrdiscAND1t1cANDipsec''ndrdiscAND2t2cANDipsec');;
PERFTEST_SEMI_WEEKLY )TAGS=('ndrdiscANDnic_intel-x710AND1t1c''ndrdiscANDnic_intel-x710AND2t2c''ndrdiscANDnic_intel-xl710AND1t1c''ndrdiscANDnic_intel-xl710AND2t2c');;
PERFTEST_MRR_DAILY )TAGS=('mrrAND64bAND1t1c''mrrAND64bAND2t2c''mrrAND64bAND4t4c''mrrAND78bAND1t1c''mrrAND78bAND2t2c''mrrAND78bAND4t4c''mrrANDimixAND1t1cANDvhost''mrrANDimixAND2t2cANDvhost''mrrANDimixAND4t4cANDvhost''mrrANDimixAND1t1cANDmemif''mrrANDimixAND2t2cANDmemif''mrrANDimixAND4t4cANDmemif');;
VERIFY-PERF-NDRDISC )TAGS=('ndrdiscAND1t1c''ndrdiscAND2t2c');;
VERIFY-PERF-PDRDISC )TAGS=('pdrdiscAND1t1c''pdrdiscAND2t2c');;
VERIFY-PERF-MRR )TAGS=('mrrAND1t1c''mrrAND2t2c');;
VERIFY-PERF-IP4 )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDip4base''mrrANDnic_intel-x520-da2AND1t1cANDip4fwdANDfib_2m');;
VERIFY-PERF-IP6 )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDip6base''mrrANDnic_intel-x520-da2AND1t1cANDip6fwdANDfib_2m');;
VERIFY-PERF-L2 )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDl2xcbase''mrrANDnic_intel-x520-da2AND1t1cANDl2bdbase')ETAGS=('lbond_dpdk');;
VERIFY-PERF-LISP )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDlisp');;
VERIFY-PERF-VXLAN )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDvxlan');;
VERIFY-PERF-VHOST )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDvhost')ETAGS=('lbond_dpdk');;
VERIFY-PERF-MEMIF )TAGS=('pdrdiscANDnic_intel-x520-da2AND1t1cANDmemif''pdrdiscANDnic_intel-x520-da2AND2t2cANDmemif''mrrANDnic_intel-x520-da2AND1t1cANDmemif''mrrANDnic_intel-x520-da2AND2t2cANDmemif');;
VERIFY-PERF-IPSECHW )TAGS=('pdrdiscANDnic_intel-xl710AND1t1cANDipsechw''pdrdiscANDnic_intel-xl710AND2t2cANDipsechw''mrrANDnic_intel-xl710AND1t1cANDipsechw''mrrANDnic_intel-xl710AND2t2cANDipsechw');;
VERIFY-PERF-SRV6 )TAGS=('mrrANDsrv6AND1t1c''mrrANDsrv6AND2t2c');;
VPP-VERIFY-PERF-IP4 )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDip4base''mrrANDnic_intel-x520-da2AND1t1cANDip4fwdANDfib_2m');;
VPP-VERIFY-PERF-IP6 )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDip6base''mrrANDnic_intel-x520-da2AND1t1cANDip6fwdANDfib_2m');;
VPP-VERIFY-PERF-L2 )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDl2xcbase''mrrANDnic_intel-x520-da2AND1t1cANDl2bdbase''mrrANDnic_intel-x520-da2AND1t1cANDdot1q')ETAGS=('lbond_dpdk');;
VPP-VERIFY-PERF-LISP )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDlisp');;
VPP-VERIFY-PERF-VXLAN )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDvxlan');;
VPP-VERIFY-PERF-VHOST )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDvhost')ETAGS=('lbond_dpdk');;
VPP-VERIFY-PERF-MEMIF )TAGS=('pdrdiscANDnic_intel-x520-da2AND1t1cANDmemif''pdrdiscANDnic_intel-x520-da2AND2t2cANDmemif''mrrANDnic_intel-x520-da2AND1t1cANDmemif''mrrANDnic_intel-x520-da2AND2t2cANDmemif');;
VPP-VERIFY-PERF-ACL )TAGS=('mrrANDnic_intel-x520-da2AND1t1cANDacl''mrrANDnic_intel-x520-da2AND2t2cANDacl');;
VPP-VERIFY-PERF-IPSECHW )TAGS=('pdrdiscANDnic_intel-xl710AND1t1cANDipsechw''pdrdiscANDnic_intel-xl710AND2t2cANDipsechw''mrrANDnic_intel-xl710AND1t1cANDipsechw''mrrANDnic_intel-xl710AND2t2cANDipsechw');;
VPP-VERIFY-PERF-SRV6 )TAGS=('mrrANDsrv6AND1t1c''mrrANDsrv6AND2t2c');;
* )TAGS=('perftest')esac# Catenate TAG selections by 'OR'if[[ ! -z "$TAGS"]];thenprintf -v INCLUDES " --include %s ""${TAGS[@]}";fiif[[ ! -z "$ETAGS"]];thenprintf -v EXCLUDES " --exclude %s ""${ETAGS[@]}";fi# Execute the test
pybot ${PYBOT_ARGS}${INCLUDES}${EXCLUDES} tests/
RETURN_STATUS=$(echo$?)# Archive JOB artifacts in jenkinsfor i in ${JOB_ARCHIVE_ARTIFACTS[@]};do
cp $( readlink -f ${i}| tr '\n'' ')${JOB_ARCHIVE_DIR}/
done# Archive JOB artifacts to logs.fd.iofor i in ${LOG_ARCHIVE_ARTIFACTS[@]};do
cp $( readlink -f ${i}| tr '\n'' ')${LOG_ARCHIVE_DIR}/
doneexit${RETURN_STATUS}