From db60940d225e44ce5f22704e062dd287bc208708 Mon Sep 17 00:00:00 2001 From: "shine.chen" Date: Thu, 11 Jul 2019 20:24:29 -0700 Subject: [PATCH 1/7] add mclag ansible test case picture Signed-off-by: shine.chen --- images/mclag_hld/mclag-logical-topo.png | Bin 0 -> 82319 bytes .../mclag_hld/testbed-server-physical-topo.png | Bin 0 -> 40324 bytes images/mclag_hld/testbed-t0-mclag-topo.png | Bin 0 -> 20570 bytes images/mclag_hld/testbed-t0-topo.png | Bin 0 -> 21043 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/mclag_hld/mclag-logical-topo.png create mode 100644 images/mclag_hld/testbed-server-physical-topo.png create mode 100644 images/mclag_hld/testbed-t0-mclag-topo.png create mode 100644 images/mclag_hld/testbed-t0-topo.png diff --git a/images/mclag_hld/mclag-logical-topo.png b/images/mclag_hld/mclag-logical-topo.png new file mode 100644 index 0000000000000000000000000000000000000000..6318fbf99f1c2d96fd407eb0e0b1bafaa9d109e7 GIT binary patch literal 82319 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 R^*`XBvZ97Uk(_z(e*v@#2TcF~ literal 0 HcmV?d00001 diff --git a/images/mclag_hld/testbed-server-physical-topo.png b/images/mclag_hld/testbed-server-physical-topo.png new file mode 100644 index 0000000000000000000000000000000000000000..15d050e9f5b970726e617d2781bb8fc95a3a270b GIT binary patch literal 40324 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 Zdvh}41ml{Lqv&pq9M(FNbMVx~{{yj7UAq7P literal 0 HcmV?d00001 diff --git a/images/mclag_hld/testbed-t0-mclag-topo.png b/images/mclag_hld/testbed-t0-mclag-topo.png new file mode 100644 index 0000000000000000000000000000000000000000..479513e64a4b57420b633b81d85e5026daa15d8a GIT binary patch literal 20570 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 literal 0 HcmV?d00001 diff --git a/images/mclag_hld/testbed-t0-topo.png b/images/mclag_hld/testbed-t0-topo.png new file mode 100644 index 0000000000000000000000000000000000000000..81ebda355027d1b3566d87c31d357b3afbf25103 GIT binary patch literal 21043 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 literal 0 HcmV?d00001 From 2c192e5210c3e045276e18f333e25cad7abd1b51 Mon Sep 17 00:00:00 2001 From: "shine.chen" Date: Thu, 11 Jul 2019 20:31:19 -0700 Subject: [PATCH 2/7] add mclag ansible test case doc Signed-off-by: shine.chen --- doc/mclag_hld/MCLAG-ansible-test-plan.md | 720 +++++++++++++++++++++++ 1 file changed, 720 insertions(+) create mode 100644 doc/mclag_hld/MCLAG-ansible-test-plan.md diff --git a/doc/mclag_hld/MCLAG-ansible-test-plan.md b/doc/mclag_hld/MCLAG-ansible-test-plan.md new file mode 100644 index 0000000000..338cf89115 --- /dev/null +++ b/doc/mclag_hld/MCLAG-ansible-test-plan.md @@ -0,0 +1,720 @@ +# MCLAG feature test plan + +- [overview](#overview) + - [Scope](#Scope) + - [Testbed](#Testbed) + - [Topology](#Topology) + - [Physical topology](#Physical-topology) + - [Logical topologies](#Logical-topologies) + - [mclag logical topology](#mclag-logical-topology) + - [Application scenarios](#Application-scenarios) + - [L2 scenario](#L2-scenario) + - [L3 scenario](#L3-scenario) + - [VXLAN scenario](#VXLAN-scenario) +- [Setup configuration](#Setup-configuration) + - [Setup of DUT switch](#Setup-of-DUT-switch) + - [Ansible scripts to setup and run test](#Ansible-scripts-to-setup-and-run-test) + - [Command to deploy the topo t0-mclag](#Command-to-deploy-the-topo-t0-mclag) + - [Deploy the initial configuration for both devices separately (with an extra parameter dut_no)](#Deploy-the-initial-configuration-for-both-devices-separately-with-an-extra-parameter-dutno) + - [mclag_config_dut2.yml](#mclagconfigdut2yml) + - [mclag.yml](#mclagyml) +- [PTF Test](#PTF-Test) + - [Input files for PTF test](#Input-files-for-PTF-test) + - [Traffic validation in PTF](#Traffic-validation-in-PTF) +- [Test cases](#Test-cases) + - [Summary](#Summary) + - [L2 scenario test cases](#L2-scenario-test-cases) + - [Test case L2#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-L21---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) + - [Test case L2#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L22---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) + - [Test case L2#3 - Verify data forwarding is correct when peer-link status change](#Test-case-L23---Verify-data-forwarding-is-correct-when-peer-link-status-change) + - [Test case L2#4 - Verify data forwarding is correct when keepalive link status change](#Test-case-L24---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) + - [Test case L2#5 - Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-L25---Verify-data-forwarding-is-correct-when-peer-link-and-keepalive-link-status-both-change) + - [Test case L2#6 - Verify data forwarding is correct when active device of mclag status change](#Test-case-L26---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) + - [Test case L2#7 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-L27---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) + - [Test case L2#8 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L28---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) + - [Test case L2#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L29---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) + - [L3 scenario test cases](#L3-scenario-test-cases) + - [Test case L3#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-L31---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) + - [Test case L3#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L32---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) + - [Test case L3#3 - Verify data forwarding is correct when keepalive link status change](#Test-case-L33---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) + - [Test case L3#4 - Verify data forwarding is correct when active device of mclag status change](#Test-case-L34---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) + - [Test case L3#5 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-L35---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) + - [Test case L3#6 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L36---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) + - [Test case L3#7 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L37---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) + - [VXLAN scenario test cases](#VXLAN-scenario-test-cases) + - [Test case VXLAN#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-VXLAN1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) + - [Test case VXLAN#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-VXLAN2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) + - [Test case VXLAN#3 - Verify data forwarding is correct when peer-link status change](#Test-case-VXLAN3---Verify-data-forwarding-is-correct-when-peer-link-status-change) + - [Test case VXLAN#4 - Verify data forwarding is correct when keepalive link status change](#Test-case-VXLAN4---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) + - [Test case VXLAN#5 - Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-VXLAN5---Verify-data-forwarding-is-correct-when-peer-link-and-keepalive-link-status-both-change) + - [Test case VXLAN#6 - Verify data forwarding is correct when active device of mclag status change](#Test-case-VXLAN6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) + - [Test case VXLAN#7 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-VXLAN7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) + - [Test case VXLAN#8 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-VXLAN8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) + - [Test case VXLAN#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) +- [TODO](#TODO) + +## overview + +The purpose is to test functionality of MCLAG on the SONIC switch DUT, closely resembling production environment. + +### Scope + +The test is running on real SONIC switch with testbed's basic configuration. The purpose of the test isn't targeting to specific class or API which are coverd by vs test cases, but functional test of MCLAG on SONIC system. + +### Testbed + +The test will run on the following testbed (docker ptf must support teamd): + +- t0-mclag + +### Topology + +#### Physical topology + +MCLAG test must use two DUTs, you can connect those two DUTs to two different leaf fanout switches, or connect those two DUTs to the same leaf fanout switch. The part in the red box needs to be added on the original SONiC test topology. + +SONiC testbed overview can be found at [here](https://github.com/Azure/sonic-mgmt/blob/master/ansible/doc/README.testbed.Overview.md) + +![testbed server Physical topo](https://github.com/shine4chen/SONiC/blob/mclag-test-case/images/mclag_hld/testbed-server-physical-topo.png) + +#### Logical topologies + +Testbeds t0-mclag is modified based on the Testbeds t0. + +![testbed t0 topo](https://github.com/shine4chen/SONiC/blob/mclag-test-case/images/mclag_hld/testbed-t0-topo.png) + +![testbed t0 mclag topo](https://github.com/shine4chen/SONiC/blob/mclag-test-case/images/mclag_hld/testbed-t0-mclag-topo.png) + +#### mclag logical topology + +![mclag logical topo](https://github.com/shine4chen/SONiC/blob/mclag-test-case/images/mclag_hld/mclag-logical-topo.png) + +### Application scenarios + +#### L2 scenario + +All links to server ports are L2 mode, and peer-link must allow all vlans to be used. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. + +#### L3 scenario + +All links to server ports are L3 mode, the peer-link is optional. DUT is the gateway of the servers. DUT binds MCLAG's interface ip address must be the same except peer-link. + +#### VXLAN scenario + +All links to server ports are L2 mode. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. + +## Setup configuration + +### Setup of DUT switch + +Setup of SONIC DUT will be done by Ansible script. During setup Ansible will copy JSON file containing configuration for mclag to the DUT. Config utility will be used to push configuration to the SONiC DB. + +**Template** + +```jason +"MC_LAG": { + "": { + "local_ip": "", + "peer_ip": "", + "peer_link": "peer_link_name", + "mclag_interface": "PortChanne_id" + } +} +``` + +**Attributes** + +```jason +"" = Description: mclag domain id + Attr status: mandatory + Value range: 1-65535 +"local_ip" = Description: local ip address for mclag + Attr status: mandatory + Value range: A valid IPv4 address +"peer_ip" = Description: peer ip address for mclag + Attr status: mandatory + Value range: A valid IPv4 address +"peer_link" = Description: peer link Ethernet name or PortChannel name + Attr status: mandatory(For L3 scenario, this is optional) + Value range: Ethernet, PortChannel or Tunnel name +"mclag_interface" = Description: PortChannel name which bind mclag + Attr status: mandatory + Value range: PortChannel name +``` + +**Example** + +```jason +"MC_LAG": { + "100": { + "local_ip": "10.100.1.1", + "peer_ip": "10.100.1.2", + "peer_link": "PortChannel0100", + "mclag_interface": "PortChannel0001, PortChannel0002, PortChannel0003, PortChannel0004, PortChannel0005, PortChannel0006, PortChannel0007, PortChannel0008, PortChannel0009, PortChannel0010, PortChannel0011, PortChannel0012, PortChannel0013, PortChannel0014, PortChannel0015, PortChannel0016, PortChannel0017, PortChannel0018, PortChannel0019, PortChannel0020, PortChannel0021, PortChannel0022, PortChannel0023, PortChannel0024" + } +} +``` + +### Ansible scripts to setup and run test + +#### Command to deploy the topo t0-mclag + +- ./testbed-cli.sh add-topo vms-t0-mclag ~/.password + +#### Deploy the initial configuration for both devices separately (with an extra parameter dut_no) + +- ansible-playbook -i lab config_sonic_basedon_testbed.yml -l "dut1_name" -e vm_base="VM0300" -e topo=t0-mclag -e deploy=True -e save=True -e testbed_name=vms-t0-mclag -e dut_no=1 +- ansible-playbook -i lab config_sonic_basedon_testbed.yml -l "dut2_name" -e vm_base="VM0300" -e topo=t0-mclag -e deploy=True -e save=True -e testbed_name=vms-t0-mclag-dut2 -e dut_no=2 + +#### mclag_config_dut2.yml + +mclag_config_dut2.yml when run with testname “mclag_config_dut2” will do the following: + +- Generate mclag configuration on DUT2. +- Generate some port info of DUT2 + +#### mclag.yml + +mclag.yml when run with testname “mclag” will do the following: + +- Generate and apply mclag configuration on two DUTs. +- Run test. +- Clean up dynamic and temporary mclag configuration. + +## PTF Test + +### Input files for PTF test + +PTF test will generate traffic between ports and make sure it passes according to the mclag configuration. Depending on the testbed topology and the existing configuration (e.g. ECMP, LAGS, etc) packets may arrive to different ports. Therefore ports connection information will be generated from the minigraph and supplied to the PTF script. + +### Traffic validation in PTF + +Depending on the test PTF test will verify the packet arrived or dropped. + +## Test cases + +### Summary + +| NO. | Test case info | +| -: | - | - | +[L2 scenario test cases](#L2-scenario-test-cases) | +| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L2#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | +| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L2#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | +| 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-L2#3---Verify-data-forwarding-is-correct-when-peer-link-status-change) | +| 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L2#4---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | +| 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-L2#5---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | +| 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L2#6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | +| 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L2#7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | +| 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L2#8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | +| 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L2#9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +[L3 scenario test cases](#L3-scenario-test-cases) | +| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L3#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | +| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L3#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | +| 3 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L3#3---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) | +| 4 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L3#4---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | +| 5 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L3#5---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | +| 6 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L3#6---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | +| 7 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L3#7---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +[VXLAN scenario test cases](#VXLAN-scenario-test-cases) | +| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-VXLAN#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | +| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-VXLAN#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | +| 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-VXLAN#3---Verify-data-forwarding-is-correct-when-peer-link-status-change) | +| 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-VXLAN#4---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | +| 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-VXLAN#5---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | +| 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-VXLAN#6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | +| 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-VXLAN#7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | +| 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-VXLAN#8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | +| 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN#9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | + +### L2 scenario test cases + +**SetUp: Load mclag L2 configuration files to dut and load it** + +#### Test case L2#1 - mclag info check and verify data forwarding is correct through mclag + +**Test objective** + +Verify that mclag info is correct when mclag build ok. + +Verify data forwarding is correct through mclag when mclag build ok. + +**Test steps** + +1. Verify ping succeed between mclag peers. +2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +3. Verify standby device changes its LACP system ID to be the same as active device. +4. Servers(including orphan ports) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reach to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +6. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#2 - Verify data forwarding is correct when mclag enabled interface status change + +**Test objective** + +Verify data forwarding is correct when mclag enabled interface status change. + +**Test steps** + +1. mclag enabled interface status change to down. +2. Servers(exclude down ports) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. "show mac" command verify the macs learned on down port before will point to the peer-link. +4. "show arp" command verify the arps learned on down port before will point to the peer-link. +5. mclag enabled interface status recover to up. +6. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +7. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +8. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#3 - Verify data forwarding is correct when peer-link status change + +**Test objective** + +Verify data forwarding is correct when peer-link status change. + +**Test steps** + +1. Peer-link status change to down. +2. "mclagdctl -i \ dump state" command verify mclag keepalive is still ok. +3. Servers(exclude orphan ports) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. +6. Peer-link status recover to up. +7. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +8. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +9. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#4 - Verify data forwarding is correct when keepalive link status change + +**Test objective** + +Verify data forwarding is correct when keepalive link status change. + +**Test steps** + +1. Keepalive link status change to down. +2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. +3. Verify standby device changes its LACP system ID to the local default +4. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. +6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. +7. Keepalive link status recover to up. +8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. +9. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#5 - Verify data forwarding is correct when peer-link and keepalive link status both change + +**Test objective** + +Verify data forwarding is correct when peer-link and keepalive link status both change. + +**Test steps** + +1. Peer-link and keepalive link status change to down. +2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. +3. Verify standby device changes its LACP system ID to the local default +4. Servers(exclude orphan ports and those ports link to standby device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. +6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. +7. Peer-link and keepalive link status recover to up. +8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. +9. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#6 - Verify data forwarding is correct when active device of mclag status change + +**Test objective** + +Verify data forwarding is correct when active device of mclag status change. + +**Test steps** + +1. Active device of mclag status change to down. +2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. +3. Servers(exclude ports which link to active device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. +5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. +6. Active device of mclag status recover to up. +7. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to ok. +8. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#7 - Verify data forwarding is correct when standby device of mclag status change + +**Test objective** + +Verify data forwarding is correct when standby device of mclag status change. + +**Test steps** + +1. Standby device of mclag status change to down. +2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. +3. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. +5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. +6. Standby device of mclag status recover to up. +7. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to ok. +8. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#8 - Verify data forwarding is correct when active devices of mclag warm-reboot + +**Test objective** + +Verify data forwarding is correct when active devices of mclag warm-reboot. + +**Test steps** + +1. Active device of mclag warm-reboot. +2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. +3. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L2#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot + +**Test objective** + +Verify data forwarding is correct when standby devices of mclag warm-reboot. + +**Test steps** + +1. Standby device of mclag warm-reboot. +2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. +3. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +**TearDown: Set default configuration** + +### L3 scenario test cases + +**SetUp: Load mclag L3 configuration files to dut and load it** + +#### Test case L3#1 - mclag info check and verify data forwarding is correct through mclag + +**Test objective** + +Verify that mclag info is correct when mclag build ok. + +Verify data forwarding is correct through mclag when mclag build ok. + +**Test steps** + +1. Verify ping succeed between mclag peers. +2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +3. Verify standby device changes its LACP system ID to be the same as active device. +4. Servers(including orphan ports) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reach to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device(Services on orphan ports forwarding support by routing protocol or static route). + +**Expected test result: Pass** + +#### Test case L3#2 - Verify data forwarding is correct when mclag enabled interface status change + +**Test objective** + +Verify data forwarding is correct when mclag enabled interface status change. + +**Test steps** + +1. mclag enabled interface status change to down. +2. Servers(exclude down ports) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. mclag enabled interface status recover to up. +4. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. + +**Expected test result: Pass** + +#### Test case L3#3 - Verify data forwarding is correct when keepalive link status change + +**Test objective** + +Verify data forwarding is correct when keepalive link status change. + +**Test steps** + +1. Keepalive link status change to down. +2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. +3. Verify standby device changes its LACP system ID to the local default +4. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. Keepalive link status recover to up. +6. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. +7. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. + +**Expected test result: Pass** + +#### Test case L3#4 - Verify data forwarding is correct when active device of mclag status change + +**Test objective** + +Verify data forwarding is correct when active device of mclag status change. + +**Test steps** + +1. Active device of mclag status change to down. +2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. +3. Servers(exclude ports which link to active device of mclag) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Active device of mclag status recover to up. +5. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to ok. +6. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. + +**Expected test result: Pass** + +#### Test case L3#5 - Verify data forwarding is correct when standby device of mclag status change + +**Test objective** + +Verify data forwarding is correct when standby device of mclag status change. + +**Test steps** + +1. Standby device of mclag status change to down. +2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. +3. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Standby device of mclag status recover to up. +5. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to ok. +6. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. + +**Expected test result: Pass** + +#### Test case L3#6 - Verify data forwarding is correct when active devices of mclag warm-reboot + +**Test objective** + +Verify data forwarding is correct when active devices of mclag warm-reboot. + +**Test steps** + +1. Active device of mclag warm-reboot. +2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. +3. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case L3#7 - Verify data forwarding is correct when standby devices of mclag warm-reboot + +**Test objective** + +Verify data forwarding is correct when standby devices of mclag warm-reboot. + +**Test steps** + +1. Standby device of mclag warm-reboot. +2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. +3. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +**TearDown: Set default configuration** + +### VXLAN scenario test cases + +**SetUp: Load mclag VXLAN configuration files to dut and load it** + +#### Test case VXLAN#1 - mclag info check and verify data forwarding is correct through mclag + +**Test objective** + +Verify that mclag info is correct when mclag build ok. + +Verify data forwarding is correct through mclag when mclag build ok. + +**Test steps** + +1. Verify ping succeed between mclag peers. +2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +3. Verify standby device changes its LACP system ID to be the same as active device. +4. Servers(including orphan ports) will send packets to others Servers. When packet reach to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +6. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case VXLAN#2 - Verify data forwarding is correct when mclag enabled interface status change + +**Test objective** + +Verify data forwarding is correct when mclag enabled interface status change. + +**Test steps** + +1. mclag enabled interface status change to down. +2. Servers(exclude down ports) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. "show mac" command verify the macs learned on down port before will point to the peer-link. +4. "show arp" command verify the arps learned on down port before will point to the peer-link. +5. mclag enabled interface status recover to up. +6. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +7. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +8. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case VXLAN#3 - Verify data forwarding is correct when peer-link status change + +**Test objective** + +Verify data forwarding is correct when peer-link status change. + +**Test steps** + +1. Peer-link status change to down. +2. "mclagdctl -i \ dump state" command verify mclag keepalive is still ok. +3. Servers will send packets to others Servers(exclude orphan ports). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. +6. Peer-link status recover to up. +7. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +8. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +9. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Failed** + +#### Test case VXLAN#4 - Verify data forwarding is correct when keepalive link status change + +**Test objective** + +Verify data forwarding is correct when keepalive link status change. + +**Test steps** + +1. Keepalive link status change to down. +2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. +3. Verify standby device changes its LACP system ID to the local default +4. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. +6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. +7. Keepalive link status recover to up. +8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. +9. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case VXLAN#5 - Verify data forwarding is correct when peer-link and keepalive link status both change + +**Test objective** + +Verify data forwarding is correct when peer-link and keepalive link status both change. + +**Test steps** + +1. Peer-link and keepalive link status change to down. +2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. +3. Verify standby device changes its LACP system ID to the local default +4. Servers(exclude orphan ports and those ports link to standby device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. +6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. +7. Peer-link and keepalive link status recover to up. +8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. +9. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Failed** + +#### Test case VXLAN#6 - Verify data forwarding is correct when active device of mclag status change + +**Test objective** + +Verify data forwarding is correct when active device of mclag status change. + +**Test steps** + +1. Active device of mclag status change to down. +2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. +3. Servers(exclude ports which link to active device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. +5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. +6. Active device of mclag status recover to up. +7. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to ok. +8. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case VXLAN#7 - Verify data forwarding is correct when standby device of mclag status change + +**Test objective** + +Verify data forwarding is correct when standby device of mclag status change. + +**Test steps** + +1. Standby device of mclag status change to down. +2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. +3. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. +5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. +6. Standby device of mclag status recover to up. +7. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to ok. +8. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case VXLAN#8 - Verify data forwarding is correct when active devices of mclag warm-reboot + +**Test objective** + +Verify data forwarding is correct when active devices of mclag warm-reboot. + +**Test steps** + +1. Active device of mclag warm-reboot. +2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. +3. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +#### Test case VXLAN#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot + +**Test objective** + +Verify data forwarding is correct when standby devices of mclag warm-reboot. + +**Test steps** + +1. Standby device of mclag warm-reboot. +2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. +3. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +**Expected test result: Pass** + +**TearDown: Set default configuration** + +## TODO + +Peer-link cannot be closed in the VXLAN scenario, and the following two testcases will fail. +- Test case VXLAN#3 - Verify data forwarding is correct when peer-link status change +- Test case VXLAN#5 - Verify data forwarding is correct when peer-link and keepalive link status both change From 9ac19cad1c2aa589e80e4539ffecf42d12010341 Mon Sep 17 00:00:00 2001 From: William-zx <47626856+William-zx@users.noreply.github.com> Date: Fri, 12 Jul 2019 12:43:20 +0800 Subject: [PATCH 3/7] Update MCLAG-ansible-test-plan.md Revise the title --- doc/mclag_hld/MCLAG-ansible-test-plan.md | 191 +++++++++++++---------- 1 file changed, 110 insertions(+), 81 deletions(-) diff --git a/doc/mclag_hld/MCLAG-ansible-test-plan.md b/doc/mclag_hld/MCLAG-ansible-test-plan.md index 338cf89115..48f97b8d6a 100644 --- a/doc/mclag_hld/MCLAG-ansible-test-plan.md +++ b/doc/mclag_hld/MCLAG-ansible-test-plan.md @@ -63,7 +63,7 @@ The test is running on real SONIC switch with testbed's basic configuration. The ### Testbed -The test will run on the following testbed (docker ptf must support teamd): +The test will run on the following testbed (**docker ptf must support teamd**): - t0-mclag @@ -161,7 +161,7 @@ Setup of SONIC DUT will be done by Ansible script. During setup Ansible will cop - ./testbed-cli.sh add-topo vms-t0-mclag ~/.password -#### Deploy the initial configuration for both devices separately (with an extra parameter dut_no) +#### Deploy the initial configuration for both devices separately (**with an extra parameter dut_no**) - ansible-playbook -i lab config_sonic_basedon_testbed.yml -l "dut1_name" -e vm_base="VM0300" -e topo=t0-mclag -e deploy=True -e save=True -e testbed_name=vms-t0-mclag -e dut_no=1 - ansible-playbook -i lab config_sonic_basedon_testbed.yml -l "dut2_name" -e vm_base="VM0300" -e topo=t0-mclag -e deploy=True -e save=True -e testbed_name=vms-t0-mclag-dut2 -e dut_no=2 @@ -196,49 +196,78 @@ Depending on the test PTF test will verify the packet arrived or dropped. ### Summary | NO. | Test case info | + | -: | - | - | + [L2 scenario test cases](#L2-scenario-test-cases) | + | 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L2#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | + | 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L2#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | + | 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-L2#3---Verify-data-forwarding-is-correct-when-peer-link-status-change) | + | 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L2#4---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | + | 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-L2#5---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | + | 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L2#6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | + | 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L2#7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | + | 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L2#8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | + | 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L2#9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | + [L3 scenario test cases](#L3-scenario-test-cases) | + | 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L3#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | + | 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L3#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | + | 3 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L3#3---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) | + | 4 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L3#4---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | + | 5 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L3#5---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | + | 6 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L3#6---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | + | 7 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L3#7---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | + [VXLAN scenario test cases](#VXLAN-scenario-test-cases) | + | 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-VXLAN#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | + | 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-VXLAN#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | + | 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-VXLAN#3---Verify-data-forwarding-is-correct-when-peer-link-status-change) | + | 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-VXLAN#4---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | + | 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-VXLAN#5---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | + | 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-VXLAN#6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | + | 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-VXLAN#7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | + | 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-VXLAN#8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | + | 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN#9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | ### L2 scenario test cases -**SetUp: Load mclag L2 configuration files to dut and load it** +#### SetUp: Load mclag L2 configuration files to dut and load it #### Test case L2#1 - mclag info check and verify data forwarding is correct through mclag -**Test objective** +##### Test objective Verify that mclag info is correct when mclag build ok. Verify data forwarding is correct through mclag when mclag build ok. -**Test steps** +##### Test steps 1. Verify ping succeed between mclag peers. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. @@ -247,15 +276,15 @@ Verify data forwarding is correct through mclag when mclag build ok. 5. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 6. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#2 - Verify data forwarding is correct when mclag enabled interface status change -**Test objective** +##### Test objective Verify data forwarding is correct when mclag enabled interface status change. -**Test steps** +##### Test steps 1. mclag enabled interface status change to down. 2. Servers(exclude down ports) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. @@ -266,15 +295,15 @@ Verify data forwarding is correct when mclag enabled interface status change. 7. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 8. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#3 - Verify data forwarding is correct when peer-link status change -**Test objective** +##### Test objective Verify data forwarding is correct when peer-link status change. -**Test steps** +##### Test steps 1. Peer-link status change to down. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is still ok. @@ -286,15 +315,15 @@ Verify data forwarding is correct when peer-link status change. 8. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 9. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#4 - Verify data forwarding is correct when keepalive link status change -**Test objective** +##### Test objective Verify data forwarding is correct when keepalive link status change. -**Test steps** +##### Test steps 1. Keepalive link status change to down. 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. @@ -308,15 +337,15 @@ Verify data forwarding is correct when keepalive link status change. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#5 - Verify data forwarding is correct when peer-link and keepalive link status both change -**Test objective** +##### Test objective Verify data forwarding is correct when peer-link and keepalive link status both change. -**Test steps** +##### Test steps 1. Peer-link and keepalive link status change to down. 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. @@ -330,15 +359,15 @@ Verify data forwarding is correct when peer-link and keepalive link status both 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#6 - Verify data forwarding is correct when active device of mclag status change -**Test objective** +##### Test objective Verify data forwarding is correct when active device of mclag status change. -**Test steps** +##### Test steps 1. Active device of mclag status change to down. 2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. @@ -351,15 +380,15 @@ Verify data forwarding is correct when active device of mclag status change. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#7 - Verify data forwarding is correct when standby device of mclag status change -**Test objective** +##### Test objective Verify data forwarding is correct when standby device of mclag status change. -**Test steps** +##### Test steps 1. Standby device of mclag status change to down. 2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. @@ -372,15 +401,15 @@ Verify data forwarding is correct when standby device of mclag status change. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#8 - Verify data forwarding is correct when active devices of mclag warm-reboot -**Test objective** +##### Test objective Verify data forwarding is correct when active devices of mclag warm-reboot. -**Test steps** +##### Test steps 1. Active device of mclag warm-reboot. 2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. @@ -388,15 +417,15 @@ Verify data forwarding is correct when active devices of mclag warm-reboot. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L2#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot -**Test objective** +##### Test objective Verify data forwarding is correct when standby devices of mclag warm-reboot. -**Test steps** +##### Test steps 1. Standby device of mclag warm-reboot. 2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. @@ -404,23 +433,23 @@ Verify data forwarding is correct when standby devices of mclag warm-reboot. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass -**TearDown: Set default configuration** +#### TearDown: Set default configuration ### L3 scenario test cases -**SetUp: Load mclag L3 configuration files to dut and load it** +#### SetUp: Load mclag L3 configuration files to dut and load it #### Test case L3#1 - mclag info check and verify data forwarding is correct through mclag -**Test objective** +##### Test objective Verify that mclag info is correct when mclag build ok. Verify data forwarding is correct through mclag when mclag build ok. -**Test steps** +##### Test steps 1. Verify ping succeed between mclag peers. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. @@ -428,30 +457,30 @@ Verify data forwarding is correct through mclag when mclag build ok. 4. Servers(including orphan ports) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reach to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device(Services on orphan ports forwarding support by routing protocol or static route). -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L3#2 - Verify data forwarding is correct when mclag enabled interface status change -**Test objective** +##### Test objective Verify data forwarding is correct when mclag enabled interface status change. -**Test steps** +##### Test steps 1. mclag enabled interface status change to down. 2. Servers(exclude down ports) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. 3. mclag enabled interface status recover to up. 4. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L3#3 - Verify data forwarding is correct when keepalive link status change -**Test objective** +##### Test objective Verify data forwarding is correct when keepalive link status change. -**Test steps** +##### Test steps 1. Keepalive link status change to down. 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. @@ -461,15 +490,15 @@ Verify data forwarding is correct when keepalive link status change. 6. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. 7. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L3#4 - Verify data forwarding is correct when active device of mclag status change -**Test objective** +##### Test objective Verify data forwarding is correct when active device of mclag status change. -**Test steps** +##### Test steps 1. Active device of mclag status change to down. 2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. @@ -478,15 +507,15 @@ Verify data forwarding is correct when active device of mclag status change. 5. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to ok. 6. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L3#5 - Verify data forwarding is correct when standby device of mclag status change -**Test objective** +##### Test objective Verify data forwarding is correct when standby device of mclag status change. -**Test steps** +##### Test steps 1. Standby device of mclag status change to down. 2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. @@ -495,15 +524,15 @@ Verify data forwarding is correct when standby device of mclag status change. 5. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to ok. 6. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L3#6 - Verify data forwarding is correct when active devices of mclag warm-reboot -**Test objective** +##### Test objective Verify data forwarding is correct when active devices of mclag warm-reboot. -**Test steps** +##### Test steps 1. Active device of mclag warm-reboot. 2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. @@ -511,15 +540,15 @@ Verify data forwarding is correct when active devices of mclag warm-reboot. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case L3#7 - Verify data forwarding is correct when standby devices of mclag warm-reboot -**Test objective** +##### Test objective Verify data forwarding is correct when standby devices of mclag warm-reboot. -**Test steps** +##### Test steps 1. Standby device of mclag warm-reboot. 2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. @@ -527,23 +556,23 @@ Verify data forwarding is correct when standby devices of mclag warm-reboot. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass -**TearDown: Set default configuration** +#### TearDown: Set default configuration ### VXLAN scenario test cases -**SetUp: Load mclag VXLAN configuration files to dut and load it** +#### SetUp: Load mclag VXLAN configuration files to dut and load it #### Test case VXLAN#1 - mclag info check and verify data forwarding is correct through mclag -**Test objective** +##### Test objective Verify that mclag info is correct when mclag build ok. Verify data forwarding is correct through mclag when mclag build ok. -**Test steps** +##### Test steps 1. Verify ping succeed between mclag peers. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. @@ -552,15 +581,15 @@ Verify data forwarding is correct through mclag when mclag build ok. 5. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 6. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case VXLAN#2 - Verify data forwarding is correct when mclag enabled interface status change -**Test objective** +##### Test objective Verify data forwarding is correct when mclag enabled interface status change. -**Test steps** +##### Test steps 1. mclag enabled interface status change to down. 2. Servers(exclude down ports) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. @@ -571,15 +600,15 @@ Verify data forwarding is correct when mclag enabled interface status change. 7. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 8. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case VXLAN#3 - Verify data forwarding is correct when peer-link status change -**Test objective** +##### Test objective Verify data forwarding is correct when peer-link status change. -**Test steps** +##### Test steps 1. Peer-link status change to down. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is still ok. @@ -595,11 +624,11 @@ Verify data forwarding is correct when peer-link status change. #### Test case VXLAN#4 - Verify data forwarding is correct when keepalive link status change -**Test objective** +##### Test objective Verify data forwarding is correct when keepalive link status change. -**Test steps** +##### Test steps 1. Keepalive link status change to down. 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. @@ -613,15 +642,15 @@ Verify data forwarding is correct when keepalive link status change. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case VXLAN#5 - Verify data forwarding is correct when peer-link and keepalive link status both change -**Test objective** +##### Test objective Verify data forwarding is correct when peer-link and keepalive link status both change. -**Test steps** +##### Test steps 1. Peer-link and keepalive link status change to down. 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. @@ -639,11 +668,11 @@ Verify data forwarding is correct when peer-link and keepalive link status both #### Test case VXLAN#6 - Verify data forwarding is correct when active device of mclag status change -**Test objective** +##### Test objective Verify data forwarding is correct when active device of mclag status change. -**Test steps** +##### Test steps 1. Active device of mclag status change to down. 2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. @@ -656,15 +685,15 @@ Verify data forwarding is correct when active device of mclag status change. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case VXLAN#7 - Verify data forwarding is correct when standby device of mclag status change -**Test objective** +##### Test objective Verify data forwarding is correct when standby device of mclag status change. -**Test steps** +##### Test steps 1. Standby device of mclag status change to down. 2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. @@ -677,15 +706,15 @@ Verify data forwarding is correct when standby device of mclag status change. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case VXLAN#8 - Verify data forwarding is correct when active devices of mclag warm-reboot -**Test objective** +##### Test objective Verify data forwarding is correct when active devices of mclag warm-reboot. -**Test steps** +##### Test steps 1. Active device of mclag warm-reboot. 2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. @@ -693,15 +722,15 @@ Verify data forwarding is correct when active devices of mclag warm-reboot. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass #### Test case VXLAN#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot -**Test objective** +##### Test objective Verify data forwarding is correct when standby devices of mclag warm-reboot. -**Test steps** +##### Test steps 1. Standby device of mclag warm-reboot. 2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. @@ -709,9 +738,9 @@ Verify data forwarding is correct when standby devices of mclag warm-reboot. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Pass** +##### Expected test result: Pass -**TearDown: Set default configuration** +#### TearDown: Set default configuration ## TODO From 6b2e91815f607a171166613e24beabefd7f09f02 Mon Sep 17 00:00:00 2001 From: William-zx <47626856+William-zx@users.noreply.github.com> Date: Fri, 12 Jul 2019 12:50:27 +0800 Subject: [PATCH 4/7] Update MCLAG-ansible-test-plan.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the summary in “Test cases” --- doc/mclag_hld/MCLAG-ansible-test-plan.md | 50 ++++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/doc/mclag_hld/MCLAG-ansible-test-plan.md b/doc/mclag_hld/MCLAG-ansible-test-plan.md index 48f97b8d6a..2031c9f4ef 100644 --- a/doc/mclag_hld/MCLAG-ansible-test-plan.md +++ b/doc/mclag_hld/MCLAG-ansible-test-plan.md @@ -201,59 +201,59 @@ Depending on the test PTF test will verify the packet arrived or dropped. [L2 scenario test cases](#L2-scenario-test-cases) | -| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L2#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | +| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L21---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | -| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L2#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | +| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L22---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | -| 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-L2#3---Verify-data-forwarding-is-correct-when-peer-link-status-change) | +| 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-L23---Verify-data-forwarding-is-correct-when-peer-link-status-change) | -| 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L2#4---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | +| 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L24---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | -| 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-L2#5---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | +| 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-L25---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | -| 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L2#6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | +| 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L26---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | -| 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L2#7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | +| 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L27---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | -| 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L2#8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | +| 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L28---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | -| 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L2#9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +| 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L29---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | [L3 scenario test cases](#L3-scenario-test-cases) | -| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L3#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | +| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L31---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | -| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L3#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | +| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L32---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | -| 3 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L3#3---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) | +| 3 | [Verify data forwarding is correct when keepalive link status change](#Test-case-L33---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) | -| 4 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L3#4---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | +| 4 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-L34---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | -| 5 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L3#5---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | +| 5 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-L35---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | -| 6 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L3#6---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | +| 6 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L36---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | -| 7 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L3#7---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +| 7 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L37---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | [VXLAN scenario test cases](#VXLAN-scenario-test-cases) | -| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-VXLAN#1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | +| 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-VXLAN1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | -| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-VXLAN#2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | +| 2 | [Verify data forwarding is correct when mclag enabled interface status change](#Test-case-VXLAN2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) | -| 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-VXLAN#3---Verify-data-forwarding-is-correct-when-peer-link-status-change) | +| 3 | [Verify data forwarding is correct when peer-link status change](#Test-case-VXLAN3---Verify-data-forwarding-is-correct-when-peer-link-status-change) | -| 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-VXLAN#4---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | +| 4 | [Verify data forwarding is correct when keepalive link status change](#Test-case-VXLAN4---Verify-data-forwarding-is-correct-when-Keepalive-link-status-change) | -| 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-VXLAN#5---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | +| 5 | [Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-VXLAN5---Verify-data-forwarding-is-correct-when-peer-link-and-Keepalive-link-status-both-change) | -| 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-VXLAN#6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | +| 6 | [Verify data forwarding is correct when active device of mclag status change](#Test-case-VXLAN6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) | -| 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-VXLAN#7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | +| 7 | [Verify data forwarding is correct when standby device of mclag status change](#Test-case-VXLAN7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) | -| 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-VXLAN#8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | +| 8 | [Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-VXLAN8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) | -| 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN#9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +| 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | ### L2 scenario test cases From d750a1c661dde36b8ce9d7d5d63a3c785c60de09 Mon Sep 17 00:00:00 2001 From: William-zx <47626856+William-zx@users.noreply.github.com> Date: Thu, 19 Dec 2019 14:25:50 +0800 Subject: [PATCH 5/7] Update MCLAG-ansible-test-plan.md --- doc/mclag_hld/MCLAG-ansible-test-plan.md | 482 ++++++++++++++++------- 1 file changed, 340 insertions(+), 142 deletions(-) diff --git a/doc/mclag_hld/MCLAG-ansible-test-plan.md b/doc/mclag_hld/MCLAG-ansible-test-plan.md index 2031c9f4ef..941a45215c 100644 --- a/doc/mclag_hld/MCLAG-ansible-test-plan.md +++ b/doc/mclag_hld/MCLAG-ansible-test-plan.md @@ -16,42 +16,50 @@ - [Ansible scripts to setup and run test](#Ansible-scripts-to-setup-and-run-test) - [Command to deploy the topo t0-mclag](#Command-to-deploy-the-topo-t0-mclag) - [Deploy the initial configuration for both devices separately (with an extra parameter dut_no)](#Deploy-the-initial-configuration-for-both-devices-separately-with-an-extra-parameter-dutno) - - [mclag_config_dut2.yml](#mclagconfigdut2yml) - - [mclag.yml](#mclagyml) + - [test_mclag.py and test_mclag_l3.py](#testmclagpy-and-testmclagl3py) - [PTF Test](#PTF-Test) - - [Input files for PTF test](#Input-files-for-PTF-test) - - [Traffic validation in PTF](#Traffic-validation-in-PTF) + - [Input files for PTF test](#Input-files-for-ptf-test) + - [Traffic validation in PTF](#Traffic-validation-in-ptf) - [Test cases](#Test-cases) - [Summary](#Summary) - [L2 scenario test cases](#L2-scenario-test-cases) - - [Test case L2#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-L21---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) - - [Test case L2#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L22---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) - - [Test case L2#3 - Verify data forwarding is correct when peer-link status change](#Test-case-L23---Verify-data-forwarding-is-correct-when-peer-link-status-change) - - [Test case L2#4 - Verify data forwarding is correct when keepalive link status change](#Test-case-L24---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) - - [Test case L2#5 - Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-L25---Verify-data-forwarding-is-correct-when-peer-link-and-keepalive-link-status-both-change) - - [Test case L2#6 - Verify data forwarding is correct when active device of mclag status change](#Test-case-L26---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) - - [Test case L2#7 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-L27---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) - - [Test case L2#8 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L28---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) - - [Test case L2#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L29---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) + - [Test case L2#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-l21---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) + - [Test case L2#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-l22---verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) + - [Test case L2#3 - Verify data forwarding is correct when peer-link status change](#Test-case-l23---verify-data-forwarding-is-correct-when-peer-link-status-change) + - [Test case L2#4 - Verify data forwarding is correct when keepalive link status change](#Test-case-l24---verify-data-forwarding-is-correct-when-keepalive-link-status-change) + - [Test case L2#5 - Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-l25---verify-data-forwarding-is-correct-when-peer-link-and-keepalive-link-status-both-change) + - [Test case L2#6 - Verify data forwarding is correct when active device of mclag status change](#Test-case-l26---verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) + - [Test case L2#7 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-l27---verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) + - [Test case L2#8 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-l28---verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) + - [Test case L2#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-l29---verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) + - [Test case L2#10 - Verify data forwarding is correct after MAC movement](#Test-case-l210---verify-data-forwarding-is-correct-after-mac-movement) + - [Test case L2#11 - MAC sync-up and MAC aging test](#Test-case-l211---mac-sync-up-and-mac-aging-test) + - [Test case L2#12 - ICCP state machine test](#Test-case-l212---iccp-state-machine-test) + - [Test case L2#13 - Scaling test](#Test-case-l213---scaling-test) + - [Test case L2#14 - Corner test](#Test-case-l214---corner-test) - [L3 scenario test cases](#L3-scenario-test-cases) - - [Test case L3#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-L31---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) - - [Test case L3#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-L32---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) - - [Test case L3#3 - Verify data forwarding is correct when keepalive link status change](#Test-case-L33---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) - - [Test case L3#4 - Verify data forwarding is correct when active device of mclag status change](#Test-case-L34---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) - - [Test case L3#5 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-L35---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) - - [Test case L3#6 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-L36---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) - - [Test case L3#7 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L37---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) - - [VXLAN scenario test cases](#VXLAN-scenario-test-cases) + - [Test case L3#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-l31---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) + - [Test case L3#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-l32---verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) + - [Test case L3#3 - Verify data forwarding is correct when keepalive link status change](#Test-case-l33---verify-data-forwarding-is-correct-when-keepalive-link-status-change) + - [Test case L3#4 - Verify data forwarding is correct when active device of mclag status change](#Test-case-l34---verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) + - [Test case L3#5 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-l35---verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) + - [Test case L3#6 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-l36---verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) + - [Test case L3#7 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-l37---verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) + - [Test case L3#8 - Scaling test](#Test-case-l38---scaling-test) + - [VXLAN scenario test cases(vxlan test cases are for both l2 and l3)](#vxlan-scenario-test-casesvxlan-test-cases-are-for-both-l2-and-l3) - [Test case VXLAN#1 - mclag info check and verify data forwarding is correct through mclag](#Test-case-VXLAN1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) - - [Test case VXLAN#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-VXLAN2---Verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) - - [Test case VXLAN#3 - Verify data forwarding is correct when peer-link status change](#Test-case-VXLAN3---Verify-data-forwarding-is-correct-when-peer-link-status-change) - - [Test case VXLAN#4 - Verify data forwarding is correct when keepalive link status change](#Test-case-VXLAN4---Verify-data-forwarding-is-correct-when-keepalive-link-status-change) - - [Test case VXLAN#5 - Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-VXLAN5---Verify-data-forwarding-is-correct-when-peer-link-and-keepalive-link-status-both-change) - - [Test case VXLAN#6 - Verify data forwarding is correct when active device of mclag status change](#Test-case-VXLAN6---Verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) - - [Test case VXLAN#7 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-VXLAN7---Verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) - - [Test case VXLAN#8 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-VXLAN8---Verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) - - [Test case VXLAN#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) -- [TODO](#TODO) + - [Test case VXLAN#2 - Verify data forwarding is correct when mclag enabled interface status change](#Test-case-VXLAN2---verify-data-forwarding-is-correct-when-mclag-enabled-interface-status-change) + - [Test case VXLAN#3 - Verify data forwarding is correct when peer-link status change](#Test-case-VXLAN3---verify-data-forwarding-is-correct-when-peer-link-status-change) + - [Test case VXLAN#4 - Verify data forwarding is correct when keepalive link status change](#Test-case-VXLAN4---verify-data-forwarding-is-correct-when-keepalive-link-status-change) + - [Test case VXLAN#5 - Verify data forwarding is correct when peer-link and keepalive link status both change](#Test-case-VXLAN5---verify-data-forwarding-is-correct-when-peer-link-and-keepalive-link-status-both-change) + - [Test case VXLAN#6 - Verify data forwarding is correct when active device of mclag status change](#Test-case-VXLAN6---verify-data-forwarding-is-correct-when-active-device-of-mclag-status-change) + - [Test case VXLAN#7 - Verify data forwarding is correct when standby device of mclag status change](#Test-case-VXLAN7---verify-data-forwarding-is-correct-when-standby-device-of-mclag-status-change) + - [Test case VXLAN#8 - Verify data forwarding is correct when active devices of mclag warm-reboot](#Test-case-VXLAN8---verify-data-forwarding-is-correct-when-active-devices-of-mclag-warm-reboot) + - [Test case VXLAN#9 - Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN9---verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) + - [Test case VXLAN#10 - Verify data forwarding is correct after mac movement](#Test-case-VXLAN10---verify-data-forwarding-is-correct-after-mac-movement) + - [Test case VXLAN#11 - MAC sync-up and MAC aging test](#Test-case-VXLAN11---mac-sync-up-and-mac-aging-test) + - [Test case VXLAN#12 - Scaling test](#Test-case-VXLAN12---scaling-test) +- [TODO](#todo) ## overview @@ -93,15 +101,15 @@ Testbeds t0-mclag is modified based on the Testbeds t0. #### L2 scenario -All links to server ports are L2 mode, and peer-link must allow all vlans to be used. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. +All links to server ports are L2 mode, and peer-link must allow all vlans to be used. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will build through BGP route. #### L3 scenario -All links to server ports are L3 mode, the peer-link is optional. DUT is the gateway of the servers. DUT binds MCLAG's interface ip address must be the same except peer-link. +All links to server ports are L3 mode, the peer-link is optional. DUT is the gateway of the servers. DUT binds MCLAG's interface ip address must be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will build through BGP route. #### VXLAN scenario -All links to server ports are L2 mode. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. +All links to server ports are L2 mode. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will build through BGP route. ## Setup configuration @@ -109,7 +117,7 @@ All links to server ports are L2 mode. DUT is the gateway of the servers. DUT bi Setup of SONIC DUT will be done by Ansible script. During setup Ansible will copy JSON file containing configuration for mclag to the DUT. Config utility will be used to push configuration to the SONiC DB. -**Template** +#### Template ```jason "MC_LAG": { @@ -122,7 +130,7 @@ Setup of SONIC DUT will be done by Ansible script. During setup Ansible will cop } ``` -**Attributes** +#### Attributes ```jason "" = Description: mclag domain id @@ -142,7 +150,7 @@ Setup of SONIC DUT will be done by Ansible script. During setup Ansible will cop Value range: PortChannel name ``` -**Example** +#### Example ```jason "MC_LAG": { @@ -161,31 +169,24 @@ Setup of SONIC DUT will be done by Ansible script. During setup Ansible will cop - ./testbed-cli.sh add-topo vms-t0-mclag ~/.password -#### Deploy the initial configuration for both devices separately (**with an extra parameter dut_no**) +#### Deploy the initial configuration for both devices separately (with an extra parameter dut_no) - ansible-playbook -i lab config_sonic_basedon_testbed.yml -l "dut1_name" -e vm_base="VM0300" -e topo=t0-mclag -e deploy=True -e save=True -e testbed_name=vms-t0-mclag -e dut_no=1 - ansible-playbook -i lab config_sonic_basedon_testbed.yml -l "dut2_name" -e vm_base="VM0300" -e topo=t0-mclag -e deploy=True -e save=True -e testbed_name=vms-t0-mclag-dut2 -e dut_no=2 -#### mclag_config_dut2.yml +#### test_mclag.py and test_mclag_l3.py -mclag_config_dut2.yml when run with testname “mclag_config_dut2” will do the following: +test_mclag.py test mclag l2 scenario, and test_mclag_l3.py test mclag l3 scenario. -- Generate mclag configuration on DUT2. -- Generate some port info of DUT2 +- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag-16 --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag.py -#### mclag.yml - -mclag.yml when run with testname “mclag” will do the following: - -- Generate and apply mclag configuration on two DUTs. -- Run test. -- Clean up dynamic and temporary mclag configuration. +- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag-16 --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag_l3.py ## PTF Test ### Input files for PTF test -PTF test will generate traffic between ports and make sure it passes according to the mclag configuration. Depending on the testbed topology and the existing configuration (e.g. ECMP, LAGS, etc) packets may arrive to different ports. Therefore ports connection information will be generated from the minigraph and supplied to the PTF script. +PTF test will generate traffic between ports and make sure it passes according to the mclag configuration. Depending on the testbed topology and the existing configuration (e.g. ECMP, LAGS, etc) packets may arrive to different ports. Therefore ports connection information will be generated from the minigraph and supplied to the PTF script. The script only cares about whether all packets are received on the correct port, not the rate at which they are sent(Our current server runs scripts at hundreds of packets per second). ### Traffic validation in PTF @@ -219,6 +220,16 @@ Depending on the test PTF test will verify the packet arrived or dropped. | 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L29---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +| 10 | [Verify data forwarding is correct after MAC movement](#Test-case-L210---Verify-data-forwarding-is-correct-after-MAC-movement) | + +| 11 | [MAC sync-up and MAC aging test](#Test-case-L211---MAC-sync-up-and-MAC-agin-test) | + +| 12 | [ICCP state machine test](#Test-case-L212---ICCP-state-machine-test) | + +| 13 | [Scaling test](#Test-case-L213---Scaling-test) | + +| 14 | [Corner test](#Test-case-L214---Corner-test) | + [L3 scenario test cases](#L3-scenario-test-cases) | | 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-L31---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | @@ -235,6 +246,8 @@ Depending on the test PTF test will verify the packet arrived or dropped. | 7 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-L37---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +| 8 | [Scaling test](#Test-case-L38---Scaling-test) | + [VXLAN scenario test cases](#VXLAN-scenario-test-cases) | | 1 | [mclag info check and verify data forwarding is correct through mclag](#Test-case-VXLAN1---mclag-info-check-and-verify-data-forwarding-is-correct-through-mclag) | @@ -255,6 +268,12 @@ Depending on the test PTF test will verify the packet arrived or dropped. | 9 | [Verify data forwarding is correct when standby devices of mclag warm-reboot](#Test-case-VXLAN9---Verify-data-forwarding-is-correct-when-standby-devices-of-mclag-warm-reboot) | +| 10 | [Verify data forwarding is correct after MAC movement](#Test-case-VXLAN10---Verify-data-forwarding-is-correct-after-MAC-movement) | + +| 11 | [MAC sync-up and MAC aging test](#Test-case-VXLAN11---MAC-sync-up-and-MAC-aging-test) | + +| 12 | [Scaling test](#Test-case-VXLAN12---Scaling-test) | + ### L2 scenario test cases #### SetUp: Load mclag L2 configuration files to dut and load it @@ -272,7 +291,7 @@ Verify data forwarding is correct through mclag when mclag build ok. 1. Verify ping succeed between mclag peers. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. 3. Verify standby device changes its LACP system ID to be the same as active device. -4. Servers(including orphan ports) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reach to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 6. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -286,14 +305,15 @@ Verify data forwarding is correct when mclag enabled interface status change. ##### Test steps -1. mclag enabled interface status change to down. -2. Servers(exclude down ports) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +1. mclag enabled interface status change to down(shutdown port). +2. Servers(exclude down ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 3. "show mac" command verify the macs learned on down port before will point to the peer-link. -4. "show arp" command verify the arps learned on down port before will point to the peer-link. -5. mclag enabled interface status recover to up. -6. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -7. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. -8. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +4. "mclagdctl -i \ dump mac" command verify the macs learned on down port before will add "L" flag and add "P" flag indicates the same MAC entry in peer devic. +5. "show arp" command verify the arps learned on down port before will point to the peer-link. +6. mclag enabled interface status recover to up(startup port). +7. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +8. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +9. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. ##### Expected test result: Pass @@ -305,13 +325,13 @@ Verify data forwarding is correct when peer-link status change. ##### Test steps -1. Peer-link status change to down. +1. Peer-link status change to down(shutdown peer-link). 2. "mclagdctl -i \ dump state" command verify mclag keepalive is still ok. -3. Servers(exclude orphan ports) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. Servers(exclude orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. Servers(orphan port) can only communicate with other orphan port servers connected to the same device, we will not verify the data forwarding on orphan port servers in this case. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. -6. Peer-link status recover to up. -7. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +6. Peer-link status recover to up(startup peer-link). +7. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 8. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 9. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -325,15 +345,15 @@ Verify data forwarding is correct when keepalive link status change. ##### Test steps -1. Keepalive link status change to down. +1. Keepalive link status change to down(shutdown ports connect with VMs). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default -4. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(Send L2 packets to servers that belong to the same vlan and L3 packets to servers that belong to other vlans). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Keepalive link status recover to up. +7. Keepalive link status recover to up(startup ports connect with VMs). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. -9. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -347,15 +367,15 @@ Verify data forwarding is correct when peer-link and keepalive link status both ##### Test steps -1. Peer-link and keepalive link status change to down. +1. Peer-link and keepalive link status change to down(shutdown the peer-link and those ports connected to the VMs). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default -4. Servers(exclude orphan ports and those ports link to standby device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Servers(exclude orphan ports and those ports link to standby device of mclag) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Peer-link and keepalive link status recover to up. +7. Peer-link and keepalive link status recover to up(startup the peer-link and those ports connected to the VMs). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. -9. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -369,14 +389,14 @@ Verify data forwarding is correct when active device of mclag status change. ##### Test steps -1. Active device of mclag status change to down. +1. Active device of mclag status change to down(reboot active device of mclag). 2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. -3. Servers(exclude ports which link to active device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. Servers(exclude ports which link to active device of mclag) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. 5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. 6. Active device of mclag status recover to up. 7. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to ok. -8. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +8. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -390,14 +410,14 @@ Verify data forwarding is correct when standby device of mclag status change. ##### Test steps -1. Standby device of mclag status change to down. +1. Standby device of mclag status change to down(reboot standby device of mclag). 2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. -3. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. -5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. +3. Servers(exclude ports which link to standby device of mclag) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +4. "show mac" command on active device verify the macs learned on standby device orphan ports will be deleted. +5. "show arp" command on active device verify the arps learned on standby device orphan ports will be deleted. 6. Standby device of mclag status recover to up. 7. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to ok. -8. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +8. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -412,10 +432,9 @@ Verify data forwarding is correct when active devices of mclag warm-reboot. ##### Test steps 1. Active device of mclag warm-reboot. -2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. -3. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. -5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +2. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +3. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +4. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. ##### Expected test result: Pass @@ -428,10 +447,114 @@ Verify data forwarding is correct when standby devices of mclag warm-reboot. ##### Test steps 1. Standby device of mclag warm-reboot. -2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. -3. Servers will send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +2. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +3. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +4. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +##### Expected test result: Pass + +#### Test case L2#10 - Verify data forwarding is correct after MAC movement + +##### Test objective + +Verify data forwarding is correct after MAC movement. + +##### Test steps + +1. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +2. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +3. "mclagdctl -i \ dump mac" command verify the macs learned on local device orphan ports will add "P" flag and add "L" flag indicates the same MAC entry in peer devic. The macs learned on mclag enabled interfaces doesn't have any flags. +4. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +5. Modify ptf configruation move one orphan port server(server1) from active device to standby device. +6. Verify server1 ping dut succeed. +7. "show mac" command verify the server1 mac point to the peer-link on mclag active device. The server1 mac learned on orphan ports of mclag standby device. +8. "mclagdctl -i \ dump mac" command verify "L" flag indicates the server1 MAC on active device and "P" flag indicates the server1 MAC on standby device. +9. Servers(including orphan ports) send packets to server1(servers belonging to the same vlan send L2 packets, servers belonging to other vlans send L3 packets). All packets must be received on the correct destination ports. +10. Recover ptf configruation to default. + +##### Expected test result: Pass + +#### Test case L2#11 - MAC sync-up and MAC aging test + +##### Test objective + +Verify MAC sync-up and MAC aging ok. + +##### Test steps + +1. mclag enabled interface status change to down(shutdown port). +2. "mclagdctl -i \ dump mac" command verify the macs learned on down port before will add "L" flag and add "P" flag indicates the same MAC entry in peer devic. +3. mclag enabled interface status change to up(startup port). +4. "mclagdctl -i \ dump mac" command verify those macs do not has any flag. +5. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +6. "mclagdctl -i \ dump mac" command verify the macs learned on local device orphan ports will add "P" flag and add "L" flag indicates the same MAC entry in peer devic. The macs learned on mclag enabled interfaces doesn't have any flags. +7. Modify mac aging time to 60s. +8. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +9. "mclagdctl -i \ dump mac" command verify the macs learned on local device orphan ports will add "P" flag and add "L" flag indicates the same MAC entry in peer devic. The macs learned on mclag enabled interfaces doesn't have any flags. +10. Wait 30s. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(The purpose was to keep the MAC from aging on the active device). +11. Wait 30s. The macs learned on standby device will aging. Active device: "mclagdctl -i \ dump mac" command verify the macs learned on mclag enable interface will add "P" flag, add the macs learned on orphan ports of standby device will be deleted. Standby device: "mclagdctl -i \ dump mac" command verify the macs learned on mclag enable interface will add "L" flag, add the macs learned on orphan ports of active device will keep "L" flag. +12. Servers(exclude ports which link to active device of mclag) send packets to others Servers. +13. Active device: "mclagdctl -i \ dump mac" command verify the macs learned on mclag enable interface will keep "P" flag, add the macs learned on orphan ports of standby device will add "P" flag. Standby device: "mclagdctl -i \ dump mac" command verify the macs learned on mclag enable interface will keep "L" flag, add the macs learned on orphan ports of active device will keep "L" flag. +14. Modify mac aging time to default 600s. + +##### Expected test result: Pass + +#### Test case L2#12 - ICCP state machine test + +##### Test objective + +Verify ICCP state machine in syslog. + +##### Test steps + +1. Reboot the active device. +2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok on active device. +3. ICCP state machine info can be find in syslog(from NONEXISTENT to INITIALIZED; from XXX to CAPREC; from XXX to OPERATIONAL). +4. Reboot the standby device. +5. "mclagdctl -i \ dump state" command verify mclag keepalive is ok on standby device. +6. ICCP state machine info can be find in syslog(from NONEXISTENT to INITIALIZED; from XXX to CAPREC; from XXX to OPERATIONAL). + +##### Expected test result: Pass + +#### Test case L2#13 - Scaling test + +##### Test objective + +MAC and ARP Scaling test. + +##### Test steps + +1. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +2. Each server(including orphan ports) simulate 100 virtual machines. +3. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +6. Recover server configruation + +##### Expected test result: Pass + +#### Test case L2#14 - Corner test + +##### Test objective + +Corner test for teamd service hangs. + +##### Test steps + +1. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +2. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +3. "sudo service teamd stop" on active device. +4. Wait 90s. The server port connected to the active device changes to the deselected state. The mclag peer-link break. +5. Servers(exclude orphan ports and those ports link to active device of mclag) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +6. "sudo service teamd start; sudo service swss restart" on active device. +7. The server port connected to the active device changes to the selected state. The mclag peer-link recover up. +8. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +9. "sudo service teamd stop" on standby device. +10. Wait 90s. The server port connected to the standby device changes to the deselected state. The mclag peer-link break. +11. Servers(exclude orphan ports and those ports link to standby device of mclag) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. +12. "sudo service teamd start; sudo service swss restart" on standby device. +13. The server port connected to the standby device changes to the selected state. The mclag peer-link recover up. +14. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. ##### Expected test result: Pass @@ -454,7 +577,7 @@ Verify data forwarding is correct through mclag when mclag build ok. 1. Verify ping succeed between mclag peers. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. 3. Verify standby device changes its LACP system ID to be the same as active device. -4. Servers(including orphan ports) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reach to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Servers(including orphan ports) send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device(Services on orphan ports forwarding support by routing protocol or static route). ##### Expected test result: Pass @@ -467,10 +590,10 @@ Verify data forwarding is correct when mclag enabled interface status change. ##### Test steps -1. mclag enabled interface status change to down. -2. Servers(exclude down ports) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -3. mclag enabled interface status recover to up. -4. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +1. mclag enabled interface status change to down(shutdown port). +2. Servers(exclude down ports) send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. +3. mclag enabled interface status recover to up(startup port). +4. Servers send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. ##### Expected test result: Pass @@ -482,13 +605,13 @@ Verify data forwarding is correct when keepalive link status change. ##### Test steps -1. Keepalive link status change to down. +1. Keepalive link status change to down(shutdown ports connect with VMs). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default -4. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -5. Keepalive link status recover to up. +4. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(send L3 packets to other servers). All packets must be received on the correct destination ports. +5. Keepalive link status recover to up(startup ports connect with VMs). 6. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. -7. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +7. Servers send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. ##### Expected test result: Pass @@ -500,12 +623,12 @@ Verify data forwarding is correct when active device of mclag status change. ##### Test steps -1. Active device of mclag status change to down. +1. Active device of mclag status change to down(reboot active device of mclag). 2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. -3. Servers(exclude ports which link to active device of mclag) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. Servers(exclude ports which link to active device of mclag) send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. 4. Active device of mclag status recover to up. 5. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to ok. -6. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +6. Servers send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. ##### Expected test result: Pass @@ -517,12 +640,12 @@ Verify data forwarding is correct when standby device of mclag status change. ##### Test steps -1. Standby device of mclag status change to down. +1. Standby device of mclag status change to down(reboot standby device of mclag). 2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. -3. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. Servers(exclude ports which link to standby device of mclag) send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. 4. Standby device of mclag status recover to up. 5. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to ok. -6. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +6. Servers send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. ##### Expected test result: Pass @@ -535,10 +658,8 @@ Verify data forwarding is correct when active devices of mclag warm-reboot. ##### Test steps 1. Active device of mclag warm-reboot. -2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. -3. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. -5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +2. Servers send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. +3. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. ##### Expected test result: Pass @@ -551,16 +672,30 @@ Verify data forwarding is correct when standby devices of mclag warm-reboot. ##### Test steps 1. Standby device of mclag warm-reboot. -2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. -3. Servers will send packets to others Servers and VMs(send L3 packets to other servers and VMs). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. -5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +2. Servers send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. +3. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. + +##### Expected test result: Pass + +#### Test case L3#8 - Scaling test + +##### Test objective + +ARP Scaling test. + +##### Test steps + +1. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +2. Each server(including orphan ports) simulate 100 virtual machines. +3. Servers(including orphan portss) send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. +4. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. +5. Recover server configruation ##### Expected test result: Pass #### TearDown: Set default configuration -### VXLAN scenario test cases +### VXLAN scenario test cases(vxlan test cases are for both l2 and l3) #### SetUp: Load mclag VXLAN configuration files to dut and load it @@ -577,7 +712,7 @@ Verify data forwarding is correct through mclag when mclag build ok. 1. Verify ping succeed between mclag peers. 2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. 3. Verify standby device changes its LACP system ID to be the same as active device. -4. Servers(including orphan ports) will send packets to others Servers. When packet reach to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Servers(including orphan ports) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. VXLAN tunnel encapsulated packets can be captured on the link VM ports. 5. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 6. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -591,12 +726,12 @@ Verify data forwarding is correct when mclag enabled interface status change. ##### Test steps -1. mclag enabled interface status change to down. -2. Servers(exclude down ports) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +1. mclag enabled interface status change to down(shutdown port). +2. Servers(exclude down ports) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. 3. "show mac" command verify the macs learned on down port before will point to the peer-link. 4. "show arp" command verify the arps learned on down port before will point to the peer-link. -5. mclag enabled interface status recover to up. -6. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +5. mclag enabled interface status recover to up(startup port). +6. Servers send packets to others Servers. All packets must be received on the correct destination ports. 7. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 8. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -610,17 +745,17 @@ Verify data forwarding is correct when peer-link status change. ##### Test steps -1. Peer-link status change to down. +1. Peer-link status change to down(shutdown peer-link, but not support now). 2. "mclagdctl -i \ dump state" command verify mclag keepalive is still ok. -3. Servers will send packets to others Servers(exclude orphan ports). When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. Servers(exclude orphan ports) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. Servers(orphan port) can only communicate with other orphan port servers connected to the same device, we will not verify the data forwarding on orphan port servers in this case. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. -6. Peer-link status recover to up. -7. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +6. Peer-link status recover to up(startup peer-link, but not support now). +7. Servers send packets to others Servers. All packets must be received on the correct destination ports. 8. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 9. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Failed** +##### Expected test result: Failed(The peer-link cannot shutdown in the VXLAN scenario, This test case can pass after BFD function is introduced) #### Test case VXLAN#4 - Verify data forwarding is correct when keepalive link status change @@ -630,15 +765,15 @@ Verify data forwarding is correct when keepalive link status change. ##### Test steps -1. Keepalive link status change to down. +1. Keepalive link status change to down(shutdown ports connect with VMs). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default -4. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Keepalive link status recover to up. +7. Keepalive link status recover to up(startup ports connect with VMs). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. -9. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. Servers send packets to others Servers. All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -652,19 +787,19 @@ Verify data forwarding is correct when peer-link and keepalive link status both ##### Test steps -1. Peer-link and keepalive link status change to down. +1. Peer-link and Keepalive link status change to down(shutdown the peer-link and those ports connected to the VMs, but not support shutdown the peer-link now). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default -4. Servers(exclude orphan ports and those ports link to standby device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +4. Servers(exclude orphan ports and those ports link to standby device of mclag) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Peer-link and keepalive link status recover to up. +7. Peer-link and keepalive link status recover to up(startup the peer-link and those ports connected to the VMs, but not support startup the peer-link now). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. -9. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +9. Servers send packets to others Servers. All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 11. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. -**Expected test result: Failed** +##### Expected test result: Failed(The peer-link cannot shutdown in the VXLAN scenario. This test case can pass after BFD function is introduced) #### Test case VXLAN#6 - Verify data forwarding is correct when active device of mclag status change @@ -674,14 +809,14 @@ Verify data forwarding is correct when active device of mclag status change. ##### Test steps -1. Active device of mclag status change to down. +1. Active device of mclag status change to down(reboot active device of mclag). 2. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to error. -3. Servers(exclude ports which link to active device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +3. Servers(exclude ports which link to active device of mclag) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. 4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. 5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. 6. Active device of mclag status recover to up. 7. "mclagdctl -i \ dump state" command on standby device verify mclag keepalive change to ok. -8. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +8. Servers send packets to others Servers. All packets must be received on the correct destination ports. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -695,14 +830,14 @@ Verify data forwarding is correct when standby device of mclag status change. ##### Test steps -1. Standby device of mclag status change to down. +1. Standby device of mclag status change to down(reboot standby device of mclag). 2. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to error. -3. Servers(exclude ports which link to standby device of mclag) will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -4. "show mac" command on standby device verify the macs learned on active device orphan ports will be deleted. -5. "show arp" command on standby device verify the arps learned on active device orphan ports will be deleted. +3. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. +4. "show mac" command on active device verify the macs learned on standby device orphan ports will be deleted. +5. "show arp" command on active device verify the arps learned on standby device orphan ports will be deleted. 6. Standby device of mclag status recover to up. 7. "mclagdctl -i \ dump state" command on active device verify mclag keepalive change to ok. -8. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +8. Servers send packets to others Servers. All packets must be received on the correct destination ports. 9. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 10. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. @@ -717,10 +852,9 @@ Verify data forwarding is correct when active devices of mclag warm-reboot. ##### Test steps 1. Active device of mclag warm-reboot. -2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on standby device. -3. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. -4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. -5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +2. Servers send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. +3. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +4. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. ##### Expected test result: Pass @@ -733,10 +867,71 @@ Verify data forwarding is correct when standby devices of mclag warm-reboot. ##### Test steps 1. Standby device of mclag warm-reboot. -2. "mclagdctl -i \ dump state" command verify mclag keepalive keep ok on active device. -3. Servers will send packets to others Servers. When packet reaches to SONIC DUT, it will forward to the correct destination. PTF will receive a copy of the packet and perform validations described in validation of Traffic. +2. Servers send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. +3. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +4. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. + +##### Expected test result: Pass + +#### Test case VXLAN#10 - Verify data forwarding is correct after mac movement + +##### Test objective + +Verify data forwarding is correct after mac movement. + +##### Test steps + +1. Servers(including orphan ports) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. +2. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. +3. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +4. Modify ptf configruation move one orphan port server(server1) from active device to standy device. +5. Verify server1 ping dut succeed. +6. "show mac" command verify the server1 mac point to the peer-link on mclag active device. The server1 mac learned on orphan ports of mclag standby device. +7. Servers(including orphan ports) send packets to server1. All packets must be received on the correct destination ports. +8. Recover ptf configruation to default. + +##### Expected test result: Pass + +#### Test case VXLAN#11 - MAC sync-up and MAC aging test + +##### Test objective + +Verify MAC sync-up and MAC aging ok. + +##### Test steps + +1. Modify mac aging time to 60s. +2. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +3. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. +4. "mclagdctl -i \ dump mac" command verify the macs learned on local device orphan ports will add "P" flag and add "L" flag indicates the same MAC entry in peer devic. The macs learned on mclag enabled interfaces doesn't have any flags. +5. Wait 30s. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(The purpose was to keep the MAC from aging on the active device). +6. Wait 30s. The macs learned on standby device will aging. Active device: "mclagdctl -i \ dump mac" command verify the macs learned on mclag enable interface will add "P" flag, add the macs learned on orphan ports of standby device will be deleted. Standby device: "mclagdctl -i \ dump mac" command verify the macs learned on mclag enable interface will add "L" flag, add the macs learned on orphan ports of active device will keep "L" flag. +7. Servers(exclude ports which link to active device of mclag) send packets to others Servers. +8. "mclagdctl -i \ dump mac" command verify the macs learned on local device orphan ports will add "P" flag and add "L" flag indicates the same MAC entry in peer devic. The macs learned on mclag enabled interfaces doesn't have any flags. +9. mclag enabled interface status change to down(shutdown port). +10. "mclagdctl -i \ dump mac" command verify the macs learned on down port before will add "L" flag and add "P" flag indicates the same MAC entry in peer devic. +11. mclag enabled interface status change to up(startup port). +12. "mclagdctl -i \ dump mac" command verify the macs not change. +13. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. +14. "mclagdctl -i \ dump mac" command verify the macs learned on local device orphan ports will add "P" flag and add "L" flag indicates the same MAC entry in peer devic. The macs learned on mclag enabled interfaces doesn't have any flags. +15. Modify mac aging time to default 600s. + +##### Expected test result: Pass + +#### Test case VXLAN#12 - Scaling test + +##### Test objective + +MAC and ARP Scaling test. + +##### Test steps + +1. "mclagdctl -i \ dump state" command verify mclag keepalive is ok. +2. Each server(including orphan ports) simulate 100 virtual machines. +3. Servers(including orphan ports) send packets to others Servers and VMs(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. 4. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. 5. "show arp" command verify the arps learned on mclag enabled interface are the same on both mclag device. The arps learned on orphan ports will point to the peer-link on another device. +6. Recover server configruation ##### Expected test result: Pass @@ -744,6 +939,9 @@ Verify data forwarding is correct when standby devices of mclag warm-reboot. ## TODO -Peer-link cannot be closed in the VXLAN scenario, and the following two testcases will fail. -- Test case VXLAN#3 - Verify data forwarding is correct when peer-link status change +VXLAN scenario will Submit as phase 2. + +The peer-link cannot shutdown in the VXLAN scenario. This test case can pass after the BFD function is introduced, and the following two test cases will fail at present. + +- Test case VXLAN#4 - Verify data forwarding is correct when peer-link status change - Test case VXLAN#5 - Verify data forwarding is correct when peer-link and keepalive link status both change From b0d3bed06527fd66897be004968f2d0072dd3e49 Mon Sep 17 00:00:00 2001 From: William-zx <47626856+William-zx@users.noreply.github.com> Date: Thu, 19 Dec 2019 14:35:24 +0800 Subject: [PATCH 6/7] Update MCLAG-ansible-test-plan.md --- doc/mclag_hld/MCLAG-ansible-test-plan.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/mclag_hld/MCLAG-ansible-test-plan.md b/doc/mclag_hld/MCLAG-ansible-test-plan.md index 941a45215c..523b473f80 100644 --- a/doc/mclag_hld/MCLAG-ansible-test-plan.md +++ b/doc/mclag_hld/MCLAG-ansible-test-plan.md @@ -178,9 +178,9 @@ Setup of SONIC DUT will be done by Ansible script. During setup Ansible will cop test_mclag.py test mclag l2 scenario, and test_mclag_l3.py test mclag l3 scenario. -- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag-16 --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag.py +- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag.py -- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag-16 --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag_l3.py +- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag_l3.py ## PTF Test From c13518f9ab365cc7fd04643f4339195c98648361 Mon Sep 17 00:00:00 2001 From: William-zx <47626856+William-zx@users.noreply.github.com> Date: Mon, 23 Dec 2019 14:29:10 +0800 Subject: [PATCH 7/7] Update MCLAG-ansible-test-plan.md MCLAG keepalive link will be established through a separate link. Avoid forwarding performance issues on the VMs when routing oscillation. --- doc/mclag_hld/MCLAG-ansible-test-plan.md | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/mclag_hld/MCLAG-ansible-test-plan.md b/doc/mclag_hld/MCLAG-ansible-test-plan.md index 523b473f80..38f3ea7e98 100644 --- a/doc/mclag_hld/MCLAG-ansible-test-plan.md +++ b/doc/mclag_hld/MCLAG-ansible-test-plan.md @@ -101,15 +101,15 @@ Testbeds t0-mclag is modified based on the Testbeds t0. #### L2 scenario -All links to server ports are L2 mode, and peer-link must allow all vlans to be used. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will build through BGP route. +All links to server ports are L2 mode, and peer-link must allow all vlans to be used. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will be established through a separate link. #### L3 scenario -All links to server ports are L3 mode, the peer-link is optional. DUT is the gateway of the servers. DUT binds MCLAG's interface ip address must be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will build through BGP route. +All links to server ports are L3 mode, the peer-link is optional. DUT is the gateway of the servers. DUT binds MCLAG's interface ip address must be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will be established through a separate link. #### VXLAN scenario -All links to server ports are L2 mode. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will build through BGP route. +All links to server ports are L2 mode. DUT is the gateway of the servers. DUT binds MCLAG's vlan interface IP address to be the same except peer-link. Establish BGP neighbors between the VMs and two DUTs. MCLAG keepalive link will be established through a separate link. ## Setup configuration @@ -178,9 +178,9 @@ Setup of SONIC DUT will be done by Ansible script. During setup Ansible will cop test_mclag.py test mclag l2 scenario, and test_mclag_l3.py test mclag l3 scenario. -- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag.py +- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag-16 --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag.py -- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag_l3.py +- pytest -vvv --disable_loganalyzer --inventory veos --host-pattern all --user admin --testbed vms-t0-mclag-16 --testbed_file testbed.csv --duration=0 --show-capture=stdout test_mclag_l3.py ## PTF Test @@ -345,13 +345,13 @@ Verify data forwarding is correct when keepalive link status change. ##### Test steps -1. Keepalive link status change to down(shutdown ports connect with VMs). +1. Keepalive link status change to down(shutdown keepalive link). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default 4. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(Send L2 packets to servers that belong to the same vlan and L3 packets to servers that belong to other vlans). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Keepalive link status recover to up(startup ports connect with VMs). +7. Keepalive link status recover to up(startup keepalive link). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. 9. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. @@ -367,13 +367,13 @@ Verify data forwarding is correct when peer-link and keepalive link status both ##### Test steps -1. Peer-link and keepalive link status change to down(shutdown the peer-link and those ports connected to the VMs). +1. Peer-link and keepalive link status change to down(shutdown the peer-link and keepalive link). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default 4. Servers(exclude orphan ports and those ports link to standby device of mclag) send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Peer-link and keepalive link status recover to up(startup the peer-link and those ports connected to the VMs). +7. Peer-link and keepalive link status recover to up(startup the peer-link and keepalive link). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. 9. Servers send packets to others Servers and VMs(send L2 packets to servers that belong to the same vlan, and send L3 packets to VMs and servers belonging to other vlans). All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. @@ -605,11 +605,11 @@ Verify data forwarding is correct when keepalive link status change. ##### Test steps -1. Keepalive link status change to down(shutdown ports connect with VMs). +1. Keepalive link status change to down(shutdown keepalive link). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default 4. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(send L3 packets to other servers). All packets must be received on the correct destination ports. -5. Keepalive link status recover to up(startup ports connect with VMs). +5. Keepalive link status recover to up(startup keepalive link). 6. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. 7. Servers send packets to others Servers and VMs(send L3 packets to other servers and VMs). All packets must be received on the correct destination ports. @@ -765,13 +765,13 @@ Verify data forwarding is correct when keepalive link status change. ##### Test steps -1. Keepalive link status change to down(shutdown ports connect with VMs). +1. Keepalive link status change to down(shutdown keepalive link). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default 4. Servers(exclude ports which link to standby device of mclag) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Keepalive link status recover to up(startup ports connect with VMs). +7. Keepalive link status recover to up(startup keepalive link). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. 9. Servers send packets to others Servers. All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device. @@ -787,13 +787,13 @@ Verify data forwarding is correct when peer-link and keepalive link status both ##### Test steps -1. Peer-link and Keepalive link status change to down(shutdown the peer-link and those ports connected to the VMs, but not support shutdown the peer-link now). +1. Peer-link and Keepalive link status change to down(shutdown the peer-link and keepalive link, but not support shutdown the peer-link now). 2. "mclagdctl -i \ dump state" command verify mclag keepalive change to error. 3. Verify standby device changes its LACP system ID to the local default 4. Servers(exclude orphan ports and those ports link to standby device of mclag) send packets to others Servers(send L2 packets to servers that belong to the same VNI, and send L3 packets to VMs and servers belonging to other VNI). All packets must be received on the correct destination ports. 5. "show mac" command verify the macs learned on standby device orphan ports will be deleted. 6. "show arp" command verify the arps learned on standby device orphan ports will be deleted. -7. Peer-link and keepalive link status recover to up(startup the peer-link and those ports connected to the VMs, but not support startup the peer-link now). +7. Peer-link and keepalive link status recover to up(startup the peer-link and keepalive link, but not support startup the peer-link now). 8. "mclagdctl -i \ dump state" command verify mclag keepalive change to ok. 9. Servers send packets to others Servers. All packets must be received on the correct destination ports. 10. "show mac" command verify the macs learned on mclag enabled interface are the same on both mclag device. The macs learned on orphan ports will point to the peer-link on another device.