From 14c8b50c3f61284d6bf90518710da863d40d5a75 Mon Sep 17 00:00:00 2001 From: Chris Sommers <31145757+chrispsommers@users.noreply.github.com> Date: Tue, 1 Nov 2022 09:11:47 -0700 Subject: [PATCH] Sai challenger staging - sync to main, Plvision test-framework-extension branches (#272) * Create dash-docker-p4c-bmv2-acr.yml * Update Makefile * Experimenting with ACR publish workflows Revert p4c-bmv2 tag * Update and rename dash-docker-p4c-bmv2-acr.yml to dash-p4c-bmv2-docker-acr.yml * Experimental ACR publish; change regname Use sonicdash ACR for p4c-bmv2. No publish yet. * Update dash-p4c-bmv2-docker-acr.yml Publish to ACR using secrets * Fix macro errors * Update dash-p4c-bmv2-docker-acr.yml Force trigger. * Uncomment docker push command * Build dash-grpc:1.43.2 docker and publish to ACR * Add CI script for saithrift-bldr-docker * Remove superfluous ACR publish steps from regular docker build CI script. * Add CI scripts to build and publish remaining docker images to Azure Container Registery (ACR). * Publish docker images to ACR and use those in build process. (#208) * Add CI script for saithrift-bldr-docker * Remove superfluous ACR publish steps from regular docker build CI script. * Add CI scripts to build and publish remaining docker images to Azure Container Registery (ACR). Co-authored-by: Chris Sommers * Use make target to publish to ACR (just bmv2-bldr as first candidate). * Incremental progress - publish to ACRs (#212) * Add CI script for saithrift-bldr-docker * Remove superfluous ACR publish steps from regular docker build CI script. * Add CI scripts to build and publish remaining docker images to Azure Container Registery (ACR). * Use make target to publish to ACR (just bmv2-bldr as first candidate). Co-authored-by: Chris Sommers * Call docker publish make targets from all CI scripts which publish. * Incremental progress publishing dockers to ACR (#213) * Add CI script for saithrift-bldr-docker * Remove superfluous ACR publish steps from regular docker build CI script. * Add CI scripts to build and publish remaining docker images to Azure Container Registery (ACR). * Use make target to publish to ACR (just bmv2-bldr as first candidate). * Call docker publish make targets from all CI scripts which publish. Co-authored-by: Chris Sommers * Added SAI-Challenger to CI setup. 1. Added SAI-Challenger submodule. 2. Added SAI-Challenger basic test. 3. Changed Makefile to build/start/stop SAI-Challenger. Signed-off-by: Maksym Hedeon * Added saithrift to SAI-Challenger client docker image - Added saithrift to SAI-Challenger client docker image - Changed SAI-C submodule branch Signed-off-by: Maksym Hedeon * Update example vnet test. 1. Added SAI-Challenger submodule. 2. Added SAI-Challenger basic test. 3. Changed Makefile to build/start/stop SAI-Challenger. Signed-off-by: Kostiantyn Goloveshko Co-authored-by: Maksym Hedeon * Add vnet outbound test based on SAI description. Signed-off-by: Maksym Prytoliuk * Fixup double network host usage for sai-challenger-client Signed-off-by: Konstantin Goloveshko * Kdt 17: Update docker environment (#8) * Added cgyang submodule * Updated docker env for thrift tests * Makefile refactor Signed-off-by: Maksym Hedeon * Fixup VNET inbound cleanup removals in test config. Signed-off-by: Konstantin Goloveshko * Update CA_TO_PA entry in outbound test Signed-off-by: Maksym Prytoliuk * Add vnet scenarios in DASH config format. * Added dash-style VNET inbound routing test * Added dash-style VNET outbound routing test * Read config from json (temp workaround) * Added JSON setup configs for testbed Signed-off-by: Anton Putria Co-authored-by: Maksym Prytoliuk * Fixed saigen links. Signed-off-by: Anton Putria * Fixes in test scanario. Signed-off-by: Anton Putria * Fixed path to saigen. Fixed inbound test. Signed-off-by: Anton Putria * Update submodule Signed-off-by: Anton Putria * Final test fixes to align with submodue version. Signed-off-by: Anton Putria * Spellcheck - add to wordslist * Sync to main via intermediate dev branch. (#216) * AMD-Pensando HA Proposal document * Add CI script for saithrift-bldr-docker * Remove superfluous ACR publish steps from regular docker build CI script. * Add CI scripts to build and publish remaining docker images to Azure Container Registery (ACR). * SAI apigen support for tables with no action parameters and a single action (#207) * Update .wordlist.txt * Use make target to publish to ACR (just bmv2-bldr as first candidate). * Call docker publish make targets from all CI scripts which publish. * Doc dash as submodule (#203) * Document third-party workflows using DASH as a Git submodule. * Add URL to sample project. * Incorporate review feedback (typo; missing file). * Spellcheck fixes. * Spellcheck * Add .wordlist.txt to CI triggers. * Spellcheck wordlist. Co-authored-by: Chris Sommers * Split SAI API (#201) Make APIs compatible with SONiC bulk infra Signed-off-by: Marian Pritsak * Add APP_DB to SAI mapping (#102) * Add APP_DB to SAI mapping * Spellcheck - add to wordslist Signed-off-by: Marian Pritsak Co-authored-by: Sanjay Thyamagundalu Co-authored-by: Chris Sommers Co-authored-by: Mukesh Moopath Velayudhan Co-authored-by: KrisNey-MSFT Co-authored-by: Marian Pritsak * Incremental progress publishing dockers to ACR (#219) * AMD-Pensando HA Proposal document * Add CI script for saithrift-bldr-docker * Remove superfluous ACR publish steps from regular docker build CI script. * Add CI scripts to build and publish remaining docker images to Azure Container Registery (ACR). * SAI apigen support for tables with no action parameters and a single action (#207) * Update .wordlist.txt * Use make target to publish to ACR (just bmv2-bldr as first candidate). * Call docker publish make targets from all CI scripts which publish. * Doc dash as submodule (#203) * Document third-party workflows using DASH as a Git submodule. * Add URL to sample project. * Incorporate review feedback (typo; missing file). * Spellcheck fixes. * Spellcheck * Add .wordlist.txt to CI triggers. * Spellcheck wordlist. Co-authored-by: Chris Sommers * Split SAI API (#201) Make APIs compatible with SONiC bulk infra Signed-off-by: Marian Pritsak * Add APP_DB to SAI mapping (#102) * Add APP_DB to SAI mapping * Spellcheck - add to wordslist * Fix docker & Makefile perms (#202) * Incremental work on docker permissions fixes. * More progress on docker and make permissions issues. * Trial remove -u root from CI file. * Makefile and CI file perms * Fix CI docker flags * Final purge of obs sudo commands to fix perms. * Test for veth's before deleting. Co-authored-by: Chris Sommers * Fix ipv6 packet noise (#211) * Ensure ipv6 disabled on veth's prior to PTF tests, fix https://github.com/Azure/DASH/issues/205. * CHange docker registrey for ixia-c to Google cloud (was Dockerhub). No functional change but new b uilds will pull new image into workspaces. * Move ipv6 disable code to a separate shell script. Call it after deploy-ixiac target. Co-authored-by: Chris Sommers Signed-off-by: Marian Pritsak Co-authored-by: Sanjay Thyamagundalu Co-authored-by: Chris Sommers Co-authored-by: Mukesh Moopath Velayudhan Co-authored-by: KrisNey-MSFT Co-authored-by: Marian Pritsak * Remove publish steps from non-ACR CI scripts (consequence of merge). * Incremental progress publishing dockers to ACR. (#220) * AMD-Pensando HA Proposal document * Add CI script for saithrift-bldr-docker * Remove superfluous ACR publish steps from regular docker build CI script. * Add CI scripts to build and publish remaining docker images to Azure Container Registery (ACR). * SAI apigen support for tables with no action parameters and a single action (#207) * Update .wordlist.txt * Use make target to publish to ACR (just bmv2-bldr as first candidate). * Call docker publish make targets from all CI scripts which publish. * Doc dash as submodule (#203) * Document third-party workflows using DASH as a Git submodule. * Add URL to sample project. * Incorporate review feedback (typo; missing file). * Spellcheck fixes. * Spellcheck * Add .wordlist.txt to CI triggers. * Spellcheck wordlist. Co-authored-by: Chris Sommers * Split SAI API (#201) Make APIs compatible with SONiC bulk infra Signed-off-by: Marian Pritsak * Add APP_DB to SAI mapping (#102) * Add APP_DB to SAI mapping * Spellcheck - add to wordslist * Fix docker & Makefile perms (#202) * Incremental work on docker permissions fixes. * More progress on docker and make permissions issues. * Trial remove -u root from CI file. * Makefile and CI file perms * Fix CI docker flags * Final purge of obs sudo commands to fix perms. * Test for veth's before deleting. Co-authored-by: Chris Sommers * Fix ipv6 packet noise (#211) * Ensure ipv6 disabled on veth's prior to PTF tests, fix https://github.com/Azure/DASH/issues/205. * CHange docker registrey for ixia-c to Google cloud (was Dockerhub). No functional change but new b uilds will pull new image into workspaces. * Move ipv6 disable code to a separate shell script. Call it after deploy-ixiac target. Co-authored-by: Chris Sommers * Remove publish steps from non-ACR CI scripts (consequence of merge). Signed-off-by: Marian Pritsak Co-authored-by: Sanjay Thyamagundalu Co-authored-by: Chris Sommers Co-authored-by: Mukesh Moopath Velayudhan Co-authored-by: KrisNey-MSFT Co-authored-by: Marian Pritsak * Trial of env var to define docker img * Add docker .env variable to CI triggers. * Fix stray conflict markers in Makefile. * Fix CI triggers. * Use .env files to define docker images. Fix CI triggers. Remove some docker image CI triggers. * add missing path * Fix path. * Trivial change to force a CI build. * Change Makefile to force CI rebuild. * Trivial change to docker image .env file to test CI triggers. * Change .env file to force CI. * Change grpc docker .env file to trigger CI rebuild. * Change saithrift-bldr docker .env to force CI rebuild. * Change saithrift-client .env file to force CI rebuild/ * Fixed VNET outbound test scenario. Signed-off-by: Anton Putria * Trial docker build/conditional publish. * Get env variable into context. * Correct env filename * Debugging env vars & docker save * Fix CI syntax * Add Makefile targets to upload/download docker image tarball artifact. * Revert to simple conditional job for build+publish. * Conditional CI for non-publish docker job. * Outbound test passes with traffic Fixed configuration based on changes in main. Signed-off-by: Maksym Prytoliuk * Add conditionals to all docker build/publish workflows: run build-only in forks, run build-publish in main repo. * Documenting Docker workflows. * Spellcheck fixes. * Spellcheck fixes. * Add screen cap of skipped job. * Spellcheck * Update PR from dev branch (sync to main) (#224) * Update program-scale-testing-requirements-draft.md Update Scale #'s per Keysight/MSFT call; document is a version which needs an update. * Fix Spelling (#221) * Update AMD-Pensando_HA_Proposal.md Explicitly add 'parallel' to state synchronization stages (per @lguohan ) * Update AMD-Pensando_HA_Proposal.md (#210) * SAI apigen support for tables with no action parameters and a single action (#207) * Update .wordlist.txt * Update AMD-Pensando_HA_Proposal.md * Doc dash as submodule (#203) * Document third-party workflows using DASH as a Git submodule. * Add URL to sample project. * Incorporate review feedback (typo; missing file). * Spellcheck fixes. * Spellcheck * Add .wordlist.txt to CI triggers. * Spellcheck wordlist. Co-authored-by: Chris Sommers * Split SAI API (#201) Make APIs compatible with SONiC bulk infra Signed-off-by: Marian Pritsak * Add APP_DB to SAI mapping (#102) * Add APP_DB to SAI mapping * Update .wordlist.txt Updating w/Chris Signed-off-by: Marian Pritsak Co-authored-by: Mukesh Moopath Velayudhan Co-authored-by: Chris Sommers <31145757+chrispsommers@users.noreply.github.com> Co-authored-by: Chris Sommers Co-authored-by: Marian Pritsak Signed-off-by: Marian Pritsak Co-authored-by: Mukesh Moopath Velayudhan Co-authored-by: Chris Sommers <31145757+chrispsommers@users.noreply.github.com> Co-authored-by: Chris Sommers Co-authored-by: Marian Pritsak * Update .wordlist.txt * Slide deck for today's SAI Challenger presentation * [doc]: Fix the typo of TCP UDP protocol number (#223) According to: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml, the ptotocol number of TCP should be 6, and the UDP's should be 17. * Proofreading, image clarity. Signed-off-by: Marian Pritsak Co-authored-by: KrisNey-MSFT Co-authored-by: Mukesh Moopath Velayudhan Co-authored-by: Chris Sommers Co-authored-by: Marian Pritsak Co-authored-by: Ze Gan * Use env variable for DASH_ACR_LOGIN_SERVER instead of secret. * Use literal expression instead of env variable. * Use literal expression for ACR repository instead of secret. * Clarify docker publishing. * Spellcheck. * Document another dockerfile workflow. * spellcheck * CI triggers on PR to any branch, not just main. * Update documentation - Added dash-test-sai-challenger.md doc file under test/docs - Updated Makefile make run-saic-test-thrift target with passing parameters. Signed-off-by: Maksym Hedeon * Updated SAI-Challenger submodule. Signed-off-by: Anton Putria * Improvements to SAI-Challenger docker flows. - Use docker hub to pull images - Fixed make run-saic-tests to do not show errors - Updated manuals Signed-off-by: Anton Putria * Fixes per review feedback https://github.com/Azure/DASH/pull/225#issuecomment-1255519264: - fix image; (docxkerhub->ACR in one case - replace "local" with "host" Expand on instructions for writing and running PTF tests (from verbal feedback in WG meeting, not an issue or PR review). Discovered an oversight in the dockerfile .env files which prevented overriding image macros (had to replace = with ?=); tested fix. * Spellcheck. * Spellcheck. * Update dash-test-sai-challenger.md Signed-off-by: Mircea Dan Gheorghe * Add bmv2 SAI port attributes (num_active, port_list), dflt vlan, dflt vrf) * Added SAI-Challenger docker build verification to GitHub actions - Added SAI-Challenger docker verification action. - Fixed spellchecker and docker build issues. Signed-off-by: Anton Putria * Add default .1Q bridge to bmv2 Signed-off-by: Maksym Prytoliuk * Fixed SAI-Challenger user guide and file namings. Signed-off-by: Anton Putria * Spellcheck * Scaled VNET outbound test using snappi and saigen. (1st edition) - Split scale and simple tests / jsons - Updated ixia controller version - Added dash_helper for traffic profile scaling. Signed-off-by: Maksym Hedeon * spellcheck * Move saichallenger client docker to ACR. * Fix .yml formatting. * Fix dependency in action file. * Add missing .env file * remove space in action script, add .env dependencies * fix include path * Add saichalleneger tests to run-all-tests and CI * Fix docker image name. * Correct mixup in image names. * Remove stray hyphen * Run saichallenger workflows on any branch PR. * Added few more VNET scenario examples. - Extended VNET traffic scenarios. - Added docstrings for helper methods. - Removed unused code. Signed-off-by: Anton Putria Co-authored-by: Maksym Hedeon * Slides from DASH WG Meeting (SAI Challenger Episode 2) (#254) * Add outbound diagram Signed-off-by: Maksym Prytoliuk * Added inbound to xfail test results. (#44) - Marked VNET Inbound Routing with xfail - Added pytest.ini with marks definitions. - Decreased duration of tests. Signed-off-by: Anton Putria * Scaling test configuration documentation - Added scaling approach documentation. - Vnet2vnet traffic scaling scenario description. - Added docstring to the test cases. - Added more test examples. Signed-off-by: Anton Putria Co-authored-by: Maksym Hedeon Co-authored-by: Maksym Prytoliuk * Submodule update and rename * Rename and update the SAI-Challenger submodule * Enabled additional tests based on the fixes in the SAI-Challenger. * Renamed test folder. Signed-off-by: Anton Putria * PTF: add basic test infra and more test cases (#231) * ptf: add vnet sample test cases for dash - Common VNet API for all tests - Test cases: - Inbound VNI/ENI - Inbound Routing PA validate - Inbound Routing VNI match - Inbound Routing PA SRC IP - Outbound Routing Vnet direct - Outbound Routing direct - CT (just placeholder) - Route (basic) Signed-off-by: Volodymyr Mytnyk Signed-off-by: Yuriy Harhas * ptf: run only bmv2 ready test case on CI Signed-off-by: Volodymyr Mytnyk * ptf: test_saithrift_vnet: removed unused libs Signed-off-by: Volodymyr Mytnyk * test-cases folder restructure. - created two subfolders in root: functional and scale - removed outdated bmv2_model folder - moved all existing content of test-cases to test-cases/scale Signed-off-by: Anton Putria * Moved saidashvnet.py to a proper location. Signed-off-by: Anton Putria * Fixed ENI creation in Outbound tests Signed-off-by: Yuriy Harhas * Spellchecker related fixes. Signed-off-by: Anton Putria * Updated VNET test cases based on the PR #238. Signed-off-by: Yuriy Harhas Signed-off-by: Volodymyr Mytnyk Signed-off-by: Yuriy Harhas Signed-off-by: Anton Putria Co-authored-by: Anton Putria Co-authored-by: Yuriy Harhas * Adding updated license files (#266) * Fixbug: SAI Server crash on DASH ACL API (#264) 1. Fix duplicate SAI ID 2. Wrong search action 3. Double delete entry if SAI write error 4. Wrong format of error message Signed-off-by: Ze Gan * Add VNET v6 PTF test case; Fix v4 PTF test case to address test hang issue (#263) This PR adds VNET v6 test case and also fixes the PTF thrift client issue (the v6 test case just hangs) #237. This is a joint work with @chrispsommers and @aputriax. * Fixed links in the README after renaming folders. (#262) Signed-off-by: Anton Putria Signed-off-by: Anton Putria * Correct CI file, was publishing wrong image. Some prior merge must have caused a mixup. Signed-off-by: Maksym Hedeon Signed-off-by: Kostiantyn Goloveshko Signed-off-by: Maksym Prytoliuk Signed-off-by: Konstantin Goloveshko Signed-off-by: Anton Putria Signed-off-by: Marian Pritsak Signed-off-by: Mircea Dan Gheorghe Signed-off-by: Volodymyr Mytnyk Signed-off-by: Yuriy Harhas Signed-off-by: Anton Putria Signed-off-by: Ze Gan Co-authored-by: Chris Sommers Co-authored-by: Maksym Hedeon <106111454+maksymhedeon@users.noreply.github.com> Co-authored-by: Kostiantyn Goloveshko Co-authored-by: Maksym Hedeon Co-authored-by: Maksym Prytoliuk <71631949+maksym-prytoliuk-plv@users.noreply.github.com> Co-authored-by: Anton Putria Co-authored-by: Maksym Prytoliuk Co-authored-by: Anton Putria Co-authored-by: Sanjay Thyamagundalu Co-authored-by: Mukesh Moopath Velayudhan Co-authored-by: KrisNey-MSFT Co-authored-by: Marian Pritsak Co-authored-by: Ze Gan Co-authored-by: MirceaDan Co-authored-by: Volodymyr Mytnyk Co-authored-by: Anton Putria Co-authored-by: Yuriy Harhas Co-authored-by: Mohammad Hanif --- .../dash-saithrift-client-bldr-docker-acr.yml | 2 +- .wordlist.txt | 2 + ...Is_ for_SONiC_Hosts_Trademark_License.docx | Bin 0 -> 31659 bytes ...iC_API_Distribution_Trademark_License.docx | Bin 0 -> 58992 bytes dash-pipeline/SAI/templates/saiapi.cpp.j2 | 21 +- dash-pipeline/SAI/templates/utils.cpp.j2 | 7 +- .../saithrift/ptf/vnet/test_saithrift_vnet.py | 58 ++-- .../ptf/vnet/test_saithrift_vnet_v6.py | 285 ++++++++++++++++++ ...Is_for_SONiC_Hosts_Trademark_License .docx | Bin 0 -> 57996 bytes test/test-cases/README.md | 13 +- test/test-cases/scale/vnet2vnet/README.md | 11 +- .../scale/vnet2vnet/one-ip/README.md | 2 +- 12 files changed, 342 insertions(+), 59 deletions(-) create mode 100644 Disaggregated_APIs_ for_SONiC_Hosts_Trademark_License.docx create mode 100644 Enterprise_Disaggregated_APIs_for_SONiC_API_Distribution_Trademark_License.docx create mode 100755 dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet_v6.py create mode 100644 powered_by_Disaggregated_APIs_for_SONiC_Hosts_Trademark_License .docx diff --git a/.github/workflows/dash-saithrift-client-bldr-docker-acr.yml b/.github/workflows/dash-saithrift-client-bldr-docker-acr.yml index 00ce811fd..eac589a5c 100644 --- a/.github/workflows/dash-saithrift-client-bldr-docker-acr.yml +++ b/.github/workflows/dash-saithrift-client-bldr-docker-acr.yml @@ -53,4 +53,4 @@ jobs: - name: Build dash-saithrift-client-bldr image run: DOCKER_FLAGS=$docker_fg_flags make docker-saithrift-client-bldr - name: Publish dash-saithrift-client-bldr docker image - run: make docker-publish-saichallenger-client + run: make docker-publish-saithrift-client-bldr diff --git a/.wordlist.txt b/.wordlist.txt index 8963d3fc1..f080de187 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -258,6 +258,7 @@ io IP IPs ip +ips IPDK IPU IPUs @@ -426,6 +427,7 @@ reconvergence README READMEs README's +reconvergence RedirectRuleResimulatedUf redis renderer diff --git a/Disaggregated_APIs_ for_SONiC_Hosts_Trademark_License.docx b/Disaggregated_APIs_ for_SONiC_Hosts_Trademark_License.docx new file mode 100644 index 0000000000000000000000000000000000000000..4ef6df7ccaebfc3d1a772acf60b3e0bbe866d579 GIT binary patch literal 31659 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 literal 0 HcmV?d00001 diff --git a/Enterprise_Disaggregated_APIs_for_SONiC_API_Distribution_Trademark_License.docx b/Enterprise_Disaggregated_APIs_for_SONiC_API_Distribution_Trademark_License.docx new file mode 100644 index 0000000000000000000000000000000000000000..1a750fd3b8390cc981e5dba6d5ce016c3eab0608 GIT binary patch literal 58992 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 literal 0 HcmV?d00001 diff --git a/dash-pipeline/SAI/templates/saiapi.cpp.j2 b/dash-pipeline/SAI/templates/saiapi.cpp.j2 index 791ff1372..263c85a91 100644 --- a/dash-pipeline/SAI/templates/saiapi.cpp.j2 +++ b/dash-pipeline/SAI/templates/saiapi.cpp.j2 @@ -119,17 +119,20 @@ sai_status_t sai_create_{{ table.name }}( {% else %} // Search the action for (uint32_t i = 0; i < attr_count; i++) { - switch(attr_list[i].value.s32) { - {% for action in table.actions %} - case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: { - actionId = {{action.id}}; - expectedParams = {{ action.params|length }}; - break; + if (SAI_{{ table.name | upper }}_ATTR_ACTION == attr_list[i].id) + { + switch(attr_list[i].value.s32) { + {% for action in table.actions %} + case SAI_{{ table.name | upper }}_ACTION_{{ action.name | upper }}: { + actionId = {{action.id}}; + expectedParams = {{ action.params|length }}; + break; + } + {% endfor %} } - {% endfor %} + // only one action + break; } - // only one action - break; } {% endif %} action->set_action_id(actionId); diff --git a/dash-pipeline/SAI/templates/utils.cpp.j2 b/dash-pipeline/SAI/templates/utils.cpp.j2 index fe673a090..93b2c6188 100644 --- a/dash-pipeline/SAI/templates/utils.cpp.j2 +++ b/dash-pipeline/SAI/templates/utils.cpp.j2 @@ -152,8 +152,8 @@ grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type LOG("GRPC call Write::" << updateTypeStr(updateType) << " OK" << entry->ShortDebugString() << std::endl); } else { - LOG("GRPC ERROR["<< status.error_code() <<"]: " << status.error_message() << ", " << status.error_details()); - LOG("GRPC call Write::" << updateTypeStr(updateType) << " ERROR: " << std::endl << entry->ShortDebugString()); + LOG("GRPC ERROR["<< status.error_code() <<"]: " << status.error_message() << ", " << status.error_details() << std::endl); + LOG("GRPC call Write::" << updateTypeStr(updateType) << " ERROR: " << std::endl << entry->ShortDebugString() << std::endl); } //MILIND?? What is this? reference release? memory release? entity->release_table_entry(); @@ -163,13 +163,12 @@ grpc::StatusCode MutateTableEntry(p4::v1::TableEntry *entry, p4::v1::Update_Type bool InsertInTable(p4::v1::TableEntry *entry, sai_object_id_t *objId) { auto retCode = MutateTableEntry(entry, p4::v1::Update_Type_INSERT); if (grpc::StatusCode::OK != retCode) { - delete entry; return false; } tableLock.lock(); if (*objId == 0) { - *objId = nextId++; + *objId = NextObjIndex(); } tableEntryMap[*objId] = entry; tableLock.unlock(); diff --git a/dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet.py b/dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet.py index 296bb1547..89dc2c378 100644 --- a/dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet.py +++ b/dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet.py @@ -93,10 +93,9 @@ def setUp(self): dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, addr=sai_thrift_ip_addr_t(ip4=self.dst_ca_ip)) - # TODO: Enable ACL rule - #self.out_acl_rule_id = sai_thrift_create_dash_acl_rule(self.client, dash_acl_group_id=self.out_acl_group_id, - # dip=dip, priority=10, action=SAI_DASH_ACL_RULE_ACTION_PERMIT) - #assert(status == SAI_STATUS_SUCCESS) + + self.out_acl_rule_id = sai_thrift_create_dash_acl_rule(self.client, dash_acl_group_id=self.out_acl_group_id, priority=10, action=SAI_DASH_ACL_RULE_ACTION_PERMIT) + assert(status == SAI_STATUS_SUCCESS) ca_prefix = sai_thrift_ip_prefix_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, addr=sai_thrift_ip_addr_t(ip4="10.1.0.0"), @@ -214,7 +213,7 @@ def runTest(self): send_packet(self, 0, vxlan_pkt) print("\nVerifying packet...\n", self.pkt_exp.__repr__()) verify_packet(self, self.pkt_exp, 0) - print ("test_sai_thrift_outbound_udp_pkt_test OK") + print ("TestSaiThrift_outbound_udp_pkt OK") except AssertionError as ae: self.failure_teardown() raise ae @@ -225,8 +224,8 @@ def failure_teardown(self): status = sai_thrift_remove_outbound_ca_to_pa_entry(self.client, self.ocpe) if hasattr(self, "ore"): status = sai_thrift_remove_outbound_routing_entry(self.client, self.ore) - #if hasattr(self, "out_acl_rule_id"): - # sai_thrift_remove_dash_acl_rule(self.client, self.out_acl_rule_id) + if hasattr(self, "out_acl_rule_id"): + sai_thrift_remove_dash_acl_rule(self.client, self.out_acl_rule_id) if hasattr(self, "e2v"): sai_thrift_remove_outbound_eni_to_vni_entry(self.client, self.e2v) if hasattr(self, "eam"): @@ -249,34 +248,35 @@ def failure_teardown(self): def tearDown(self): # Delete in reverse order - if self.cleaned_up: - return - status = sai_thrift_remove_outbound_ca_to_pa_entry(self.client, self.ocpe) - assert(status == SAI_STATUS_SUCCESS) + if not self.cleaned_up: + status = sai_thrift_remove_outbound_ca_to_pa_entry(self.client, self.ocpe) + assert(status == SAI_STATUS_SUCCESS) - status = sai_thrift_remove_outbound_routing_entry(self.client, self.ore) - assert(status == SAI_STATUS_SUCCESS) + status = sai_thrift_remove_outbound_routing_entry(self.client, self.ore) + assert(status == SAI_STATUS_SUCCESS) - #status = sai_thrift_remove_dash_acl_rule(self.client, self.out_acl_rule_id) - #assert(status == SAI_STATUS_SUCCESS) + #status = sai_thrift_remove_dash_acl_rule(self.client, self.out_acl_rule_id) + #assert(status == SAI_STATUS_SUCCESS) - status = sai_thrift_remove_eni_ether_address_map_entry(self.client, self.eam) - assert(status == SAI_STATUS_SUCCESS) + status = sai_thrift_remove_eni_ether_address_map_entry(self.client, self.eam) + assert(status == SAI_STATUS_SUCCESS) - status = sai_thrift_remove_eni(self.client, self.eni) - assert(status == SAI_STATUS_SUCCESS) + status = sai_thrift_remove_eni(self.client, self.eni) + assert(status == SAI_STATUS_SUCCESS) - status = sai_thrift_remove_vnet(self.client, self.vnet) - assert(status == SAI_STATUS_SUCCESS) + status = sai_thrift_remove_vnet(self.client, self.vnet) + assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_dash_acl_group(self.client, self.out_acl_group_id) + assert(status == SAI_STATUS_SUCCESS) - status = sai_thrift_remove_dash_acl_group(self.client, self.out_acl_group_id) - assert(status == SAI_STATUS_SUCCESS) + status = sai_thrift_remove_dash_acl_group(self.client, self.in_acl_group_id) + assert(status == SAI_STATUS_SUCCESS) - status = sai_thrift_remove_dash_acl_group(self.client, self.in_acl_group_id) - assert(status == SAI_STATUS_SUCCESS) + status = sai_thrift_remove_direction_lookup_entry(self.client, self.dle) + assert(status == SAI_STATUS_SUCCESS) - status = sai_thrift_remove_direction_lookup_entry(self.client, self.dle) - assert(status == SAI_STATUS_SUCCESS) + sai_thrift_remove_vip_entry(self.client, self.vpe) + assert(status == SAI_STATUS_SUCCESS) - sai_thrift_remove_vip_entry(self.client, self.vpe) - assert(status == SAI_STATUS_SUCCESS) + super(self.__class__, self).tearDown() diff --git a/dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet_v6.py b/dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet_v6.py new file mode 100755 index 000000000..02e6cebc2 --- /dev/null +++ b/dash-pipeline/tests/saithrift/ptf/vnet/test_saithrift_vnet_v6.py @@ -0,0 +1,285 @@ +from sai_thrift.sai_headers import * +from sai_base_test import * +# TODO - when switch APIs implemented: +# class TestSaiThrift_outbound_udp_pkt(SaiHelper): + +class TestSaiThrift_outbound_udpv6_pkt(ThriftInterfaceDataPlane): + """ Test saithrift vnet outbound""" + def setUp(self): + super(TestSaiThrift_outbound_udpv6_pkt, self).setUp() + self.switch_id = 5 + self.outbound_vni = 60 + self.vnet_vni = 50 + self.eni_mac = "00:aa:aa:aa:aa:aa" + self.our_mac = "00:00:06:07:08:09" + self.dst_ca_mac = "00:bb:bb:bb:bb:bb" + self.vip = "172.16.1.200" + self.outbound_vni = 50 + self.dst_ca_ip = "2000:aaaa::232" + self.dst_pa_ip = "172.16.1.30" + self.src_vm_pa_ip = "172.16.1.2" + self.cleaned_up = False + + try: + vip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4=self.vip)) + self.vpe = sai_thrift_vip_entry_t(switch_id=self.switch_id, vip=vip) + + status = sai_thrift_create_vip_entry(self.client, self.vpe, + action=SAI_VIP_ENTRY_ACTION_ACCEPT) + assert(status == SAI_STATUS_SUCCESS) + + + self.dle = sai_thrift_direction_lookup_entry_t(switch_id=self.switch_id, vni=self.outbound_vni) + status = sai_thrift_create_direction_lookup_entry(self.client, self.dle, + action=SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION) + assert(status == SAI_STATUS_SUCCESS) + + self.in_acl_group_id = sai_thrift_create_dash_acl_group(self.client, + ip_addr_family=SAI_IP_ADDR_FAMILY_IPV6) + assert (self.in_acl_group_id != SAI_NULL_OBJECT_ID) + self.out_acl_group_id = sai_thrift_create_dash_acl_group(self.client, + ip_addr_family=SAI_IP_ADDR_FAMILY_IPV6) + assert (self.out_acl_group_id != SAI_NULL_OBJECT_ID) + + self.vnet = sai_thrift_create_vnet(self.client, vni=self.vnet_vni) + assert (self.vnet != SAI_NULL_OBJECT_ID) + + vm_underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4=self.src_vm_pa_ip)) + self.eni = sai_thrift_create_eni(self.client, cps=10000, + pps=100000, flows=100000, + admin_state=True, + vm_underlay_dip=vm_underlay_dip, + vm_vni=9, + vnet_id=self.vnet, + # TODO: Enable ACL rule + #inbound_v4_stage1_dash_acl_group_id = self.in_acl_group_id, + #inbound_v4_stage2_dash_acl_group_id = self.in_acl_group_id, + #inbound_v4_stage3_dash_acl_group_id = self.in_acl_group_id, + #inbound_v4_stage4_dash_acl_group_id = self.in_acl_group_id, + #inbound_v4_stage5_dash_acl_group_id = self.in_acl_group_id, + #outbound_v4_stage1_dash_acl_group_id = self.out_acl_group_id, + #outbound_v4_stage2_dash_acl_group_id = self.out_acl_group_id, + #outbound_v4_stage3_dash_acl_group_id = self.out_acl_group_id, + #outbound_v4_stage4_dash_acl_group_id = self.out_acl_group_id, + #outbound_v4_stage5_dash_acl_group_id = self.out_acl_group_id, + inbound_v4_stage1_dash_acl_group_id = 0, + inbound_v4_stage2_dash_acl_group_id = 0, + inbound_v4_stage3_dash_acl_group_id = 0, + inbound_v4_stage4_dash_acl_group_id = 0, + inbound_v4_stage5_dash_acl_group_id = 0, + outbound_v4_stage1_dash_acl_group_id = 0, + outbound_v4_stage2_dash_acl_group_id = 0, + outbound_v4_stage3_dash_acl_group_id = 0, + outbound_v4_stage4_dash_acl_group_id = 0, + outbound_v4_stage5_dash_acl_group_id = 0, + inbound_v6_stage1_dash_acl_group_id = 0, + inbound_v6_stage2_dash_acl_group_id = 0, + inbound_v6_stage3_dash_acl_group_id = 0, + inbound_v6_stage4_dash_acl_group_id = 0, + inbound_v6_stage5_dash_acl_group_id = 0, + outbound_v6_stage1_dash_acl_group_id = 0, + outbound_v6_stage2_dash_acl_group_id = 0, + outbound_v6_stage3_dash_acl_group_id = 0, + outbound_v6_stage4_dash_acl_group_id = 0, + outbound_v6_stage5_dash_acl_group_id = 0) + + self.eam = sai_thrift_eni_ether_address_map_entry_t(switch_id=self.switch_id, address = self.eni_mac) + status = sai_thrift_create_eni_ether_address_map_entry(self.client, + eni_ether_address_map_entry=self.eam, + eni_id=self.eni) + assert(status == SAI_STATUS_SUCCESS) + + dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6=self.dst_ca_ip)) + # TODO: Enable ACL rule + #self.out_acl_rule_id = sai_thrift_create_dash_acl_rule(self.client, dash_acl_group_id=self.out_acl_group_id, + # dip=dip, priority=10, action=SAI_DASH_ACL_RULE_ACTION_PERMIT) + #assert(status == SAI_STATUS_SUCCESS) + + ca_prefix = sai_thrift_ip_prefix_t(addr_family=SAI_IP_ADDR_FAMILY_IPV6, + addr=sai_thrift_ip_addr_t(ip6="2000:aaaa::"), + mask=sai_thrift_ip_addr_t(ip6="ffff:ffff:ffff:ffff:ffff:ffff:ffff:0")) + + self.ore = sai_thrift_outbound_routing_entry_t(switch_id=self.switch_id, eni_id=self.eni, destination=ca_prefix) + status = sai_thrift_create_outbound_routing_entry(self.client, self.ore, action=SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET, dst_vnet_id = self.vnet) + print ("status returned is ", status) + assert(status == SAI_STATUS_SUCCESS) + + underlay_dip = sai_thrift_ip_address_t(addr_family=SAI_IP_ADDR_FAMILY_IPV4, + addr=sai_thrift_ip_addr_t(ip4=self.dst_pa_ip)) + self.ocpe = sai_thrift_outbound_ca_to_pa_entry_t(switch_id=self.switch_id, dst_vnet_id=self.vnet, dip=dip) + status = sai_thrift_create_outbound_ca_to_pa_entry(self.client, self.ocpe, underlay_dip = underlay_dip, overlay_dmac=self.dst_ca_mac, use_dst_vnet_vni = True) + assert(status == SAI_STATUS_SUCCESS) + + except AssertionError as ae: + self.failure_teardown() + raise ae + + def runTest(self): + try: + src_vm_ip = "2000:aaaa::10a" + outer_smac = "00:00:03:06:06:06" + inner_smac = "00:00:02:06:06:06" + + # check VIP drop + wrong_vip = "172.16.100.100" + inner_pkt = simple_udpv6_packet(eth_dst="02:02:02:02:02:02", + eth_src=self.eni_mac, + ipv6_dst=self.dst_ca_ip, + ipv6_src=src_vm_ip) + vxlan_pkt = simple_vxlan_packet(eth_dst=self.our_mac, + eth_src=outer_smac, + ip_dst=wrong_vip, + ip_src=self.src_vm_pa_ip, + udp_sport=11638, + with_udp_chksum=False, + vxlan_vni=self.outbound_vni, + inner_frame=inner_pkt) + print("\n\nSending packet with wrong vip...\n\n", vxlan_pkt.__repr__()) + send_packet(self, 0, vxlan_pkt) + print("\nVerifying drop...") + verify_no_other_packets(self) + + # check routing drop + wrong_dst_ca = "2000:bbbb::232" + inner_pkt = simple_udpv6_packet(eth_dst="02:02:02:02:02:02", + eth_src=self.eni_mac, + ipv6_dst=wrong_dst_ca, + ipv6_src=src_vm_ip) + vxlan_pkt = simple_vxlan_packet(eth_dst=self.our_mac, + eth_src=outer_smac, + ip_dst=self.vip, + ip_src=self.src_vm_pa_ip, + udp_sport=11638, + with_udp_chksum=False, + vxlan_vni=self.outbound_vni, + inner_frame=inner_pkt) + print("\nSending packet with wrong dst CA IP to verify routing drop...\n\n", vxlan_pkt.__repr__()) + send_packet(self, 0, vxlan_pkt) + print("\nVerifying drop...") + verify_no_other_packets(self) + + # check mapping drop + wrong_dst_ca = "2000:aaaa::d3d3" + inner_pkt = simple_udpv6_packet(eth_dst="02:02:02:02:02:02", + eth_src=self.eni_mac, + ipv6_dst=wrong_dst_ca, + ipv6_src=src_vm_ip) + vxlan_pkt = simple_vxlan_packet(eth_dst=self.our_mac, + eth_src=outer_smac, + ip_dst=self.vip, + ip_src=self.src_vm_pa_ip, + udp_sport=11638, + with_udp_chksum=False, + vxlan_vni=self.outbound_vni, + inner_frame=inner_pkt) + print("\nSending packet with wrong dst CA IP to verify mapping drop...\n\n", vxlan_pkt.__repr__()) + send_packet(self, 0, vxlan_pkt) + print("\nVerifying drop...") + verify_no_other_packets(self) + + # check forwarding + inner_pkt = simple_udpv6_packet(eth_dst="02:02:02:02:02:02", + eth_src=self.eni_mac, + ipv6_dst=self.dst_ca_ip, + ipv6_src=src_vm_ip) + vxlan_pkt = simple_vxlan_packet(eth_dst=self.our_mac, + eth_src=outer_smac, + ip_dst=self.vip, + ip_src=self.src_vm_pa_ip, + udp_sport=11638, + with_udp_chksum=False, + vxlan_vni=self.outbound_vni, + inner_frame=inner_pkt) + + inner_exp_pkt = simple_udpv6_packet(eth_dst=self.dst_ca_mac, + eth_src=self.eni_mac, + ipv6_dst=self.dst_ca_ip, + ipv6_src=src_vm_ip) + vxlan_exp_pkt = simple_vxlan_packet(eth_dst="00:00:00:00:00:00", + eth_src="00:00:00:00:00:00", + ip_dst=self.dst_pa_ip, + ip_src=self.vip, + udp_sport=0, # TODO: Fix sport in pipeline + with_udp_chksum=False, + vxlan_vni=self.vnet_vni, + inner_frame=inner_exp_pkt) + # TODO: Fix IP chksum + vxlan_exp_pkt[IP].chksum = 0 + # TODO: Fix UDP length + vxlan_exp_pkt[IP][UDP][VXLAN].flags = 0 + + self.pkt_exp = vxlan_exp_pkt + print("\nSending outbound packet...\n\n", vxlan_pkt.__repr__()) + send_packet(self, 0, vxlan_pkt) + print("\nVerifying packet...\n", self.pkt_exp.__repr__()) + verify_packet(self, self.pkt_exp, 0) + print ("TestSaiThrift_outbound_udpv6_pkt OK") + except AssertionError as ae: + self.failure_teardown() + raise ae + + def failure_teardown(self): + # Delete entries which might be lingering from previous failures etc.; ignore failures here + if hasattr(self, "ocpe"): + status = sai_thrift_remove_outbound_ca_to_pa_entry(self.client, self.ocpe) + if hasattr(self, "ore"): + status = sai_thrift_remove_outbound_routing_entry(self.client, self.ore) + #if hasattr(self, "out_acl_rule_id"): + # sai_thrift_remove_dash_acl_rule(self.client, self.out_acl_rule_id) + if hasattr(self, "e2v"): + sai_thrift_remove_outbound_eni_to_vni_entry(self.client, self.e2v) + if hasattr(self, "eam"): + sai_thrift_remove_eni_ether_address_map_entry(self.client, self.eam) + if hasattr(self, "eni"): + sai_thrift_remove_eni(self.client, self.eni) + if hasattr(self, "vnet"): + sai_thrift_remove_vnet(self.client, self.vnet) + assert(status == SAI_STATUS_SUCCESS) + if hasattr(self, "out_acl_group_id") and self.out_acl_group_id != SAI_NULL_OBJECT_ID: + sai_thrift_remove_dash_acl_group(self.client, self.out_acl_group_id) + if hasattr(self, "in_acl_group_id") and self.in_acl_group_id != SAI_NULL_OBJECT_ID: + sai_thrift_remove_dash_acl_group(self.client, self.in_acl_group_id) + if hasattr(self, "dle"): + sai_thrift_remove_direction_lookup_entry(self.client, self.dle) + if hasattr(self, "vpe"): + sai_thrift_remove_vip_entry(self.client, self.vpe) + self.cleaned_up = True + + def tearDown(self): + + # Delete in reverse order + if not self.cleaned_up: + status = sai_thrift_remove_outbound_ca_to_pa_entry(self.client, self.ocpe) + assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_outbound_routing_entry(self.client, self.ore) + assert(status == SAI_STATUS_SUCCESS) + + #status = sai_thrift_remove_dash_acl_rule(self.client, self.out_acl_rule_id) + #assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_eni_ether_address_map_entry(self.client, self.eam) + assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_eni(self.client, self.eni) + assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_vnet(self.client, self.vnet) + assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_dash_acl_group(self.client, self.out_acl_group_id) + assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_dash_acl_group(self.client, self.in_acl_group_id) + assert(status == SAI_STATUS_SUCCESS) + + status = sai_thrift_remove_direction_lookup_entry(self.client, self.dle) + assert(status == SAI_STATUS_SUCCESS) + + sai_thrift_remove_vip_entry(self.client, self.vpe) + assert(status == SAI_STATUS_SUCCESS) + + super(self.__class__, self).tearDown() diff --git a/powered_by_Disaggregated_APIs_for_SONiC_Hosts_Trademark_License .docx b/powered_by_Disaggregated_APIs_for_SONiC_Hosts_Trademark_License .docx new file mode 100644 index 0000000000000000000000000000000000000000..582d711e4b809554ffeb53c6157d71c2c679ca6e GIT binary patch literal 57996 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 S$_^|SMHs|@tE3X{f_MO(e5(im literal 0 HcmV?d00001 diff --git a/test/test-cases/README.md b/test/test-cases/README.md index be8fc23f5..6af69aed1 100644 --- a/test/test-cases/README.md +++ b/test/test-cases/README.md @@ -5,18 +5,11 @@ This contains a hierarchical set of directories containing DASH test cases organ | Folder | Description | | --- | --- | -| functional | Tests to verify essential functionality using low-rate traffic (SAI PTF). -| scale | Tests with high-rate traffic and complex configuration to verify scaling real-world scenarios. +| [functional](./functional/) | Tests to verify essential functionality using low-rate traffic (SAI PTF). +| [scale](./scale/) | Tests with high-rate traffic and complex configuration to verify scaling real-world scenarios. ## functional | Folder/File | Description | | --- | --- | -| `saidashvnet.py` | VNET-to-VNET test cases - - -## scale - -| Folder/File | Description | -| --- | --- | -| [vnet2vnet](vnet2vnet/README.md) | DASH vnet2vnet Tests +| [`saidashvnet.py`](./functional/saidashvnet.py) | VNET-to-VNET test cases diff --git a/test/test-cases/scale/vnet2vnet/README.md b/test/test-cases/scale/vnet2vnet/README.md index 5f44d6823..89896c1ef 100644 --- a/test/test-cases/scale/vnet2vnet/README.md +++ b/test/test-cases/scale/vnet2vnet/README.md @@ -11,8 +11,8 @@ The files found within this directory serve the following purpose: | Test case | Description | | ---------------------------------------------- | --------------------------------------------------------- | -| [vxlan_1eni_1ip](one-ip) | minimum possible config | -| [vxlan_8eni_48k_IPs](48k-IPs) | medium sized config | +| [vxlan_1eni_1ip](one-ip) | minimum possible config | +| [vxlan_8eni_48k_IPs](48K-ips) | medium sized config | @@ -95,6 +95,7 @@ The files found within this directory serve the following purpose: # test cases -| Test case | Description | -| ---------------------------------------------- | --------------------------------------------------------- | -| [vxlan_1vpc_1ip](README.vxlan_1vpc_1ip.md) | performance numbers for best case scenario | +| Test case | Description | +| ---------------------------------------------- | -------------------------------------------------------------- | +| [vxlan_1vpc_1ip](one-ip/README.md) | performance numbers for best case scenario | +| [vxlan_8vpc_48K-ips](48K-ips/README.md) | performance with an objective of maintaining 6M parallel flows | diff --git a/test/test-cases/scale/vnet2vnet/one-ip/README.md b/test/test-cases/scale/vnet2vnet/one-ip/README.md index 66fe29194..6a6170bb0 100644 --- a/test/test-cases/scale/vnet2vnet/one-ip/README.md +++ b/test/test-cases/scale/vnet2vnet/one-ip/README.md @@ -1,7 +1,7 @@ The purpose of this test case is to obtain the best performance numbers the hardware can achieve Combined with the worst case scenario cases (TBD) we will be able to determine the range of performance within the hardware can operate. -![vxlan_1vpc_1ip](../../../images/test_vxlan_1vpc_1ip.svg) +![vxlan_1vpc_1ip](../../../../images/test_vxlan_1vpc_1ip.svg) 1. Configure VXLAN with 1 VPC and 1 VNI. 2. Configure BGP to achieve connectivity between the loopback interfaces.