aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--resources/libraries/python/L2Util.py49
-rw-r--r--resources/libraries/python/NodePath.py4
-rw-r--r--resources/libraries/robot/bridge_domain.robot63
-rw-r--r--resources/templates/vat/l2_bridge_domain.vat11
-rw-r--r--tests/suites/bridge_domain/test.robot58
5 files changed, 99 insertions, 86 deletions
diff --git a/resources/libraries/python/L2Util.py b/resources/libraries/python/L2Util.py
index 8581b1e879..065c97cb97 100644
--- a/resources/libraries/python/L2Util.py
+++ b/resources/libraries/python/L2Util.py
@@ -25,25 +25,21 @@ class L2Util(object):
pass
@staticmethod
- @keyword('Setup static L2FIB entry on node "${node}" for MAC "${dst_mac}"'
- ' link "${link}" pair on bd_index "${bd_id}"')
- def static_l2_fib_entry_via_links(node, dst_mac, link, bd_id):
- """ Creates a static fib entry on a vpp node
+ def vpp_add_l2fib_entry(node, mac, interface, bd_id):
+ """ Creates a static L2FIB entry on a vpp node.
- :param node: node where we wish to add the static fib entry
- :param dst_mac: destination mac address in the entry
- :param link: link name of the node destination interface
- :param bd_id: l2 bridge domain id
+ :param node: Node to add L2FIB entry on.
+ :param mac: Destination mac address.
+ :param interface: Interface name.
+ :param bd_id: Bridge domain id.
:type node: dict
- :type dst_mac: str
- :type link: str
- :type bd_id: str
+ :type mac: str
+ :type interface: str
+ :type bd_id: int
"""
- topology = Topology()
- interface_name = topology.get_interface_by_link_name(node, link)
- sw_if_index = topology.get_interface_sw_index(node, interface_name)
+ sw_if_index = Topology.get_interface_sw_index(node, interface)
VatExecutor.cmd_from_template(node, "add_l2_fib_entry.vat",
- mac=dst_mac, bd=bd_id,
+ mac=mac, bd=bd_id,
interface=sw_if_index)
@staticmethod
@@ -117,3 +113,26 @@ class L2Util(object):
bd_dict['bd_id'] = bd_id
return bd_dict
+ @staticmethod
+ def vpp_add_l2_bridge_domain(node, bd_id, port_1, port_2, learn=True):
+ """Add L2 bridge domain with 2 interfaces to the VPP node.
+
+ :param node: Node to add L2BD on.
+ :param bd_id: Bridge domain ID.
+ :param port_1: First interface name added to L2BD.
+ :param port_2: Second interface name addded to L2BD.
+ :param learn: Enable/disable MAC learn.
+ :type node: dict
+ :type bd_id: int
+ :type interface1: str
+ :type interface2: str
+ :type learn: bool
+ """
+ sw_if_index1 = Topology.get_interface_sw_index(node, port_1)
+ sw_if_index2 = Topology.get_interface_sw_index(node, port_2)
+ VatExecutor.cmd_from_template(node,
+ 'l2_bridge_domain.vat',
+ sw_if_id1=sw_if_index1,
+ sw_if_id2=sw_if_index2,
+ bd_id=bd_id,
+ learn=int(learn))
diff --git a/resources/libraries/python/NodePath.py b/resources/libraries/python/NodePath.py
index d1aa1f76d4..6700ddfe2a 100644
--- a/resources/libraries/python/NodePath.py
+++ b/resources/libraries/python/NodePath.py
@@ -115,6 +115,10 @@ class NodePath(object):
l_set = set(links).intersection(self._links)
else:
l_set = set(links).difference(self._links)
+ if not l_set:
+ raise RuntimeError(
+ 'No free link between {0} and {1}, all links already ' +
+ 'used'.format(node1['host'], node2['host']))
if not l_set:
link = links.pop()
diff --git a/resources/libraries/robot/bridge_domain.robot b/resources/libraries/robot/bridge_domain.robot
index da669c42ce..f433599bbd 100644
--- a/resources/libraries/robot/bridge_domain.robot
+++ b/resources/libraries/robot/bridge_domain.robot
@@ -12,58 +12,27 @@
# limitations under the License.
*** Settings ***
-| Library | resources.libraries.python.VatExecutor
-| Library | resources.libraries.python.VatConfigGenerator
| Library | resources.libraries.python.topology.Topology
| Library | resources.libraries.python.TrafficScriptExecutor
| Library | resources.libraries.python.L2Util
-| Variables | resources/libraries/python/constants.py
-
-*** Variables ***
-| ${VAT_BD_TEMPLATE} | ${Constants.RESOURCES_TPL_VAT}/l2_bridge_domain.vat
-| ${VAT_BD_STATIC_TPL} | ${Constants.RESOURCES_TPL_VAT}/l2_bridge_domain_static.vat
-| ${VAT_BD_GEN_FILE} | ${Constants.RESOURCES_TPL_VAT}/l2_bridge_domain_gen.vat
-| ${VAT_BD_REMOTE_PATH} | ${Constants.REMOTE_FW_DIR}/${Constants.RESOURCES_TPL_VAT}/l2_bridge_domain_gen.vat
*** Keywords ***
-| Setup l2 bridge on node "${node}" via links "${link_names}"
-| | ${interface_config}= | Get Interfaces By Link Names | ${node} | ${link_names}
-| | ${commands}= | Generate Vat Config File | ${VAT_BD_TEMPLATE} | ${interface_config} | ${VAT_BD_GEN_FILE}
-| | Copy Config To Remote | ${node} | ${VAT_BD_GEN_FILE} | ${VAT_BD_REMOTE_PATH}
-# TODO: will be removed once v4 is merged to master.
-| | Execute Script | l2_bridge_domain_gen.vat | ${node} | json_out=False
-| | Script Should Have Passed
-
-| Setup l2 bridge with static fib on node "${node}" via links "${link_names}" on bd with index "${bd_id}"
-| | ${vat_template_dict}= | Create dict used in bridge domain template file for node "${node}" with links "${link_names}" and bd_id "${bd_id}"
-| | ${commands}= | Generate Vat Config File | ${VAT_BD_STATIC_TPL} | ${vat_template_dict} | ${VAT_BD_GEN_FILE}
-| | Copy Config To Remote | ${node} | ${VAT_BD_GEN_FILE} | ${VAT_BD_REMOTE_PATH}
-# TODO: will be removed once v4 is merged to master.
-| | Execute Script | l2_bridge_domain_gen.vat | ${node} | json_out=False
-| | Script Should Have Passed
+| Vpp l2bd forwarding setup
+| | [Documentation] | Setup BD between 2 interfaces on VPP node and if learning
+| | ... | is off set static L2FIB entry on second interface
+| | [Arguments] | ${node} | ${if1} | ${if2} | ${learn}=${TRUE} | ${mac}=${EMPTY}
+| | Vpp Add L2 Bridge Domain | ${node} | ${1} | ${if1} | ${if2} | ${learn}
+| | Run Keyword If | ${learn} == ${FALSE}
+| | ... | Vpp Add L2fib Entry | ${node} | ${mac} | ${if2} | ${1}
+| | Sleep | 5 | # Wait some time after interface is set up
-| Send traffic on node "${node}" from link "${link1}" to link "${link2}"
-| | ${src_port}= | Get Interface By Link Name | ${node} | ${link1}
-| | ${dst_port}= | Get Interface By Link Name | ${node} | ${link2}
+| Send and receive traffic
+| | [Documentation] | Send traffic from source interface to destination interface
+| | [Arguments] | ${tg_node} | ${src_int} | ${dst_int}
+| | ${src_mac}= | Get Interface Mac | ${tg_node} | ${src_int}
+| | ${dst_mac}= | Get Interface Mac | ${tg_node} | ${dst_int}
| | ${src_ip}= | Set Variable | 192.168.100.1
| | ${dst_ip}= | Set Variable | 192.168.100.2
-| | ${src_mac}= | Get Node Link Mac | ${node} | ${link1}
-| | ${dst_mac}= | Get Node Link Mac | ${node} | ${link2}
-| | ${args}= | Traffic Script Gen Arg | ${dst_port} | ${src_port} | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip}
-| | Run Traffic Script On Node | send_ip_icmp.py | ${node} | ${args}
-
-| Setup TG "${tg}" DUT1 "${dut1}" and DUT2 "${dut2}" for 3 node l2 bridge domain test
-| | ${topology_links}= | Get link data useful in circular topology test from tg "${tg}" dut1 "${dut1}" dut2 "${dut2}"
-| | Setup l2 bridge on node "${dut1}" via links "${topology_links['DUT1_BD_LINKS']}"
-| | Setup l2 bridge on node "${dut2}" via links "${topology_links['DUT2_BD_LINKS']}"
-| | [Return] | ${topology_links['TG_TRAFFIC_LINKS']}
-
-| Setup TG "${tg}" DUT1 "${dut1}" and DUT2 "${dut2}" for 3 node static l2fib test
-| | ${topology_links}= | Get link data useful in circular topology test from tg "${tg}" dut1 "${dut1}" dut2 "${dut2}"
-| | ${dst_mac}= | Get Node Link Mac | ${tg} | ${topology_links["DUT2_TG_LINK"]}
-| | ${bd_index}= | Set Variable | 1
-| | Setup l2 bridge with static fib on node "${dut1}" via links "${topology_links['DUT1_BD_LINKS']}" on bd with index "${bd_index}"
-| | Setup static L2FIB entry on node "${dut1}" for MAC "${dst_mac}" link "${topology_links['DUT1_DUT2_LINK']}" pair on bd_index "${bd_index}"
-| | Setup l2 bridge with static fib on node "${dut2}" via links "${topology_links['DUT2_BD_LINKS']}" on bd with index "${bd_index}"
-| | Setup static L2FIB entry on node "${dut2}" for MAC "${dst_mac}" link "${topology_links['DUT2_TG_LINK']}" pair on bd_index "${bd_index}"
-| | [Return] | ${topology_links["TG_TRAFFIC_LINKS"]}
+| | ${args}= | Traffic Script Gen Arg | ${dst_int} | ${src_int} | ${src_mac}
+| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip}
+| | Run Traffic Script On Node | send_ip_icmp.py | ${tg_node} | ${args}
diff --git a/resources/templates/vat/l2_bridge_domain.vat b/resources/templates/vat/l2_bridge_domain.vat
index 9c81dbc8e8..e1d36b6bcf 100644
--- a/resources/templates/vat/l2_bridge_domain.vat
+++ b/resources/templates/vat/l2_bridge_domain.vat
@@ -1,6 +1,5 @@
-sw_interface_set_flags {interface1} admin-up link-up
-sw_interface_set_flags {interface2} admin-up link-up
-bridge_domain_add_del bd_id 1 flood 1 uu-flood 1 forward 1 learn 1 arp-term 0
-sw_interface_set_l2_bridge {interface1} bd_id 1 shg 0 enable
-sw_interface_set_l2_bridge {interface2} bd_id 1 shg 0 enable
-exec trace add dpdk-input 100
+sw_interface_set_flags sw_if_index {sw_if_id1} admin-up link-up
+sw_interface_set_flags sw_if_index {sw_if_id2} admin-up link-up
+bridge_domain_add_del bd_id {bd_id} flood 1 uu-flood 1 forward 1 learn {learn} arp-term 0
+sw_interface_set_l2_bridge sw_if_index {sw_if_id1} bd_id {bd_id} shg 0 enable
+sw_interface_set_l2_bridge sw_if_index {sw_if_id2} bd_id {bd_id} shg 0 enable
diff --git a/tests/suites/bridge_domain/test.robot b/tests/suites/bridge_domain/test.robot
index 4c88cae7b8..0f8198545f 100644
--- a/tests/suites/bridge_domain/test.robot
+++ b/tests/suites/bridge_domain/test.robot
@@ -14,10 +14,12 @@
| Resource | resources/libraries/robot/default.robot
| Resource | resources/libraries/robot/interfaces.robot
| Resource | resources/libraries/robot/bridge_domain.robot
-| 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
*** Test Cases ***
@@ -26,24 +28,44 @@
| Vpp forwards packets via L2 bridge domain 2 ports
| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
-| | ${TG_DUT_links}= | Get active links connecting "${nodes['TG']}" and "${nodes['DUT1']}"
-| | Setup l2 bridge on node "${nodes['DUT1']}" via links "${TG_DUT_links}"
-| | Send traffic on node "${nodes['TG']}" from link "${TG_DUT_links[0]}" to link "${TG_DUT_links[1]}"
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
+| | Compute Path | always_same_link=${FALSE}
+| | ${src_if} | ${tmp}= | First Interface
+| | ${dst_if} | ${tmp}= | Last Interface
+| | ${bd_if1} | ${tmp}= | First Ingress Interface
+| | ${bd_if2} | ${tmp}= | Last Egress Interface
+| | Vpp l2bd forwarding setup | ${nodes['DUT1']} | ${bd_if1} | ${bd_if2}
+| | Send and receive traffic | ${nodes['TG']} | ${src_if} | ${dst_if}
| Vpp forwards packets via L2 bridge domain in circular topology
-| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
-| | ${tg}= | Set Variable | ${nodes['TG']}
-| | ${dut1}= | Set Variable | ${nodes['DUT1']}
-| | ${dut2}= | Set Variable | ${nodes['DUT2']}
-| | ${tg_links}= | Setup TG "${tg}" DUT1 "${dut1}" and DUT2 "${dut2}" for 3 node l2 bridge domain test
-| | Sleep | 10 | Workaround for interface still in down state after vpp restart
-| | Send traffic on node "${nodes['TG']}" from link "${tg_links[0]}" to link "${tg_links[1]}"
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
+| | ... | ${nodes['TG']}
+| | Compute Path
+| | ${src_if} | ${tg}= | Next Interface
+| | ${dut1_if1} | ${dut1}= | Next Interface
+| | ${dut1_if2} | ${dut1}= | Next Interface
+| | ${dut2_if1} | ${dut2}= | Next Interface
+| | ${dut2_if2} | ${dut2}= | Next Interface
+| | ${dst_if} | ${tg}= | Next Interface
+| | Vpp l2bd forwarding setup | ${dut1} | ${dut1_if1} | ${dut1_if2}
+| | Vpp l2bd forwarding setup | ${dut2} | ${dut2_if1} | ${dut2_if2}
+| | Send and receive traffic | ${tg} | ${src_if} | ${dst_if}
| Vpp forwards packets via L2 bridge domain in circular topology with static L2FIB entries
-| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
-| | ${tg}= | Set Variable | ${nodes['TG']}
-| | ${dut1}= | Set Variable | ${nodes['DUT1']}
-| | ${dut2}= | Set Variable | ${nodes['DUT2']}
-| | ${tg_links}= | Setup TG "${tg}" DUT1 "${dut1}" and DUT2 "${dut2}" for 3 node static l2fib test
-| | Sleep | 10 | Workaround for interface still in down state after vpp restart
-| | Send traffic on node "${nodes['TG']}" from link "${tg_links[0]}" to link "${tg_links[1]}"
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
+| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
+| | ... | ${nodes['TG']}
+| | Compute Path
+| | ${src_if} | ${tg}= | Next Interface
+| | ${dut1_if1} | ${dut1}= | Next Interface
+| | ${dut1_if2} | ${dut1}= | Next Interface
+| | ${dut2_if1} | ${dut2}= | Next Interface
+| | ${dut2_if2} | ${dut2}= | Next Interface
+| | ${dst_if} | ${tg}= | Next Interface
+| | ${mac}= | Get Interface Mac | ${tg} | ${dst_if}
+| | Vpp l2bd forwarding setup | ${dut1} | ${dut1_if1} | ${dut1_if2} | ${FALSE}
+| | ... | ${mac}
+| | Vpp l2bd forwarding setup | ${dut2} | ${dut2_if1} | ${dut2_if2} | ${FALSE}
+| | ... | ${mac}
+| | Send and receive traffic | ${tg} | ${src_if} | ${dst_if}