Skip to content

Commit

Permalink
Refactor: Moved validation tests run to script file
Browse files Browse the repository at this point in the history
Refactor: Moved validation tests run to script file
Signed-off-by: Milosz Linkiewicz <milosz.linkiewicz@intel.com>
  • Loading branch information
Mionsz committed Feb 18, 2025
1 parent 46e88cb commit e623f83
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 86 deletions.
99 changes: 99 additions & 0 deletions .github/scripts/run_validation_tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/bin/bash

set +e

# Function to log messages to GitHub Actions
log_to_github() {
echo "$1" >>"$GITHUB_STEP_SUMMARY"
}

# Function to run a test and handle retries
run_test() {
local test=$1
local retries=$2
local test_port_p=$3
local test_port_r=$4
local start_time
local end_time
local duration

echo "::group::${test}"
start_time=$(date '+%s')
sudo --preserve-env python3 -m pipenv run pytest "${test}" --media=/mnt/media --build="../.." --nic="${test_port_p},${test_port_r}" --collect-only -q --no-summary

for retry in $(seq 1 "$retries"); do
echo "sudo --preserve-env python3 -m pipenv run pytest \"${test}\" --media=/mnt/media --build=\"../..\" --nic=\"${test_port_p},${test_port_r}\""
sudo --preserve-env python3 -m pipenv run pytest "${test}" --media=/mnt/media --build="../.." --nic="${test_port_p},${test_port_r}"
local result=$?
echo "RETRY: ${retry}"
[[ "$result" == "0" ]] && break
done

end_time=$(date '+%s')
duration=$((end_time - start_time))
local status=""
local suffix="[Err]"

if [[ "$result" == "0" ]]; then
status=""
suffix="[OK]"
TESTS_SUCCESS+=("${test}")
else
TESTS_FAIL+=("${test}")
fi

log_to_github "| ${status} | ${test} | $(date --date="@${start_time}" '+%d%m%y_%H%M%S') | $(date --date="@${end_time}" '+%d%m%y_%H%M%S') | ${duration}s | ${suffix} |"
echo "::endgroup::"
}

# Main script execution
echo "::group::pre-execution-summary"

# Export environment variables
export TEST_PORT_P="${TEST_PORT_P}"
export TEST_PORT_R="${TEST_PORT_R}"

# Collect tests to be executed
TESTS_INCLUDED_IN_EXECUTION=(
$(grep -v "collected in" <(sudo --preserve-env python3 -m pipenv run pytest "tests/${VALIDATION_TESTS_1}" --media=/mnt/media --build="../.." --nic="${TEST_PORT_P},${TEST_PORT_R}" --collect-only -q --no-summary 2>&1))
)
SUMMARY_MAIN_HEADER="Starting tests/${VALIDATION_TESTS_1}"

if [[ -n "${VALIDATION_TESTS_2}" ]]; then
TESTS_INCLUDED_IN_EXECUTION+=(
$(grep -v "collected in" <(sudo --preserve-env python3 -m pipenv run pytest "tests/${VALIDATION_TESTS_2}" --media=/mnt/media --build="../.." --nic="${TEST_PORT_P},${TEST_PORT_R}" --collect-only -q --no-summary 2>&1))
)
SUMMARY_MAIN_HEADER="${SUMMARY_MAIN_HEADER}, tests/${VALIDATION_TESTS_2}"
fi

NUMBER_OF_TESTS="${#TESTS_INCLUDED_IN_EXECUTION[@]}"
TESTS_FAIL=()
TESTS_SUCCESS=()

echo "${SUMMARY_MAIN_HEADER} tests (total ${NUMBER_OF_TESTS}) :rocket:"
echo "----------------------------------"
echo "Tests to be executed:"
echo "${TESTS_INCLUDED_IN_EXECUTION[@]}"

log_to_github "## ${SUMMARY_MAIN_HEADER} tests (total ${NUMBER_OF_TESTS}) :rocket:"
log_to_github "| ❌/✅ | Collected Test | Started | Ended | Took (s) | Result |"
log_to_github "| --- | --- | --- | --- | --- | --- |"
echo "::endgroup::"

# Execute each test
for test in "${TESTS_INCLUDED_IN_EXECUTION[@]}"; do
run_test "$test" "$PYTEST_RETRIES" "$TEST_PORT_P" "$TEST_PORT_R"
done

# Summary of test results
log_to_github "### Total success ${#TESTS_SUCCESS[@]}/${NUMBER_OF_TESTS}:"
log_to_github "${TESTS_SUCCESS[@]}"
log_to_github "### Total failed ${#TESTS_FAIL[@]}/${NUMBER_OF_TESTS}:"
log_to_github "${TESTS_FAIL[@]}"

