feat(bonding): Add simple suite for minimal coverage
[csit.git] / resources / libraries / bash / function / common.sh
index 44149ca..9fd208b 100644 (file)
@@ -1,5 +1,5 @@
-# Copyright (c) 2023 Cisco and/or its affiliates.
-# Copyright (c) 2023 PANTHEON.tech and/or its affiliates.
+# Copyright (c) 2024 Cisco and/or its affiliates.
+# Copyright (c) 2024 PANTHEON.tech 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:
@@ -17,11 +17,6 @@ set -exuo pipefail
 # This library defines functions used by multiple entry scripts.
 # Keep functions ordered alphabetically, please.
 
-# TODO: Add a link to bash style guide.
-# TODO: Consider putting every die into a {} block,
-#   the code might become more readable (but longer).
-
-
 function activate_docker_topology () {
 
     # Create virtual vpp-device topology. Output of the function is topology
@@ -45,7 +40,7 @@ function activate_docker_topology () {
     device_image="$(< ${CSIT_DIR}/${IMAGE_VER_FILE})"
     case_text="${NODENESS}_${FLAVOR}"
     case "${case_text}" in
-        "1n_skx" | "1n_tx2" | "1n_spr")
+        "1n_skx" | "1n_alt" | "1n_spr")
             # 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.
@@ -124,9 +119,9 @@ function activate_virtualenv () {
     env_dir="${root_path}/env"
     req_path=${2-$CSIT_DIR/requirements.txt}
     rm -rf "${env_dir}" || die "Failed to clean previous virtualenv."
-    pip3 install virtualenv==20.15.1 || {
-        die "Virtualenv package install failed."
-    }
+    #pip3 install virtualenv==20.26.3 || {
+    #    die "Virtualenv package install failed."
+    #}
     virtualenv --no-download --python=$(which python3) "${env_dir}" || {
         die "Virtualenv creation for $(which python3) failed."
     }
@@ -290,7 +285,7 @@ function compose_robot_arguments () {
         *"device"*)
             ROBOT_ARGS+=("--suite" "tests.${DUT}.device")
             ;;
-        *"perf"*)
+        *"perf"* | *"bisect"*)
             ROBOT_ARGS+=("--suite" "tests.${DUT}.perf")
             ;;
         *)
@@ -328,7 +323,7 @@ function deactivate_docker_topology () {
 
     case_text="${NODENESS}_${FLAVOR}"
     case "${case_text}" in
-        "1n_skx" | "1n_tx2" | "1n_spr")
+        "1n_skx" | "1n_alt" | "1n_spr")
             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.
@@ -452,9 +447,9 @@ function get_test_code () {
             NODENESS="1n"
             FLAVOR="spr"
             ;;
-        *"1n-tx2")
+        *"1n-alt")
             NODENESS="1n"
-            FLAVOR="tx2"
+            FLAVOR="alt"
             ;;
         *"1n-aws")
             NODENESS="1n"
@@ -468,14 +463,6 @@ function get_test_code () {
             NODENESS="3n"
             FLAVOR="aws"
             ;;
-        *"2n-c6gn")
-            NODENESS="2n"
-            FLAVOR="c6gn"
-            ;;
-        *"3n-c6gn")
-            NODENESS="3n"
-            FLAVOR="c6gn"
-            ;;
         *"2n-c7gn")
             NODENESS="2n"
             FLAVOR="c7gn"
@@ -500,10 +487,6 @@ function get_test_code () {
             NODENESS="2n"
             FLAVOR="zn2"
             ;;
-        *"2n-clx")
-            NODENESS="2n"
-            FLAVOR="clx"
-            ;;
         *"2n-icx")
             NODENESS="2n"
             FLAVOR="icx"
@@ -532,18 +515,20 @@ function get_test_code () {
             NODENESS="3n"
             FLAVOR="icxd"
             ;;
-        *"2n-tx2")
-            NODENESS="2n"
-            FLAVOR="tx2"
-            ;;
-        *"3n-tsh")
-            NODENESS="3n"
-            FLAVOR="tsh"
-            ;;
         *"3n-alt")
             NODENESS="3n"
             FLAVOR="alt"
             ;;
