source "${BASH_FUNCTION_DIR}/device.sh" || {
die "Source failed!"
}
-
device_image="$(< ${CSIT_DIR}/${IMAGE_VER_FILE})"
case_text="${NODENESS}_${FLAVOR}"
case "${case_text}" in
# We execute reservation over csit-shim-dcr (ssh) which runs sourced
# script's functions. Env variables are read from ssh output
# back to localhost for further processing.
- hostname=$(grep search /etc/resolv.conf | cut -d' ' -f3) || die
- ssh="ssh root@${hostname} -p 6022"
+ # Shim and Jenkins executor are in the same network on the same host
+ # Connect to docker's default gateway IP and shim's exposed port
+ ssh="ssh root@172.17.0.1 -p 6022"
run="activate_wrapper ${NODENESS} ${FLAVOR} ${device_image}"
# The "declare -f" output is long and boring.
set +x
set -exuo pipefail
- tar c "${GENERATED_DIR}/tests" | xz -9e > "${ARCHIVE_DIR}/tests.tar.xz" || {
+ tar c "${GENERATED_DIR}/tests" | xz -3 > "${ARCHIVE_DIR}/tests.tar.xz" || {
die "Error creating archive of generated tests."
}
}
# - RESOURCES_DIR - Path to existing CSIT subdirectory "resources".
# - TOOLS_DIR - Path to existing resources subdirectory "tools".
# - PYTHON_SCRIPTS_DIR - Path to existing tools subdirectory "scripts".
- # - ARCHIVE_DIR - Path to created CSIT subdirectory "archive".
+ # - ARCHIVE_DIR - Path to created CSIT subdirectory "archives".
+ # The name is chosen to match what ci-management expects.
# - DOWNLOAD_DIR - Path to created CSIT subdirectory "download_dir".
# - GENERATED_DIR - Path to created CSIT subdirectory "generated".
# Directories created if not present:
die "Readlink failed."
}
- ARCHIVE_DIR=$(readlink -f "${CSIT_DIR}/archive") || {
+ ARCHIVE_DIR=$(readlink -f "${CSIT_DIR}/archives") || {
die "Readlink failed."
}
mkdir -p "${ARCHIVE_DIR}" || die "Mkdir failed."
}
-function copy_archives () {
-
- # Create additional archive if workspace variable is set.
- # This way if script is running in jenkins all will be
- # automatically archived to logs.fd.io.
- #
- # Variables read:
- # - WORKSPACE - Jenkins workspace, copy only if the value is not empty.
- # Can be unset, then it speeds up manual testing.
- # - ARCHIVE_DIR - Path to directory with content to be copied.
- # Directories updated:
- # - ${WORKSPACE}/archives/ - Created if does not exist.
- # Content of ${ARCHIVE_DIR}/ is copied here.
- # Functions called:
- # - die - Print to stderr and exit.
-
- set -exuo pipefail
-
- if [[ -n "${WORKSPACE-}" ]]; then
- mkdir -p "${WORKSPACE}/archives/" || die "Archives dir create failed."
- cp -rf "${ARCHIVE_DIR}"/* "${WORKSPACE}/archives" || die "Copy failed."
- fi
-}
-
-
function deactivate_docker_topology () {
# Deactivate virtual vpp-device topology by removing containers.
case_text="${NODENESS}_${FLAVOR}"
case "${case_text}" in
"1n_skx" | "1n_tx2")
- hostname=$(grep search /etc/resolv.conf | cut -d' ' -f3) || die
- ssh="ssh root@${hostname} -p 6022"
+ ssh="ssh root@172.17.0.1 -p 6022"
env_vars=$(env | grep CSIT_ | tr '\n' ' ' ) || die
# The "declare -f" output is long and boring.
set +x
NODENESS="2n"
FLAVOR="skx"
;;
+ *"2n-zn2"*)
+ NODENESS="2n"
+ FLAVOR="zn2"
+ ;;
*"3n-skx"*)
NODENESS="3n"
FLAVOR="skx"
die "Unknown specification: ${TEST_CODE}"
esac
# Ignore lines not containing the trigger word.
- comment=$(fgrep "${trigger}" <<< "${GERRIT_EVENT_COMMENT_TEXT}") || true
+ comment=$(fgrep "${trigger}" <<< "${GERRIT_EVENT_COMMENT_TEXT}" || true)
# The vpp-csit triggers trail stuff we are not interested in.
# Removing them and trigger word: https://unix.stackexchange.com/a/13472
# (except relying on \s whitespace, \S non-whitespace and . both).
# The last string is concatenated, only the middle part is expanded.
cmd=("grep" "-oP" '\S*'"${trigger}"'\S*\s\K.+$') || die "Unset trigger?"
# On parsing error, TEST_TAG_STRING probably stays empty.
- TEST_TAG_STRING=$("${cmd[@]}" <<< "${comment}") || true
+ TEST_TAG_STRING=$("${cmd[@]}" <<< "${comment}" || true)
+ if [[ -z "${TEST_TAG_STRING-}" ]]; then
+ # Probably we got a base64 encoded comment.
+ comment=$(base64 --decode <<< "${GERRIT_EVENT_COMMENT_TEXT}" || true)
+ comment=$(fgrep "${trigger}" <<< "${comment}" || true)
+ TEST_TAG_STRING=$("${cmd[@]}" <<< "${comment}" || true)
+ fi
+ if [[ -n "${TEST_TAG_STRING-}" ]]; then
+ test_tag_array=(${TEST_TAG_STRING})
+ if [[ "${test_tag_array[0]}" == "icl" ]]; then
+ export GRAPH_NODE_VARIANT="icl"
+ TEST_TAG_STRING="${test_tag_array[@]:1}" || true
+ elif [[ "${test_tag_array[0]}" == "skx" ]]; then
+ export GRAPH_NODE_VARIANT="skx"
+ TEST_TAG_STRING="${test_tag_array[@]:1}" || true
+ elif [[ "${test_tag_array[0]}" == "hsw" ]]; then
+ export GRAPH_NODE_VARIANT="hsw"
+ TEST_TAG_STRING="${test_tag_array[@]:1}" || true
+ fi
+ fi
fi
}
}
+function move_archives () {
+
+ # Move archive directory to top of workspace, if not already there.
+ #
+ # ARCHIVE_DIR is positioned relative to CSIT_DIR,
+ # but in some jobs CSIT_DIR is not same as WORKSPACE
+ # (e.g. under VPP_DIR). To simplify ci-management settings,
+ # we want to move the data to the top. We do not want simple copy,
+ # as ci-management is eager with recursive search.
+ #
+ # As some scripts may call this function multiple times,
+ # the actual implementation use copying and deletion,
+ # so the workspace gets "union" of contents (except overwrites on conflict).
+ # The consequence is empty ARCHIVE_DIR remaining after this call.
+ #
+ # As the source directory is emptied,
+ # the check for dirs being different is essential.
+ #
+ # Variables read:
+ # - WORKSPACE - Jenkins workspace, move only if the value is not empty.
+ # Can be unset, then it speeds up manual testing.
+ # - ARCHIVE_DIR - Path to directory with content to be moved.
+ # Directories updated:
+ # - ${WORKSPACE}/archives/ - Created if does not exist.
+ # Content of ${ARCHIVE_DIR}/ is moved.
+ # Functions called:
+ # - die - Print to stderr and exit.
+
+ set -exuo pipefail
+
+ if [[ -n "${WORKSPACE-}" ]]; then
+ target=$(readlink -f "${WORKSPACE}/archives")
+ if [[ "${target}" != "${ARCHIVE_DIR}" ]]; then
+ mkdir -p "${target}" || die "Archives dir create failed."
+ cp -rf "${ARCHIVE_DIR}"/* "${target}" || die "Copy failed."
+ rm -rf "${ARCHIVE_DIR}"/* || die "Delete failed."
+ fi
+ fi
+}
+
+
function reserve_and_cleanup_testbed () {
# Reserve physical testbed, perform cleanup, register trap to unreserve.
# Variables read:
# - WORKING_TOPOLOGY - Path to topology yaml file of the reserved testbed.
# - TEST_CODE - String affecting test selection, usually jenkins job name.
+ # - DUT - CSIT test/ subdirectory, set while processing tags.
# - TEST_TAG_STRING - String selecting tags, from gerrit comment.
# Can be unset.
# - TOPOLOGIES_DIR - Path to existing directory with available tpologies.
*"3n-tsh"*)
default_nic="nic_intel-x520-da2"
;;
- *"3n-skx"* | *"2n-skx"* | *"2n-clx"*)
+ *"3n-skx"* | *"2n-skx"* | *"2n-clx"* | *"2n-zn2"*)
default_nic="nic_intel-xxv710"
;;
*"3n-hsw"* | *"mrr-daily-master")
# Select specific performance tests based on jenkins job type variable.
*"ndrpdr-weekly"* )
readarray -t test_tag_array <<< $(sed 's/ //g' \
- ${tfd}/mlr-weekly-${NODENESS}-${FLAVOR}.md |
- eval ${sed_nics_sub_cmd}) || die
+ ${tfd}/mlr_weekly/${DUT}-${NODENESS}-${FLAVOR}.md |
+ eval ${sed_nics_sub_cmd} || echo "perftest") || die
;;
*"mrr-daily"* )
readarray -t test_tag_array <<< $(sed 's/ //g' \
- ${tfd}/mrr-daily-${NODENESS}-${FLAVOR}.md |
- eval ${sed_nics_sub_cmd}) || die
+ ${tfd}/mrr_daily/${DUT}-${NODENESS}-${FLAVOR}.md |
+ eval ${sed_nics_sub_cmd} || echo "perftest") || die
;;
*"mrr-weekly"* )
readarray -t test_tag_array <<< $(sed 's/ //g' \
- ${tfd}/mrr-weekly-${NODENESS}-${FLAVOR}.md |
- eval ${sed_nics_sub_cmd}) || die
+ ${tfd}/mrr_weekly/${DUT}-${NODENESS}-${FLAVOR}.md |
+ eval ${sed_nics_sub_cmd} || echo "perftest") || die
;;
*"report-iterative"* )
+ test_sets=(${TEST_TAG_STRING//:/ })
+ # Run only one test set per run
+ report_file=${test_sets[0]}.md
readarray -t test_tag_array <<< $(sed 's/ //g' \
- ${tfd}/report-iter-${NODENESS}-${FLAVOR}.md |
- eval ${sed_nics_sub_cmd}) || die
+ ${tfd}/report_iterative/${NODENESS}-${FLAVOR}/${report_file} |
+ eval ${sed_nics_sub_cmd} || echo "perftest") || die
;;
*"report-coverage"* )
test_sets=(${TEST_TAG_STRING//:/ })
report_file=${test_sets[0]}.md
readarray -t test_tag_array <<< $(sed 's/ //g' \
${tfd}/report_coverage/${NODENESS}-${FLAVOR}/${report_file} |
- eval ${sed_nics_sub_cmd}) || die
+ eval ${sed_nics_sub_cmd} || echo "perftest") || die
;;
* )
if [[ -z "${TEST_TAG_STRING-}" ]]; then
# TODO: Add missing reasons here (if general) or where used (if specific).
case "${TEST_CODE}" in
*"2n-skx"*)
- test_tag_array+=("!ipsechw")
+ test_tag_array+=("!ipsec")
;;
*"3n-skx"*)
test_tag_array+=("!ipsechw")
test_tag_array+=("!3_node_double_link_topoANDnic_intel-xxv710")
;;
*"2n-clx"*)
- test_tag_array+=("!ipsechw")
+ test_tag_array+=("!ipsec")
+ ;;
+ *"2n-zn2"*)
+ test_tag_array+=("!ipsec")
;;
*"2n-dnv"*)
test_tag_array+=("!ipsechw")
test_tag_array+=("!ipsechw")
;;
*"3n-hsw"*)
- # TODO: Introduce NOIOMMU version of AVF tests.
- # TODO: Make (both) AVF tests work on Haswell,
- # or document why (some of) it is not possible.
- # https://github.com/FDio/vpp/blob/master/src/plugins/avf/README.md
test_tag_array+=("!drv_avf")
# All cards have access to QAT. But only one card (xl710)
# resides in same NUMA as QAT. Other cards must go over QPI
warn "The following tag expression hints at bad trigger: ${tag}"
warn "Possible cause: Multiple triggers in a single comment."
die "Aborting to avoid triggering too many tests."
+ elif [[ "${tag}" == *"OR"* ]]; then
+ # If OR had higher precedence than AND, it would be useful here.
+ # Some people think it does, thus triggering way too much tests.
+ set -x
+ warn "The following tag expression hints at bad trigger: ${tag}"
+ warn "Operator OR has lower precedence than AND. Use space instead."
+ die "Aborting to avoid triggering too many tests."
elif [[ "${tag}" != "" && "${tag}" != "#"* ]]; then
# Empty and comment lines are skipped.
# Other lines are normal tags, they are to be prefixed.
TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n_skx*.yaml )
TOPOLOGIES_TAGS="2_node_*_link_topo"
;;
+ "2n_zn2")
+ TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n_zn2*.yaml )
+ TOPOLOGIES_TAGS="2_node_*_link_topo"
+ ;;
"3n_skx")
TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n_skx*.yaml )
TOPOLOGIES_TAGS="3_node_*_link_topo"