Add HW_EVN and VM_ENV tags to specify limitations on where the given
test could be run. For tests that should be run only on bare metal,
author of the test should add tag HW_ENV to it.
Add 3_NODE_SINGLE_LINK_TOPO tag, to specify requirement on topology,
where only one link is required in between any two nodes in the
topology.
Change-Id: I38c9a9732cad608bb6a9e4a2c5f1997236cd48b9
Signed-off-by: Stefan Kobza <skobza@cisco.com>
echo pip install
pip install -r requirements.txt
echo pip install
pip install -r requirements.txt
-PYTHONPATH=`pwd` pybot -L TRACE -v TOPOLOGY_PATH:topologies/available/virl.yaml --exclude PERFTEST tests || true
-
+PYTHONPATH=`pwd` pybot -L TRACE \
+ -v TOPOLOGY_PATH:topologies/available/virl.yaml \
+ --include vm_env \
+ --include 3_NODE_SINGLE_LINK_TOPO \
+ --exclude 3_node_double_link_topoNOT3_node_single_link_topo \
+ --exclude PERFTEST \
+ tests/
3 nodes connected in a circular topology with two links interconnecting
the devices.
3 nodes connected in a circular topology with two links interconnecting
the devices.
+3_NODE_SINGLE_LINK_TOPO
+ 3 nodes connected in a circular topoloty with at least one link
+ interconnecting devices.
+
Objective TAGs
--------------
Environment TAGs
----------------
Objective TAGs
--------------
Environment TAGs
----------------
+
+HW_ENV
+ DUTs and TGs are running on bare metal.
+
+VM_ENV
+ DUTs and TGs are running in virtual environment.
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/interfaces.robot
| Resource | resources/libraries/robot/bridge_domain.robot
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/interfaces.robot
| Resource | resources/libraries/robot/bridge_domain.robot
+| Force Tags | HW_ENV | VM_ENV
| Library | resources.libraries.python.topology.Topology
| Library | resources.libraries.python.NodePath
| Variables | resources/libraries/python/topology.py
| Suite Setup | Setup all TGs before traffic script
| Test Setup | Setup all DUTs before test
| Library | resources.libraries.python.topology.Topology
| Library | resources.libraries.python.NodePath
| Variables | resources/libraries/python/topology.py
| Suite Setup | Setup all TGs before traffic script
| Test Setup | Setup all DUTs before test
-| Force Tags | 3_NODE_DOUBLE_LINK_TOPO
| Library | resources.libraries.python.NodePath
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/ipv4.robot
| Library | resources.libraries.python.NodePath
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/ipv4.robot
+| Force Tags | HW_ENV | VM_ENV
| Suite Setup | Run Keywords | Setup all DUTs before test
| ... | AND | Setup all TGs before traffic script
| ... | AND | Update All Interface Data On All Nodes | ${nodes}
| Suite Setup | Run Keywords | Setup all DUTs before test
| ... | AND | Setup all TGs before traffic script
| ... | AND | Update All Interface Data On All Nodes | ${nodes}
*** Test Cases ***
| VPP replies to ICMPv4 echo request
*** Test Cases ***
| VPP replies to ICMPv4 echo request
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Node "${src_node}" interface "${src_port}" can route to node "${dst_node}" interface "${dst_port}" ${hops} hops away using IPv4
| TG can route to DUT2 through DUT1
| | Node "${src_node}" interface "${src_port}" can route to node "${dst_node}" interface "${dst_port}" ${hops} hops away using IPv4
| TG can route to DUT2 through DUT1
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Node "${src_node}" interface "${src_port}" can route to node "${dst_node}" interface "${dst_port}" ${hops} hops away using IPv4
| TG can route to DUT2 egress interface through DUT1
| | Node "${src_node}" interface "${src_port}" can route to node "${dst_node}" interface "${dst_port}" ${hops} hops away using IPv4
| TG can route to DUT2 egress interface through DUT1
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Node "${src_node}" interface "${src_port}" can route to node "${dst_node}" interface "${dst_port}" ${hops} hops away using IPv4
| TG can route to TG through DUT1 and DUT2
| | Node "${src_node}" interface "${src_port}" can route to node "${dst_node}" interface "${dst_port}" ${hops} hops away using IPv4
| TG can route to TG through DUT1 and DUT2
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
| | Compute Path
| | ${src_port} | ${src_node}= | First Interface
| | Check ipv4 interface counter | ${node} | ${port} | ${exp_counter_val}
| VPP can process ICMP echo request from min to max packet size with 1B increment
| | Check ipv4 interface counter | ${node} | ${port} | ${exp_counter_val}
| VPP can process ICMP echo request from min to max packet size with 1B increment
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv4 icmp echo sweep | ${nodes['TG']} | ${nodes['DUT1']}
| | ... | ${nodes['TG']['interfaces']['port3']['name']}
| | ... | ${nodes['DUT1']['interfaces']['port1']['name']}
| VPP responds to ARP request
| | Ipv4 icmp echo sweep | ${nodes['TG']} | ${nodes['DUT1']}
| | ... | ${nodes['TG']['interfaces']['port3']['name']}
| | ... | ${nodes['DUT1']['interfaces']['port1']['name']}
| VPP responds to ARP request
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Send ARP request and validate response | ${nodes['TG']} | ${nodes['DUT1']}
| | Send ARP request and validate response | ${nodes['TG']} | ${nodes['DUT1']}
| Resource | resources/libraries/robot/counters.robot
| Resource | resources/libraries/robot/default.robot
| Variables | resources/libraries/python/IPv6NodesAddr.py | ${nodes}
| Resource | resources/libraries/robot/counters.robot
| Resource | resources/libraries/robot/default.robot
| Variables | resources/libraries/python/IPv6NodesAddr.py | ${nodes}
+| Force Tags | HW_ENV | VM_ENV
| Suite Setup | Run Keywords | Setup ipv6 to all dut in topology | ${nodes} | ${nodes_ipv6_addr}
| ... | AND | Vpp nodes ra supress link layer | ${nodes}
| ... | AND | Vpp nodes setup ipv6 routing | ${nodes} | ${nodes_ipv6_addr}
| Suite Setup | Run Keywords | Setup ipv6 to all dut in topology | ${nodes} | ${nodes_ipv6_addr}
| ... | AND | Vpp nodes ra supress link layer | ${nodes}
| ... | AND | Vpp nodes setup ipv6 routing | ${nodes} | ${nodes_ipv6_addr}
*** Test Cases ***
| VPP replies to ICMPv6 echo request
*** Test Cases ***
| VPP replies to ICMPv6 echo request
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv6 icmp echo | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
| VPP can process ICMPv6 echo request from min to max packet size with 1B increment
| | Ipv6 icmp echo | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
| VPP can process ICMPv6 echo request from min to max packet size with 1B increment
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv6 icmp echo sweep | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
| TG can route to first DUT egress interface
| | Ipv6 icmp echo sweep | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
| TG can route to first DUT egress interface
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv6 tg to dut1 egress | ${nodes['TG']} | ${nodes['DUT1']} |
| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
| TG can route to second DUT through first DUT
| | Ipv6 tg to dut1 egress | ${nodes['TG']} | ${nodes['DUT1']} |
| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
| TG can route to second DUT through first DUT
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv6 tg to dut2 via dut1 | ${nodes['TG']} | ${nodes['DUT1']}
| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
| TG can route to second DUT egress interface through first DUT
| | Ipv6 tg to dut2 via dut1 | ${nodes['TG']} | ${nodes['DUT1']}
| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
| TG can route to second DUT egress interface through first DUT
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv6 tg to dut2 egress via dut1 | ${nodes['TG']} | ${nodes['DUT1']}
| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
| TG can route to TG through first and second DUT
| | Ipv6 tg to dut2 egress via dut1 | ${nodes['TG']} | ${nodes['DUT1']}
| | ... | ${nodes['DUT2']} | ${nodes_ipv6_addr}
| TG can route to TG through first and second DUT
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv6 tg to tg routed | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
| | ... | ${nodes_ipv6_addr}
| VPP replies to IPv6 Neighbor Solicitation
| | Ipv6 tg to tg routed | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
| | ... | ${nodes_ipv6_addr}
| VPP replies to IPv6 Neighbor Solicitation
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Ipv6 neighbor solicitation | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
| | Ipv6 neighbor solicitation | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes_ipv6_addr}
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/l2_xconnect.robot
| Library | resources.libraries.python.NodePath
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/l2_xconnect.robot
| Library | resources.libraries.python.NodePath
-| Force Tags | 3_NODE_SINGLE_LINK_TOPO
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | HW_ENV | VM_ENV
| Test Setup | Setup all DUTs before test
| Suite Setup | Setup all TGs before traffic script
| Test Setup | Setup all DUTs before test
| Suite Setup | Setup all TGs before traffic script
*** Test Cases ***
| Vpp forwards packets via L2 xconnect in circular topology
*** Test Cases ***
| Vpp forwards packets via L2 xconnect in circular topology
-| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
| | Compute Path
| | ${src_if} | ${tg}= | Next Interface
| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']} | ${nodes['TG']}
| | Compute Path
| | ${src_if} | ${tg}= | Next Interface
| Resource | resources/libraries/robot/counters.robot
| Library | resources.libraries.python.TrafficGenerator
| Library | resources.libraries.python.NodePath
| Resource | resources/libraries/robot/counters.robot
| Library | resources.libraries.python.TrafficGenerator
| Library | resources.libraries.python.NodePath
-| Force Tags | topo-3node | PERFTEST
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV
| Test Setup | Setup all DUTs before test
| Suite Setup | Initialize traffic generator | ${nodes['TG']}
| ... | ${nodes['TG']['interfaces']['port3']['pci_address']}
| Test Setup | Setup all DUTs before test
| Suite Setup | Initialize traffic generator | ${nodes['TG']}
| ... | ${nodes['TG']['interfaces']['port3']['pci_address']}