+        *"-x-2n"*)
+            TESTBED="${TEST_CODE#${TEST_CODE%2n*}}"
+            NODENESS="${TESTBED%-${TEST_CODE#*-x-2n*-}}"
+            FLAVOR="${TEST_CODE#*-x-2n*-}"
+            ;;
+        *"-x-3n"*)
+            TESTBED="${TEST_CODE#${TEST_CODE%3n*}}"
+            NODENESS="${TESTBED%-${TEST_CODE#*-x-3n*-}}"
+            FLAVOR="${TEST_CODE#*-x-3n*-}"
+            ;;
     esac
 }
 
@@ -557,6 +542,8 @@ function get_test_tag_string () {
     # Variables set:
     # - TEST_TAG_STRING - The string following trigger word in gerrit comment.
     #   May be empty, or even not set on event types not adding comment.
+    # - GIT_BISECT_FROM - If bisecttest, the commit hash to bisect from.
+    #   Else not set.
     # Variables exported optionally:
     # - GRAPH_NODE_VARIANT - Node variant to test with, set if found in trigger.
 
@@ -566,6 +553,10 @@ function get_test_tag_string () {
 
     if [[ "${GERRIT_EVENT_TYPE-}" == "comment-added" ]]; then
         case "${TEST_CODE}" in
+            # Order matters, bisect job contains "perf" in its name.
+            *"bisect"*)
+                trigger="bisecttest"
+                ;;
             *"device"*)
                 trigger="devicetest"
                 ;;
@@ -591,6 +582,18 @@ function get_test_tag_string () {
             comment=$(fgrep "${trigger}" <<< "${comment}" || true)
             TEST_TAG_STRING=$("${cmd[@]}" <<< "${comment}" || true)
         fi
+        if [[ "${trigger}" == "bisecttest" ]]; then
+            # Intentionally without quotes, so spaces delimit elements.
+            test_tag_array=(${TEST_TAG_STRING}) || die "How could this fail?"
+            # First "argument" of bisecttest is a commit hash.
+            GIT_BISECT_FROM="${test_tag_array[0]}" || {
+                die "Bisect job requires commit hash."
+            }
+            # Update the tag string (tag expressions only, no commit hash).
+            TEST_TAG_STRING="${test_tag_array[@]:1}" || {
+                die "Bisect job needs a single test, no default."
+            }
+        fi
         if [[ -n "${TEST_TAG_STRING-}" ]]; then
             test_tag_array=(${TEST_TAG_STRING})
             if [[ "${test_tag_array[0]}" == "icl" ]]; then
@@ -692,15 +695,6 @@ function prepare_topology () {
             }
             terraform_apply || die "Failed to call terraform apply."
             ;;
-        "2n_c6gn" | "3n_c6gn")
-            export TF_VAR_testbed_name="${TEST_CODE}"
-            TERRAFORM_MODULE_DIR="terraform-aws-${NODENESS}-c6gn"
-            terraform_init || die "Failed to call terraform init."
-            trap "terraform_destroy" ERR EXIT || {
-                die "Trap attempt failed, please cleanup manually. Aborting!"
-            }
-            terraform_apply || die "Failed to call terraform apply."
-            ;;
         "2n_c7gn" | "3n_c7gn")
             export TF_VAR_testbed_name="${TEST_CODE}"
             TERRAFORM_MODULE_DIR="terraform-aws-${NODENESS}-c7gn"
@@ -869,6 +863,11 @@ function select_arch_os () {
                     VPP_VER_FILE="VPP_STABLE_VER_UBUNTU_JAMMY"
                     PKG_SUFFIX="deb"
                     ;;
+                *"LTS (Noble Numbat)"*)
+                    IMAGE_VER_FILE="VPP_DEVICE_IMAGE_UBUNTU_NOBLE"
+                    VPP_VER_FILE="VPP_STABLE_VER_UBUNTU_NOBLE"
+                    PKG_SUFFIX="deb"
+                    ;;
                 *)
                     die "Unsupported Ubuntu version!"
                     ;;