# Determine exit status
if [[ "${#TESTS_FAIL[@]}" == "0" ]] || [[ "${VALIDATION_NO_FAIL_TESTS}" == "true" ]]; then
exit 0
else
exit 1
fi
8 changes: 6 additions & 2 deletions .github/workflows/gtest-bare-metal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ env:
# Customize the env if
BUILD_TYPE: 'Release'
DPDK_VERSION: '23.11'
DPDK_REBUILD: 'false'
# Bellow ENV variables are required to be defined on runner side:
# TEST_PF_PORT_P: '0000:49:00.0'
# TEST_PF_PORT_R: '0000:49:00.1'
Expand Down Expand Up @@ -71,6 +72,7 @@ jobs:
ref: '${{ inputs.branch-to-checkout || github.head_ref || github.ref }}'

- name: Checkout DPDK
if: env.DPDK_REBUILD == 'true'
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
repository: 'DPDK/dpdk'
Expand All @@ -83,10 +85,12 @@ jobs:
sudo apt-get install -y systemtap-sdt-dev
- name: Apply dpdk patches
if: env.DPDK_REBUILD == 'true'
run: |
patch -d "dpdk" -p1 -i <(cat patches/dpdk/${{ env.DPDK_VERSION }}/*.patch)
- name: Build dpdk
if: env.DPDK_REBUILD == 'true'
run: |
cd dpdk
meson build
Expand Down Expand Up @@ -119,8 +123,8 @@ jobs:
- name: Binding network adapter
run: |
sudo ./script/nicctl.sh create_vf "${TEST_PF_PORT_P}" || true
sudo ./dpdk/usertools/dpdk-devbind.py -b vfio-pci "${TEST_DMA_PORT_P}" || true
sudo ./dpdk/usertools/dpdk-devbind.py -b vfio-pci "${TEST_DMA_PORT_R}" || true
sudo dpdk-devbind.py -b vfio-pci "${TEST_DMA_PORT_P}" || true
sudo dpdk-devbind.py -b vfio-pci "${TEST_DMA_PORT_R}" || true
- name: Start MtlManager at background
run: |
Expand Down
121 changes: 38 additions & 83 deletions .github/workflows/validation-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,10 @@ on:
- TEST_VF_PORT_P_0
- TEST_VF_PORT_P_1
- TEST_VF_PORT_P_2
- TEST_VF_PORT_P_3
- TEST_PF_PORT_P
- TEST_VF_PORT_R_0
- TEST_VF_PORT_R_1
- TEST_VF_PORT_R_2
- TEST_VF_PORT_R_3
- TEST_PF_PORT_R
- TEST_DMA_PORT_P
- TEST_DMA_PORT_R
Expand All @@ -44,12 +42,10 @@ on:
- TEST_VF_PORT_P_1
- TEST_VF_PORT_P_0
- TEST_VF_PORT_P_2
- TEST_VF_PORT_P_3
- TEST_PF_PORT_P
- TEST_VF_PORT_R_0
- TEST_VF_PORT_R_1
- TEST_VF_PORT_R_2
- TEST_VF_PORT_R_3
- TEST_PF_PORT_R
- TEST_DMA_PORT_P
- TEST_DMA_PORT_R
Expand Down Expand Up @@ -111,6 +107,7 @@ on:
env:
BUILD_TYPE: 'Release'
DPDK_VERSION: '23.11'
DPDK_REBUILD: 'false'

permissions:
contents: read
Expand All @@ -130,8 +127,8 @@ jobs:
- name: 'preparation: Restore valid repository owner and print env'
if: always()
run: |
sudo chown -R "${USER}" "$(pwd)"
env | grep TEST_
sudo chown -R "${USER}" "$(pwd)" || true
env | grep TEST_ || true
- name: 'preparation: Checkout MTL'
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
Expand All @@ -140,6 +137,7 @@ jobs:

- name: 'preparation: Checkout DPDK'
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
if: env.DPDK_REBUILD == 'true'
with:
repository: 'DPDK/dpdk'
ref: 'v${{ env.DPDK_VERSION }}'
Expand All @@ -163,14 +161,18 @@ jobs:
libsdl2-dev \
libsdl2-ttf-dev \
libssl-dev \
systemtap-sdt-dev
systemtap-sdt-dev \
libbpf-dev \
libelf1
- name: 'configuration: Apply dpdk patches'
if: env.DPDK_REBUILD == 'true'
run: |
patch -d "dpdk" -p1 -i <(cat patches/dpdk/${{ env.DPDK_VERSION }}/*.patch)
- name: 'installation: Build dpdk'
working-directory: dpdk
if: env.DPDK_REBUILD == 'true'
run: |
meson build
ninja -C build
Expand Down Expand Up @@ -231,70 +233,22 @@ jobs:
sudo rmmod irdma || true
sudo ./script/nicctl.sh ${{ inputs.validation-iface-binding }} "${TEST_PF_PORT_P}" || true
sudo ./script/nicctl.sh ${{ inputs.validation-iface-binding }} "${TEST_PF_PORT_R}" || true
sudo modprobe irdma || true
- name: 'preparation: Start MtlManager at background'
run: |
sudo MtlManager &
- name: 'execution: Run validation-tests in pipenv environment'
- name: 'execution: Run validation-bare-metal tests in pipenv environment'
working-directory: tests/validation
run: |
set +e
echo "::group::pre-execution-summary"
export TEST_PORT_P="${{ env.TEST_PORT_P }}"
export TEST_PORT_R="${{ env.TEST_PORT_R }}"
TESTS_INCLUDED_IN_EXECUTION=( $(grep -v "collected in" <(${{ env.PYTEST_ALIAS }} "tests/${{ inputs.validation-tests-1 }}" ${{ env.PYTEST_PARAMS }} --nic="${TEST_PORT_P},${TEST_PORT_R}" --collect-only -q --no-summary 2>&1)) )
SUMMARY_MAIN_HEADER="Starting tests/${{ inputs.validation-tests-1 }}"
if [[ -n "${{ inputs.validation-tests-2 }}" ]]; then
TESTS_INCLUDED_IN_EXECUTION+=( $(grep -v "collected in" <(${{ env.PYTEST_ALIAS }} "tests/${{ inputs.validation-tests-2 }}" ${{ env.PYTEST_PARAMS }} --nic="${TEST_PORT_P},${TEST_PORT_R}" --collect-only -q --no-summary 2>&1)) )
SUMMARY_MAIN_HEADER="${SUMMARY_MAIN_HEADER}, tests/${{ inputs.validation-tests-2 }}"
fi
NUMBER_OF_TESTS="${#TESTS_INCLUDED_IN_EXECUTION[@]}"
TESTS_FAIL=()
TESTS_SUCCESS=()
echo "${SUMMARY_MAIN_HEADER} tests (total ${NUMBER_OF_TESTS}) :rocket:\n----------------------------------"
echo "Tests to be executed:\n${TESTS_INCLUDED_IN_EXECUTION[@]}"
echo "## ${SUMMARY_MAIN_HEADER} tests (total ${NUMBER_OF_TESTS}) :rocket:" >> "$GITHUB_STEP_SUMMARY"
echo "| ❌/✅ | Collected Test | Started | Ended | Took (s) | Result |" >> "$GITHUB_STEP_SUMMARY"
echo "| --- | ---| --- | --- | --- | --- |" >> "$GITHUB_STEP_SUMMARY"
echo "::endgroup::"
for test in ${TESTS_INCLUDED_IN_EXECUTION[@]}; do
echo "::group::${test}"
PYTEST_START_HI="$(date '+%s')"
${{ env.PYTEST_ALIAS }} "${test}" ${{ env.PYTEST_PARAMS }} --nic="${TEST_PORT_P},${TEST_PORT_R}" --collect-only -q --no-summary
for retry in $(seq 1 "${{ env.PYTEST_RETRIES }}"); do
${{ env.PYTEST_ALIAS }} "${test}" ${{ env.PYTEST_PARAMS }} --nic="${TEST_PORT_P},${TEST_PORT_R}"
PYTEST_RESULT="$?"
echo "RETRY: ${retry}"
[[ "${PYTEST_RESULT}" == "0" ]] && break
done
PYTEST_END_HI="$(date '+%s')"
if [[ "${PYTEST_RESULT}" == "0" ]]; then
PREFIX="✅"
SUFFIX="[OK]"
TESTS_SUCCESS+=( "${test}" )
else
PREFIX="❌"
SUFFIX="[Err]"
TESTS_FAIL+=( "${test}" )
fi
echo "| ${PREFIX} | ${test} | $(date --date=@${PYTEST_START_HI} '+%d%m%y_%H%M%S') | $(date --date=@${PYTEST_END_HI} '+%d%m%y_%H%M%S') | $((PYTEST_END_HI-PYTEST_START_HI))s | ${SUFFIX} |" >> "$GITHUB_STEP_SUMMARY"
echo "::endgroup::"
done
echo "### Total success ${#TESTS_SUCCESS[@]}/${NUMBER_OF_TESTS}:" >> "$GITHUB_STEP_SUMMARY"
echo "${TESTS_SUCCESS[@]}" >> "$GITHUB_STEP_SUMMARY"
echo "### Total failed ${#TESTS_FAIL[@]}/${NUMBER_OF_TESTS}:" >> "$GITHUB_STEP_SUMMARY"
echo "${TESTS_FAIL[@]}" >> "$GITHUB_STEP_SUMMARY"
if [[ "${#TESTS_FAIL[@]}" == "0" ]] || [[ "${{ inputs.validation-no-fail-tests }}" == "true" ]]; then
exit 0
else
exit 1
fi
. "${{ github.workspace }}/.github/scripts/run_validation_tests.sh"
env:
TEST_PORT_P: ${{ env.TEST_PORT_P }}
TEST_PORT_R: ${{ env.TEST_PORT_R }}
PYTEST_RETRIES: '3'
VALIDATION_TESTS_1: ${{ inputs.validation-tests-1 }}
VALIDATION_TESTS_2: ${{ inputs.validation-tests-2 }}
VALIDATION_NO_FAIL_TESTS: ${{ inputs.validation-no-fail-tests }}

- name: 'execution: Run validation-pre-release-1 in pipenv environment'
if: inputs.validation-pre-release-1 != 'NONE'
Expand Down Expand Up @@ -339,7 +293,6 @@ jobs:
sudo rmmod irdma || true
sudo ./script/nicctl.sh bind_kernel "${TEST_PF_PORT_P}" || true
sudo ./script/nicctl.sh bind_kernel "${TEST_PF_PORT_R}" || true
sudo modprobe irdma || true
- name: 'cleanup: Validation execution logs'
if: always()
Expand All @@ -351,21 +304,23 @@ jobs:
- name: 'cleanup: Generate runner summary'
if: always()
run: |
echo "## Runner ${{ runner.name }}" >> "$GITHUB_STEP_SUMMARY"
echo "Bellow ENV variables are defined on the ${{ runner.name }} self-hosted runner side" >> "$GITHUB_STEP_SUMMARY"
echo "| Variable | Value |" >> "$GITHUB_STEP_SUMMARY"
echo "| --- | --- |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_PF_PORT_P | ${TEST_PF_PORT_P} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_PF_PORT_R | ${TEST_PF_PORT_R} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_PORT_P | ${TEST_PORT_P} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_PORT_R | ${TEST_PORT_R} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_DMA_PORT_P | ${TEST_DMA_PORT_P} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_DMA_PORT_R | ${TEST_DMA_PORT_R} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_P_0 | ${TEST_VF_PORT_P_0} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_P_1 | ${TEST_VF_PORT_P_1} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_P_2 | ${TEST_VF_PORT_P_2} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_P_3 | ${TEST_VF_PORT_P_3} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_R_0 | ${TEST_VF_PORT_R_0} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_R_1 | ${TEST_VF_PORT_R_1} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_R_2 | ${TEST_VF_PORT_R_2} |" >> "$GITHUB_STEP_SUMMARY"
echo "| TEST_VF_PORT_R_3 | ${TEST_VF_PORT_R_3} |" >> "$GITHUB_STEP_SUMMARY"
{
echo "## Runner ${{ runner.name }}"
echo "Bellow ENV variables are defined on the ${{ runner.name }} self-hosted runner side"
echo "| Variable | Value |"
echo "| --- | --- |"
echo "| TEST_PF_PORT_P | ${TEST_PF_PORT_P} |"
echo "| TEST_PF_PORT_R | ${TEST_PF_PORT_R} |"
echo "| TEST_PORT_P | ${TEST_PORT_P} |"
echo "| TEST_PORT_R | ${TEST_PORT_R} |"
echo "| TEST_DMA_PORT_P | ${TEST_DMA_PORT_P} |"
echo "| TEST_DMA_PORT_R | ${TEST_DMA_PORT_R} |"
echo "| TEST_VF_PORT_P_0 | ${TEST_VF_PORT_P_0} |"
echo "| TEST_VF_PORT_P_1 | ${TEST_VF_PORT_P_1} |"
echo "| TEST_VF_PORT_P_2 | ${TEST_VF_PORT_P_2} |"
echo "| TEST_VF_PORT_P_3 | ${TEST_VF_PORT_P_3} |"
echo "| TEST_VF_PORT_R_0 | ${TEST_VF_PORT_R_0} |"
echo "| TEST_VF_PORT_R_1 | ${TEST_VF_PORT_R_1} |"
echo "| TEST_VF_PORT_R_2 | ${TEST_VF_PORT_R_2} |"
echo "| TEST_VF_PORT_R_3 | ${TEST_VF_PORT_R_3} |"
} >> "$GITHUB_STEP_SUMMARY"
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,5 @@ doc/_build
# Gpu direct files
gpu_direct/tests/fff.h
gpu_direct/subprojects/*
!gpu_direct/subprojects/gtest.wrap
!gpu_direct/subprojects/gtest.wrap
_temp*

0 comments on commit e623f83

Please sign in to comment.