X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fbash%2Ffunction%2Fcommon.sh;h=13976aed13527b04d26368578789a57dac78bd56;hb=4929e57e9c8d721000adcbdf2bcbe0dc6952a831;hp=89c8f319141a6483499fd6ac54e404ce6533c9ed;hpb=c788beaecccfa253fafd4708af45c28594704aab;p=csit.git diff --git a/resources/libraries/bash/function/common.sh b/resources/libraries/bash/function/common.sh index 89c8f31914..13976aed13 100644 --- a/resources/libraries/bash/function/common.sh +++ b/resources/libraries/bash/function/common.sh @@ -167,6 +167,21 @@ function check_download_dir () { } +function check_prerequisites () { + + # Fail if prerequisites are not met. + # + # Functions called: + # - installed - Check if application is installed/present in system. + # - die - Print to stderr and exit. + + set -exuo pipefail + + if ! installed sshpass; then + die "Please install sshpass before continue!" + fi +} + function cleanup_topo () { # Variables read: @@ -520,6 +535,54 @@ function get_test_tag_string () { } +function installed () { + + # Check if the given utility is installed. Fail if not installed. + # + # Duplicate of common.sh function, as this file is also used standalone. + # + # Arguments: + # - ${1} - Utility to check. + # Returns: + # - 0 - If command is installed. + # - 1 - If command is not installed. + + set -exuo pipefail + + command -v "${1}" +} + + +function remove_topo () { + + # Remove the argument from list of available topologies. + # + # Just a de-duplicated block of code + # + # Argument: + # - ${1} - The topology item to remove. Required. + # Variable read and re-written: + # - TOPOLOGIES - Array of paths to topologies, with failed cleanups removed. + + set -exuo pipefail + + warn "Testbed ${topo} seems unsuitable, removing from the list." + + # Build new topology array. + # TOPOLOGIES=("${TOPOLOGIES[@]/$topo}") + # does not really work, see: + # https://stackoverflow.com/questions/16860877/remove-an-element-from-a-bash-array + + new_topologies=() + for item in "${TOPOLOGIES[@]}"; do + if [[ "${item}" != "${1}" ]]; then + new_topologies+=("${item}") + fi + done + TOPOLOGIES=("${new_topologies[@]}") +} + + function reserve_and_cleanup_testbed () { # Reserve physical testbed, perform cleanup, register trap to unreserve. @@ -531,8 +594,6 @@ function reserve_and_cleanup_testbed () { # - PYTHON_SCRIPTS_DIR - Path to directory holding the reservation script. # - BUILD_TAG - Any string suitable as filename, identifying # test run executing this function. May be unset. - # - BUILD_URL - Any string suitable as URL, identifying - # test run executing this function. May be unset. # Variables set: # - TOPOLOGIES - Array of paths to topologies, with failed cleanups removed. # - WORKING_TOPOLOGY - Path to topology yaml file of the reserved testbed. @@ -543,12 +604,11 @@ function reserve_and_cleanup_testbed () { set -exuo pipefail - while [[ ${TOPOLOGIES[@]} ]]; do + while true; do for topo in "${TOPOLOGIES[@]}"; do set +e scrpt="${PYTHON_SCRIPTS_DIR}/topo_reservation.py" opts=("-t" "${topo}" "-r" "${BUILD_TAG:-Unknown}") - opts+=("-u" "${BUILD_URL:-Unknown}") python "${scrpt}" "${opts[@]}" result="$?" set -e @@ -576,38 +636,31 @@ function reserve_and_cleanup_testbed () { warn "Testbed cleanup failed: ${topo}" untrap_and_unreserve_testbed "Fail of unreserve after cleanup." # WORKING_TOPOLOGY is now empty again. - # Build new topology array. - # TOPOLOGIES=("${TOPOLOGIES[@]/$topo}") - # does not really work, see: - # https://stackoverflow.com/questions/16860877/remove-an-element-from-a-bash-array - new_topologies=() - for item in "${TOPOLOGIES[@]}"; do - if [[ "${item}" != "${topo}" ]]; then - new_topologies+=("${item}") - fi - done - TOPOLOGIES=("${new_topologies[@]}") - break + remove_topo "${topo}" + elif [[ "${result}" != "2" ]]; then + # 1 or unexpected return code, testbed is probably unusable. + remove_topo "${topo}" fi + # Else testbed is accessible but currently reserved, moving on. done if [[ -n "${WORKING_TOPOLOGY-}" ]]; then # Exit the infinite while loop if we made a reservation. + warn "Reservation and cleanup successful." break fi + if [[ "${#TOPOLOGIES[@]}" == "0" ]]; then + die "Run out of operational testbeds!" + fi + # Wait ~3minutes before next try. - sleep_time="$[ ( $RANDOM % 20 ) + 180 ]s" || { + sleep_time="$[ ( ${RANDOM} % 20 ) + 180 ]s" || { die "Sleep time calculation failed." } echo "Sleeping ${sleep_time}" sleep "${sleep_time}" || die "Sleep failed." done - if [[ ${TOPOLOGIES[@]} ]]; then - echo "Reservation and cleanup successful." - else - die "Run out of operational testbeds!" - fi } @@ -650,14 +703,11 @@ function run_pybot () { function select_arch_os () { - # Populate variables related to local operating system. - # - # Also install any missing prerequisities CSIT tests need. - # TODO: Move the installation to a separate function? + # Set variables affected by local CPU architecture and operating system. # # Variables set: - # - VPP_VER_FILE - Name of File in CSIT dir containing vpp stable version. - # - IMAGE_VER_FILE - Name of File in CSIT dir containing the image name. + # - VPP_VER_FILE - Name of file in CSIT dir containing vpp stable version. + # - IMAGE_VER_FILE - Name of file in CSIT dir containing the image name. # - PKG_SUFFIX - Suffix of OS package file name, "rpm" or "deb." set -exuo pipefail @@ -929,7 +979,7 @@ function select_vpp_device_tags () { set -exuo pipefail case "${TEST_CODE}" in - # Select specific performance tests based on jenkins job type variable. + # Select specific device tests based on jenkins job type variable. * ) if [[ -z "${TEST_TAG_STRING-}" ]]; then # If nothing is specified, we will run pre-selected tests by @@ -943,6 +993,20 @@ function select_vpp_device_tags () { ;; esac + # Blacklisting certain tags per topology. + # + # Reasons for blacklisting: + # - avf - AVF is not possible to run on enic driver of VirtualBox. + # - vhost - VirtualBox does not support nesting virtualization on Intel CPU. + case "${TEST_CODE}" in + *"1n-vbox"*) + test_tag_array+=("!avf") + test_tag_array+=("!vhost") + ;; + *) + ;; + esac + TAGS=() # We will prefix with devicetest to prevent running other tests