@@ -943,9 +942,6 @@ function select_tags () {
         *"3n-icxd")
             default_nic="nic_intel-e823c"
             ;;
-        *"3n-tsh")
-            default_nic="nic_intel-x520-da2"
-            ;;
         *"3n-icx" | *"2n-icx")
             default_nic="nic_intel-e810cq"
             ;;
@@ -958,24 +954,24 @@ function select_tags () {
         *"2n-spr")
             default_nic="nic_intel-e810cq"
             ;;
-        *"2n-clx" | *"2n-zn2")
+        *"2n-zn2")
             default_nic="nic_intel-xxv710"
             ;;
-        *"2n-tx2" | *"3n-alt")
+        *"3n-alt")
             default_nic="nic_intel-xl710"
             ;;
         *"1n-aws" | *"2n-aws" | *"3n-aws")
             default_nic="nic_amazon-nitro-50g"
             ;;
-        *"2n-c6gn" | *"3n-c6gn")
-            default_nic="nic_amazon-nitro-100g"
-            ;;
         *"2n-c7gn" | *"3n-c7gn")
             default_nic="nic_amazon-nitro-100g"
             ;;
         *"1n-c6in" | *"2n-c6in" | *"3n-c6in")
             default_nic="nic_amazon-nitro-200g"
             ;;
+        *"-x-2n"* | *"-x-3n"*)
+            default_nic="nic_intel-e810cq"
+            ;;
         *)
             default_nic="nic_intel-x710"
             ;;
@@ -986,7 +982,6 @@ function select_tags () {
     awk_nics_sub_cmd+='gsub("xxv710","25ge2p1xxv710");'
     awk_nics_sub_cmd+='gsub("x710","10ge2p1x710");'
     awk_nics_sub_cmd+='gsub("xl710","40ge2p1xl710");'
-    awk_nics_sub_cmd+='gsub("x520-da2","10ge2p1x520");'
     awk_nics_sub_cmd+='gsub("cx556a","100ge2p1cx556a");'
     awk_nics_sub_cmd+='gsub("2p1cx7veat","200ge2p1cx7veat");'
     awk_nics_sub_cmd+='gsub("6p3cx7veat","200ge6p3cx7veat");'
@@ -1043,6 +1038,12 @@ function select_tags () {
                 awk {"$awk_nics_sub_cmd"} || echo "perftest") || die
             SELECTION_MODE="--test"
             ;;
+        *"soak-weekly"* )
+            readarray -t test_tag_array <<< $(grep -v "#" \
+                ${tfd}/soak_weekly/${DUT}-${NODENESS}-${FLAVOR}.md |
+                awk {"$awk_nics_sub_cmd"} || echo "perftest") || die
+            SELECTION_MODE="--test"
+            ;;
         *"report-iterative"* )
             test_sets=(${TEST_TAG_STRING//:/ })
             # Run only one test set per run
@@ -1088,20 +1089,14 @@ function select_tags () {
             test_tag_array+=("!vhost")
             test_tag_array+=("!flow")
             ;;
-        *"1n-tx2")
+        *"1n-alt")
             test_tag_array+=("!flow")
             ;;
-        *"2n-clx")
-            test_tag_array+=("!ipsechw")
-            ;;
         *"2n-icx")
             test_tag_array+=("!ipsechw")
             ;;
         *"2n-spr")
             ;;
-        *"2n-tx2")
-            test_tag_array+=("!ipsechw")
-            ;;
         *"2n-zn2")
             test_tag_array+=("!ipsechw")
             ;;
@@ -1120,22 +1115,17 @@ function select_tags () {
             ;;
         *"3nb-spr")
             ;;
-        *"3n-tsh")
-            test_tag_array+=("!drv_avf")
-            test_tag_array+=("!ipsechw")
-            ;;
         *"1n-aws" | *"2n-aws" | *"3n-aws")
             test_tag_array+=("!ipsechw")
             ;;
-        *"2n-c6gn" | *"3n-c6gn")
-            test_tag_array+=("!ipsechw")
-            ;;
         *"2n-c7gn" | *"3n-c7gn")
             test_tag_array+=("!ipsechw")
             ;;
         *"1n-c6in" | *"2n-c6in" | *"3n-c6in")
             test_tag_array+=("!ipsechw")
             ;;
