Bridge Domain tests update 36/336/3
authorMatus Fabian <matfabia@cisco.com>
Wed, 17 Feb 2016 11:03:48 +0000 (12:03 +0100)
committerMatus Fabian <matfabia@cisco.com>
Thu, 18 Feb 2016 10:40:17 +0000 (11:40 +0100)
Change-Id: I4ad1566fd23746c0a85d7abce2bbffd085ee397c
Signed-off-by: Matus Fabian <matfabia@cisco.com>
resources/libraries/python/L2Util.py
resources/libraries/python/NodePath.py
resources/libraries/robot/bridge_domain.robot
resources/templates/vat/l2_bridge_domain.vat
tests/suites/bridge_domain/test.robot

index 8581b1e..065c97c 100644 (file)
@@ -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))
index d1aa1f7..6700ddf 100644 (file)
@@ -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()
index da669c4..f433599 100644 (file)
 # 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}
index 9c81dbc..e1d36b6 100644 (file)
@@ -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
index 4c88cae..0f81985 100644 (file)
 | 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 ***
 
 
 | 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}