Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
583e2b9
feat: CPU queue parent scheduler node
nicholasching Jun 15, 2026
349b040
fix: vppProcessEvents sleep tuning
nicholasching Jun 15, 2026
49f0d13
fix: re-apply admin-up after host-interface create
nicholasching Jun 15, 2026
d99bb4c
fix: L3-over-LAG forwarding (backend) in SwitchVppFdb
nicholasching Jun 23, 2026
e0c2ea3
fix: LAG-RIF neighbor/route create and LAG member egress-disable
nicholasching Jun 23, 2026
6af1c56
fix: neighbor host route pinned to local0
nicholasching Jun 23, 2026
77a77e9
feat: configuration for 32 ports; phase 1, task 2
nicholasching Jun 5, 2026
b2ee2a3
feat: configuration and run script; phase 1, task 3-4; fails to pass …
nicholasching Jun 10, 2026
145aec2
fix: ifmap prefix, IPv6 disable, PortChannel emulation, veth-up watch…
nicholasching Jun 15, 2026
4cd92d8
fix: run multiple tests sequentially by grouping tests by config sign…
nicholasching Jun 15, 2026
2661943
feat: script to generate compatabilty matrix from test results
nicholasching Jun 15, 2026
82ca412
docs: add feature development progress context
nicholasching Jun 15, 2026
15776bb
docs: add build and usage instructions for UT harness
nicholasching Jun 15, 2026
dcc9a8f
chore: add hold when debug enabled to leave container running for deb…
nicholasching Jun 16, 2026
c36a5f1
docs: add demo documentation
nicholasching Jun 16, 2026
b882a30
docs: add coverage by functionality
nicholasching Jun 16, 2026
01a0762
docs: minor updates to demo doc
nicholasching Jun 16, 2026
120e57f
feat: L3-over-LAG forwarding (harness) — LAG/SVI interface-IP assignment
nicholasching Jun 23, 2026
c78809e
docs: current dev state, compatibility matrix
nicholasching Jun 17, 2026
4e1091b
docs: LAG-RIF neighbor/route + egress-disable progress (6-18)
nicholasching Jun 23, 2026
5780b35
feat: harness per-test isolation mode, restart backend between tests
nicholasching Jun 23, 2026
b34a713
docs: update to span full width
nicholasching Jun 19, 2026
5cda18e
docs: neighbor host-route local0 fix progress (6-19)
nicholasching Jun 23, 2026
4618cda
fix: address Semgrep findings in UT harness (defusedxml, Dockerfile U…
nicholasching Jun 23, 2026
cd0392b
fix: add SWSS_LOG_ENTER to neighbor host-route helpers
nicholasching Jun 23, 2026
7805b63
chore: strip trailing whitespace in progress-6-10 devdoc
nicholasching Jun 23, 2026
eb837f2
fix: keep NHG member hwif names alive for ip_route_add_del
nicholasching Jun 26, 2026
26b06c6
fix: extract resolveNexthopMemberHwif for route NHG members
nicholasching Jun 26, 2026
31a2d2a
fix: centralize LAG be tap and BondEthernet hwif naming
nicholasching Jun 26, 2026
2667ad0
fix: fold neighbor host-route into addRemoveIpNbr
nicholasching Jun 26, 2026
d27b5ac
fix: do not program interface IP on RIF-nexthop route
nicholasching Jun 26, 2026
e554f93
fix: restore vppProcessEvents poll interval to 2s
nicholasching Jun 26, 2026
51cb75c
docs: remove devdocs, demodocs, consolidate results matrix into READM…
nicholasching Jun 29, 2026
cd93fc5
feat: add script to automate staging, build, and missing .debs errors
nicholasching Jun 29, 2026
b9319d8
feat: route libsaivs SWSS_LOG_* to stdout via LD_PRELOAD shim
nicholasching Jun 29, 2026
2bf43ab
docs: consolidate results matrix into README supported-test list
nicholasching Jun 29, 2026
80f20dc
feat: separate VPP startup configuration from code into a template
nicholasching Jun 30, 2026
16168bf
feat: execute VPP interface creation and RX mode setup at startup via…
nicholasching Jun 30, 2026
250031f
chore: migrate harness to Debian Trixie
nicholasching Jun 30, 2026
05af734
fix: retry VPP interface verification after init.cli startup
nicholasching Jun 30, 2026
7ef37b9
fix: Trixie harness image build and libpcre3 deb staging
nicholasching Jun 30, 2026
91adf0b
chore: drop SAI submodule pointer bump from harness PR
nicholasching Jul 2, 2026
4df2021
refactor: move PortChannel and LAG/SVI IP setup into sai_test setUp
nicholasching Jul 3, 2026
dbf2ffe
fix: tear down host-interface VPP state on remove and make recreate i…
nicholasching Jul 3, 2026
4da0942
docs: explain why the harness restarts the backend per test instead o…
nicholasching Jul 6, 2026
e57cb6e
chore: drop sai_test overrides and drive PortChannel/RIF setup via SI…
nicholasching Jul 6, 2026
a01722c
fix: satisfy aspell and SWSS_LOG_ENTER checks in UT harness preload shim
nicholasching Jul 8, 2026
8bda514
feat: dedicated event socket and thread for VPP async events
nicholasching Jun 15, 2026
fa2d9ed
fix: extend idle deadline on successful socket read in WR macros
nicholasching Jul 2, 2026
fce3891
docs: document EVENT_LOCK and VPP_LOCK ordering rule
nicholasching Jul 2, 2026
a402c74
fix: self-heal VPP port oper-status and reconnect event socket
nicholasching Jul 3, 2026
4310b46
fix: serialize VPP interface table access between command and event t…
nicholasching Jul 7, 2026
f92ee36
fix: resync VPP port oper-status on event-socket reconnect instead of…
nicholasching Jul 9, 2026
5acd3d4
Merge branch 'master' into vpp_backend_fixes
nicholasching Jul 10, 2026
783a466
fix: drop duplicate LAG egress-disable after master merge
nicholasching Jul 10, 2026
c89fa1f
Merge remote-tracking branch 'fork/vpp_event_socket' into sai_vpp_ut_…
nicholasching Jul 13, 2026
6675f49
Merge remote-tracking branch 'fork/vpp_ut_harness' into sai_vpp_ut_ph…
nicholasching Jul 13, 2026
8b7b5f9
fix: add missing on_next_hop_group_hw_protection_switchover initializ…
nicholasching Jun 30, 2026
38e191f
fix: initialize dei/vc in TestSaiSerialize for newer SAI qos_map_params
nicholasching Jul 2, 2026
be35a64
fix: initialize valueprecision in TestAttrVersionChecker for newer SA…
nicholasching Jul 2, 2026
80bd7a0
fix: enable tap_plugin for VPP 26.06 linux-cp host-interface creation
nicholasching Jul 3, 2026
d362818
fix: detect bond-interface create failure in vpp_create_lag
nicholasching Jul 3, 2026
0b5312d
chore: bump SAI submodule to sai_vpp_ut_phase3 integration tip
nicholasching Jul 13, 2026
ae662a0
fix: wait for child exit before harness backend restart and fix phase…
nicholasching Jul 14, 2026
876bc45
docs: update supported tests after phase3 full matrix validation
nicholasching Jul 14, 2026
0dca525
docs: refresh docker-sai-test-vpp README and standardize image tag to…
nicholasching Jul 14, 2026
ac94e32
docs: add Monitor section for long matrix runs in harness README
nicholasching Jul 14, 2026
1419d04
feat: build VPP SAI Thrift v2 packages in Trixie CI
nicholasching Jul 15, 2026
fcce612
feat: publish VPP SAI unit-test image artifact
nicholasching Jul 15, 2026
6624f80
feat: add stable VPP SAI regression baseline
nicholasching Jul 15, 2026
8ff8adc
feat: run VPP SAI compatibility matrix in CI
nicholasching Jul 15, 2026
58e805e
docs: document VPP SAI CI workflow
nicholasching Jul 15, 2026
222bf3e
fix: resolve WR macro declaration after master update
nicholasching Jul 15, 2026
346a6d6
fix: satisfy spelling check for stderr logging
nicholasching Jul 16, 2026
ad3c79e
fix: allow skipped optimization for generated Python wrapper
nicholasching Jul 16, 2026
1eae7c6
fix: recursively checkout SAI/test/ptf for docker-sai-test-vpp CI
nicholasching Jul 16, 2026
87c1f4a
fix: derive PTF version before Docker build
nicholasching Jul 17, 2026
529cf35
fix: gate CI on 34-test baseline; document flaky ECMP tests
nicholasching Jul 17, 2026
6f5bc5b
fix: use one VPP build across SAI test stages
nicholasching Jul 17, 2026
81d7124
feat: publish reusable VPP SAI CI contract
nicholasching Jul 20, 2026
e4ddf46
fix: scope relaxed packet checks to flood tests
nicholasching Jul 21, 2026
1072544
fix: preserve JUnit results across test invocations
nicholasching Jul 21, 2026
cbc2ab2
fix: filter simulated IPv6 startup traffic
nicholasching Jul 21, 2026
425dd6c
fix: program VPP drop routes for route packet action
nicholasching Jul 21, 2026
eced8a3
docs: set strict 30-test Phase 3 baseline
nicholasching Jul 22, 2026
1c49515
chore: run ARM and Trixie builds in parallel to optimize CI pipeline
nicholasching Jul 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 227 additions & 0 deletions .azure-pipelines/build-docker-sai-test-vpp-template.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
parameters:
- name: timeout
type: number
default: 60

- name: sairedis_artifact_name
type: string

- name: swss_common_artifact_name
type: string

- name: artifact_name
type: string

- name: vpp_run_id
type: string

jobs:
- job: BuildSaiTestVppImage
displayName: Build docker-sai-test-vpp
timeoutInMinutes: ${{ parameters.timeout }}

pool:
vmImage: 'ubuntu-22.04'

steps:
- checkout: self
clean: true
submodules: recursive

- task: DownloadPipelineArtifact@2
inputs:
artifact: ${{ parameters.sairedis_artifact_name }}
path: $(Build.ArtifactStagingDirectory)/download
patterns: |
**/libsairedis_*.deb
**/libsaivs_*.deb
**/libsaimetadata_*.deb
**/saiserverv2_*.deb
**/python-saithriftv2_*.deb
displayName: Download sonic sairedis deb packages

- task: DownloadPipelineArtifact@2
name: downloadSwssCommon
inputs:
source: specific
project: build
pipeline: Azure.sonic-swss-common
artifact: ${{ parameters.swss_common_artifact_name }}
path: $(Build.ArtifactStagingDirectory)/download
runVersion: latestFromBranch
runBranch: refs/heads/$(BUILD_BRANCH)
allowPartiallySucceededBuilds: true
patterns: |
**/libswsscommon_*.deb
**/libswsscommon-dev_*.deb
displayName: Download sonic swss common deb packages

- task: DownloadPipelineArtifact@2
name: downloadCommonLib
inputs:
source: specific
project: build
pipeline: Azure.sonic-buildimage.common_libs
artifact: common-lib
path: $(Build.ArtifactStagingDirectory)/download
runVersion: latestFromBranch
runBranch: refs/heads/$(BUILD_BRANCH)
patterns: |
**/target/debs/trixie/libyang3_*.deb
**/target/debs/trixie/libpcre3_*.deb
displayName: Download sonic-buildimage common packages

- task: DownloadPipelineArtifact@2
name: downloadVpp
inputs:
source: specific
project: build
pipeline: sonic-net.sonic-platform-vpp
artifact: vpp-trixie
path: $(Build.ArtifactStagingDirectory)/download
runVersion: specific
runId: ${{ parameters.vpp_run_id }}
displayName: Download resolved sonic platform-vpp packages

- script: |
set -euxo pipefail

download_dir="$(Build.ArtifactStagingDirectory)/download"
deb_dir="$(System.DefaultWorkingDirectory)/.azure-pipelines/docker-sai-test-vpp/debs"
context_dir="$(Build.ArtifactStagingDirectory)/docker-context"
image_tag="docker-sai-test-vpp:$(Build.DefinitionName).$(Build.BuildNumber)"
ptf_dir="$(System.DefaultWorkingDirectory)/SAI/test/ptf"
sai_revision="$(git -C SAI rev-parse HEAD)"
ptf_revision="$(git -C "$ptf_dir" rev-parse HEAD)"
ptf_describe="$(git -C "$ptf_dir" describe --tags --long --always HEAD)"
ptf_version="$(python3 .azure-pipelines/docker-sai-test-vpp/derive_ptf_version.py "$ptf_dir")"

if [[ "$(downloadVpp.BuildNumber)" != "${{ parameters.vpp_run_id }}" ]]; then
echo "Resolved VPP run ${{ parameters.vpp_run_id }}, downloaded $(downloadVpp.BuildNumber)" >&2
exit 1
fi

rm -rf "$deb_dir"
mkdir -p "$deb_dir"

copy_one_deb()
{
local pattern="$1"
mapfile -t matches < <(find "$download_dir" -type f -name "$pattern" | sort)
if [[ "${#matches[@]}" -ne 1 ]]; then
echo "Expected exactly one $pattern package, found ${#matches[@]}" >&2
printf ' %s\n' "${matches[@]}" >&2
exit 1
fi
cp -v "${matches[0]}" "$deb_dir/"
}

copy_optional_deb()
{
local pattern="$1"
mapfile -t matches < <(find "$download_dir" -type f -name "$pattern" | sort)
if [[ "${#matches[@]}" -gt 1 ]]; then
echo "Expected at most one $pattern package, found ${#matches[@]}" >&2
printf ' %s\n' "${matches[@]}" >&2
exit 1
fi
if [[ "${#matches[@]}" -eq 1 ]]; then
cp -v "${matches[0]}" "$deb_dir/"
fi
}

copy_one_deb 'libvppinfra_*_amd64.deb'
copy_one_deb 'vpp_*_amd64.deb'
copy_one_deb 'vpp-plugin-core_*_amd64.deb'
copy_one_deb 'vpp-plugin-dpdk_*_amd64.deb'
copy_one_deb 'libsaivs_*_amd64.deb'
copy_one_deb 'libsairedis_*_amd64.deb'
copy_one_deb 'libsaimetadata_*_amd64.deb'
copy_one_deb 'saiserverv2_*_amd64.deb'
copy_one_deb 'python-saithriftv2_*_amd64.deb'
copy_one_deb 'libswsscommon_*_amd64.deb'
copy_optional_deb 'libswsscommon-dev_*_amd64.deb'
copy_one_deb 'libyang3_*_amd64.deb'
copy_optional_deb 'libpcre3_*_amd64.deb'

provenance="$(Build.ArtifactStagingDirectory)/provenance.txt"
{
echo "build_definition=$(Build.DefinitionName)"
echo "build_number=$(Build.BuildNumber)"
echo "build_id=$(Build.BuildId)"
echo "source_version=$(Build.SourceVersion)"
echo "source_branch=$(Build.SourceBranch)"
echo "sai_revision=$sai_revision"
echo "ptf_revision=$ptf_revision"
echo "ptf_describe=$ptf_describe"
echo "ptf_version=$ptf_version"
echo "vpp_resolved_run_id=${{ parameters.vpp_run_id }}"
echo "vpp_downloaded_build=$(downloadVpp.BuildNumber)"
echo "swss_common_downloaded_build=$(downloadSwssCommon.BuildNumber)"
echo "common_lib_downloaded_build=$(downloadCommonLib.BuildNumber)"
echo
echo "packages:"
for deb in "$deb_dir"/*.deb; do
echo "File=$(basename "$deb")"
dpkg-deb -f "$deb" Package Version Architecture
sha256sum "$deb"
done
} > "$provenance"

rm -rf "$context_dir"
context_harness="$context_dir/.azure-pipelines/docker-sai-test-vpp"
mkdir -p "$context_harness" "$context_dir/SAI/test"
for harness_file in \
Dockerfile \
lanemap.ini \
port-map.ini \
ptf-port-map.ini \
run_test.sh \
sai.profile \
swss_log_stdout_preload.cpp \
vpp_startup.conf.template; do
cp -a ".azure-pipelines/docker-sai-test-vpp/$harness_file" "$context_harness/"
done
cp -a "$deb_dir" "$context_harness/"
cp -a SAI/test/ptf "$context_dir/SAI/test/"
cp -a SAI/test/sai_test "$context_dir/SAI/test/"

build_args=(
--no-cache
--build-arg "PTF_VERSION=$ptf_version"
--label com.sonic.saivpp-ci=true
-f "$context_harness/Dockerfile"
-t "$image_tag"
)
for proxy_var in http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY; do
if [[ -n "${!proxy_var:-}" ]]; then
build_args+=(--build-arg "$proxy_var=${!proxy_var}")
fi
done
docker build "${build_args[@]}" "$context_dir"

echo "$image_tag" > "$(Build.ArtifactStagingDirectory)/image-tag.txt"
docker save "$image_tag" | gzip -c > "$(Build.ArtifactStagingDirectory)/docker-sai-test-vpp.gz"
contract_dir="$(Build.ArtifactStagingDirectory)/ci-contract"
mkdir -p "$contract_dir"
for contract_file in \
ci-matrix-tests.txt \
ci-pass-tests.txt \
evaluate_ci_baseline.py \
gen_compatibility_matrix.py; do
cp -v ".azure-pipelines/docker-sai-test-vpp/$contract_file" "$contract_dir/"
done
(
cd "$(Build.ArtifactStagingDirectory)"
sha256sum \
docker-sai-test-vpp.gz \
image-tag.txt \
provenance.txt \
ci-contract/* > SHA256SUMS
)
rm -rf "$download_dir" "$context_dir"
displayName: Build ${{ parameters.artifact_name }}

- publish: $(Build.ArtifactStagingDirectory)/
artifact: ${{ parameters.artifact_name }}
displayName: Archive VPP SAI test image
80 changes: 68 additions & 12 deletions .azure-pipelines/build-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,27 @@ parameters:
- name: debian_version
type: string

- name: saithrift_v2
type: boolean
default: false

- name: depends_on
type: object
default: []

- name: vpp_run_id
type: string
default: ''

jobs:
- job:
dependsOn: ${{ parameters.depends_on }}
displayName: ${{ parameters.arch }}
timeoutInMinutes: ${{ parameters.timeout }}
variables:
DIFF_COVER_CHECK_THRESHOLD: 80
${{ if ne(parameters.vpp_run_id, '') }}:
VPP_RUN_ID: $[ dependencies.ResolveVpp.outputs['resolveVppRun.VPP_RUN_ID'] ]
${{ if eq(parameters.run_unit_test, true) }}:
DIFF_COVER_ENABLE: 'true'

Expand Down Expand Up @@ -187,18 +202,32 @@ jobs:
sudo dpkg -i $(find ./download -name *.deb)
workingDirectory: $(Build.ArtifactStagingDirectory)
displayName: "Install libyang from common lib"
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: build
pipeline: sonic-net.sonic-platform-vpp
artifact: vpp-${{ parameters.debian_version }}
runVersion: 'latestFromBranch'
runBranch: 'refs/heads/master'
allowPartiallySucceededBuilds: true
path: $(Build.ArtifactStagingDirectory)/download
displayName: "Download sonic platform-vpp deb packages"
condition: eq('${{ parameters.arch }}', 'amd64')
- ${{ if eq(parameters.vpp_run_id, '') }}:
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: build
pipeline: sonic-net.sonic-platform-vpp
artifact: vpp-${{ parameters.debian_version }}
runVersion: 'latestFromBranch'
runBranch: 'refs/heads/master'
allowPartiallySucceededBuilds: true
path: $(Build.ArtifactStagingDirectory)/download
displayName: "Download sonic platform-vpp deb packages"
condition: eq('${{ parameters.arch }}', 'amd64')
- ${{ if ne(parameters.vpp_run_id, '') }}:
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: build
pipeline: sonic-net.sonic-platform-vpp
artifact: vpp-${{ parameters.debian_version }}
runVersion: specific
runId: ${{ parameters.vpp_run_id }}
allowPartiallySucceededBuilds: true
path: $(Build.ArtifactStagingDirectory)/download
displayName: "Download specified sonic platform-vpp deb packages"
condition: eq('${{ parameters.arch }}', 'amd64')
- script: |
set -ex
sudo dpkg -i download/libvppinfra-dev_*_${{ parameters.arch }}.deb
Expand Down Expand Up @@ -273,6 +302,33 @@ jobs:
gcovr -r ./ -e ".*/SAI/.*" -e ".+/json.hpp" -e "swss/.+" -e ".*/.libs/.*" -e ".*/debian/.*" -e "vslib/vpp/.*" --exclude-unreachable-branches --json-pretty -o coverage-all.json
gcovr -a "coverage-*.json" -x --xml-pretty -o coverage.xml
displayName: "Run sonic sairedis unit tests"
- ${{ if eq(parameters.saithrift_v2, true) }}:
- script: |
set -euxo pipefail

sudo apt-get update
sudo apt-get install -qq -y \
dh-exec \
libthrift-dev \
python3-setuptools \
python3-thrift \
thrift-compiler

sudo apt-get install -y \
./libsaimetadata_1.0.0_${{ parameters.arch }}.deb \
./libsaimetadata-dev_1.0.0_${{ parameters.arch }}.deb \
./libsaivs_1.0.0_${{ parameters.arch }}.deb \
./libsaivs-dev_1.0.0_${{ parameters.arch }}.deb

rm -f ./*saithriftv2*.deb ./saiserverv2*.deb
pushd SAI
SAITHRIFTV2=true SAITHRIFT_VER=v2 platform=vpp \
dpkg-buildpackage -us -uc -b -j$(nproc)
popd

test -s saiserverv2_0.9.4_${{ parameters.arch }}.deb
test -s python-saithriftv2_0.9.4_${{ parameters.arch }}.deb
displayName: "Build VPP SAI Thrift v2 packages"
- publish: $(System.DefaultWorkingDirectory)/
artifact: ${{ parameters.artifact_name }}
displayName: "Archive sonic sairedis debian packages"
Expand Down
7 changes: 7 additions & 0 deletions .azure-pipelines/docker-sai-test-vpp/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Local-only working notes and test artifacts (not published to remote).
# devdocs/ — progress/debug logs for agent/developer context across branches
# demodocs/ — stakeholder demo notes
# results/ — JUnit XML, run logs, compatibility matrices (update README pass list when changed)
devdocs/
demodocs/
results/
Loading
Loading