+        *"-x-2n"* | *"-x-3n"*)
+            ;;
     esac
 
     # We will add excluded NICs.
@@ -1143,11 +1133,13 @@ function select_tags () {
 
     TAGS=()
     prefix=""
-    if [[ "${TEST_CODE}" == "vpp-"* ]]; then
-        if [[ "${TEST_CODE}" != *"device"* ]]; then
-            # Automatic prefixing for VPP perf jobs to limit the NIC used.
-            if [[ "${TEST_TAG_STRING-}" != *"nic_"* ]]; then
-                prefix="${default_nic}AND"
+    if [[ "${TEST_CODE}" != *"daily"* ]]; then
+        if [[ "${TEST_CODE}" == "vpp-"* ]]; then
+            if [[ "${TEST_CODE}" != *"device"* ]]; then
+                # Automatic prefixing for VPP perf jobs to limit the NIC used.
+                if [[ "${TEST_TAG_STRING-}" != *"nic_"* ]]; then
+                    prefix="${default_nic}AND"
+                fi
             fi
         fi
     fi
@@ -1194,105 +1186,92 @@ function select_topology () {
 
     set -exuo pipefail
 
-    case_text="${NODENESS}_${FLAVOR}"
-    case "${case_text}" in
-        "1n_aws")
+    case "${TEST_CODE}" in
+        *"1n-aws")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*1n-aws*.yaml )
             TOPOLOGIES_TAGS="1_node_single_link_topo"
             ;;
-        "1n_c6in")
+        *"1n-c6in")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*1n-c6in*.yaml )
             TOPOLOGIES_TAGS="1_node_single_link_topo"
             ;;
-        "1n_tx2" | "1n_spr")
+        *"1n-alt" | *"1n-spr")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*vpp_device*.template )
             TOPOLOGIES_TAGS="2_node_single_link_topo"
             ;;
-        "1n_vbox")
+        *"1n-vbox")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*vpp_device*.template )
             TOPOLOGIES_TAGS="2_node_single_link_topo"
             ;;
-        "2n_aws")
+        *"2n-aws")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n-aws*.yaml )
             TOPOLOGIES_TAGS="2_node_single_link_topo"
             ;;
-        "2n_c6gn")
-            TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n-c6gn*.yaml )
-            TOPOLOGIES_TAGS="2_node_single_link_topo"
-            ;;
-        "2n_c7gn")
+        *"2n-c7gn")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n-c7gn*.yaml )
             TOPOLOGIES_TAGS="2_node_single_link_topo"
             ;;
-        "2n_c6in")
+        *"2n-c6in")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n-c6in*.yaml )
             TOPOLOGIES_TAGS="2_node_single_link_topo"
             ;;
-        "2n_clx")
-            TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n_clx_*.yaml )
-            TOPOLOGIES_TAGS="2_node_*_link_topo"
-            ;;
-        "2n_icx")
+        *"2n-icx")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n_icx_*.yaml )
             TOPOLOGIES_TAGS="2_node_*_link_topo"
             ;;
-        "2n_spr")
+        *"2n-spr")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n_spr_*.yaml )
             TOPOLOGIES_TAGS="2_node_*_link_topo"
             ;;
-        "2n_tx2")
-            TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n_tx2_*.yaml )
-            TOPOLOGIES_TAGS="2_node_single_link_topo"
-            ;;
-        "2n_zn2")
+        *"2n-zn2")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*2n_zn2_*.yaml )
             TOPOLOGIES_TAGS="2_node_*_link_topo"
             ;;
-        "3n_alt")
+        *"3n-alt")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n_alt_*.yaml )
             TOPOLOGIES_TAGS="3_node_single_link_topo"
             ;;
-        "3n_aws")
+        *"3n-aws")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n-aws*.yaml )
             TOPOLOGIES_TAGS="3_node_single_link_topo"
             ;;
-        "3n_c6gn")
-            TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n-c6gn*.yaml )
-            TOPOLOGIES_TAGS="3_node_single_link_topo"
-            ;;
-        "3n_c7gn")
+        *"3n-c7gn")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n-c7gn*.yaml )
             TOPOLOGIES_TAGS="3_node_single_link_topo"
             ;;
-        "3n_c6in")
+        *"3n-c6in")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n-c6in*.yaml )
             TOPOLOGIES_TAGS="3_node_single_link_topo"
             ;;
-        "3n_icx")
+        *"3n-icx")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n_icx_*.yaml )
             # Trailing underscore is needed to distinguish from 3n_icxd.
             TOPOLOGIES_TAGS="3_node_*_link_topo"
             ;;
-        "3n_icxd")
+        *"3n-icxd")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n_icxd_*.yaml )
             TOPOLOGIES_TAGS="3_node_single_link_topo"
             ;;
-        "3n_snr")
+        *"3n-snr")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n_snr_*.yaml )
             TOPOLOGIES_TAGS="3_node_single_link_topo"
             ;;
-        "3n_tsh")
-            TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3n_tsh_*.yaml )
-            TOPOLOGIES_TAGS="3_node_single_link_topo"
-            ;;
-        "3na_spr")
+        *"3na-spr")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3na_spr_*.yaml )
             TOPOLOGIES_TAGS="3_node_*_link_topo"
             ;;
-        "3nb_spr")
+        *"3nb-spr")
             TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*3nb_spr_*.yaml )
             TOPOLOGIES_TAGS="3_node_*_link_topo"
             ;;
+        *"-x-2n"*)
+            TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*_x_"${NODENESS}_${FLAVOR}"*.yaml )
+            TOPOLOGIES_TAGS="2_node_single_link_topo"
+            ;;
+        *"-x-3n"*)
+            TOPOLOGIES=( "${TOPOLOGIES_DIR}"/*_x_"${NODENESS}_${FLAVOR}"*.yaml )
+            TOPOLOGIES_TAGS="3_node_single_link_topo"
+            ;;
         *)
             # No falling back to default, that should have been done
             # by the function which has set NODENESS and FLAVOR.
@@ -1328,13 +1307,6 @@ function set_environment_variables () {
             # Settings to prevent duration stretching.
             export PERF_TRIAL_STL_DELAY=0.1
             ;;
-        *"2n-c6gn" | *"3n-c6gn")
-            export TREX_RX_DESCRIPTORS_COUNT=1024
-            export TREX_EXTRA_CMDLINE="--mbuf-factor 19"
-            export TREX_CORE_COUNT=6
-            # Settings to prevent duration stretching.
-            export PERF_TRIAL_STL_DELAY=0.1
-            ;;
         *"2n-c7gn" | *"3n-c7gn")
             export TREX_RX_DESCRIPTORS_COUNT=1024
             export TREX_EXTRA_CMDLINE="--mbuf-factor 19"
@@ -1352,6 +1324,13 @@ function set_environment_variables () {
         *"2n-zn2")
             # Maciek's workaround for Zen2 with lower amount of cores.
             export TREX_CORE_COUNT=14
+            ;;
+        *"-x-2n"* | *"-x-3n"* )
+            export TREX_CORE_COUNT=14
+            export TREX_PORT_MTU=9000
+            # Settings to prevent duration stretching.
+            export PERF_TRIAL_STL_DELAY=0.12
+            ;;
     esac
 }
 
@@ -1396,10 +1375,6 @@ function untrap_and_unreserve_testbed () {
                 TERRAFORM_MODULE_DIR="terraform-aws-${NODENESS}-${FLAVOR}-c5n"
                 terraform_destroy || die "Failed to call terraform destroy."
                 ;;
-            *"2n-c6gn" | *"3n-c6gn")
-                TERRAFORM_MODULE_DIR="terraform-aws-${NODENESS}-${FLAVOR}"
-                terraform_destroy || die "Failed to call terraform destroy."
-                ;;
             *"2n-c7gn" | *"3n-c7gn")
                 TERRAFORM_MODULE_DIR="terraform-aws-${NODENESS}-${FLAVOR}"
                 terraform_destroy || die "Failed to call terraform destroy."