1 # Copyright (c) 2016 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
14 """L2 Utilities Library."""
16 from robot.api.deco import keyword
17 from resources.libraries.python.topology import Topology
18 from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal
22 """Utilities for l2 configuration"""
25 def vpp_add_l2fib_entry(node, mac, interface, bd_id):
26 """ Create a static L2FIB entry on a vpp node.
28 :param node: Node to add L2FIB entry on.
29 :param mac: Destination mac address.
30 :param interface: Interface name.
31 :param bd_id: Bridge domain id.
37 sw_if_index = Topology.get_interface_sw_index(node, interface)
38 VatExecutor.cmd_from_template(node, "add_l2_fib_entry.vat",
40 interface=sw_if_index)
43 def create_l2_bd(node, bd_id, flood=1, uu_flood=1, forward=1, learn=1,
45 """Create a l2 bridge domain on the chosen VPP node
47 Execute "bridge_domain_add_del bd_id {bd_id} flood {flood} uu-flood 1
48 forward {forward} learn {learn} arp-term {arp_term}" VAT command on
51 :param node: node where we wish to crate the l2 bridge domain
52 :param bd_id: bridge domain index number
53 :param flood: enable flooding
54 :param uu_flood: enable uu_flood
55 :param forward: enable forwarding
56 :param learn: enable mac address learning to fib
57 :param arp_term: enable arp_termination
66 VatExecutor.cmd_from_template(node, "l2_bd_create.vat",
67 bd_id=bd_id, flood=flood,
68 uu_flood=uu_flood, forward=forward,
69 learn=learn, arp_term=arp_term)
72 def add_interface_to_l2_bd(node, interface, bd_id, shg=0):
73 """Add a interface to the l2 bridge domain.
75 Get SW IF ID and add it to the bridge domain.
77 :param node: node where we want to execute the command that does this
78 :param interface: interface name
79 :param bd_id: bridge domain index number to add Interface name to
80 :param shg: split horizon group
86 sw_if_index = Topology.get_interface_sw_index(node, interface)
87 L2Util.add_sw_if_index_to_l2_bd(node, sw_if_index, bd_id, shg)
90 def add_sw_if_index_to_l2_bd(node, sw_if_index, bd_id, shg=0):
91 """Add interface with sw_if_index to l2 bridge domain.
93 Execute the "sw_interface_set_l2_bridge sw_if_index {sw_if_index}
94 bd_id {bd_id} shg {shg} enable" VAT command on the given node.
96 :param node: node where we want to execute the command that does this
97 :param sw_if_index: interface index
98 :param bd_id: bridge domain index number to add SW IF ID to
99 :param shg: split horizon group
101 :type sw_if_index: int
106 VatExecutor.cmd_from_template(node, "l2_bd_add_sw_if_index.vat",
107 bd_id=bd_id, sw_if_index=sw_if_index,
111 @keyword('Create dict used in bridge domain template file for node '
112 '"${node}" with links "${link_names}" and bd_id "${bd_id}"')
113 def create_bridge_domain_vat_dict(node, link_names, bd_id):
114 """Create dictionary that can be used in l2 bridge domain template.
116 :param node: node data dictionary
117 :param link_names: list of names of links the bridge domain should be
119 :param bd_id: bridge domain index number
121 :type link_names: list
122 :return: dictionary used to generate l2 bridge domain VAT configuration
124 The resulting dictionary looks like this:
125 'interface1': interface name of first interface
126 'interface2': interface name of second interface
127 'bd_id': bridge domain index
129 bd_dict = Topology().get_interfaces_by_link_names(node, link_names)
130 bd_dict['bd_id'] = bd_id
134 def vpp_add_l2_bridge_domain(node, bd_id, port_1, port_2, learn=True):
135 """Add L2 bridge domain with 2 interfaces to the VPP node.
137 :param node: Node to add L2BD on.
138 :param bd_id: Bridge domain ID.
139 :param port_1: First interface name added to L2BD.
140 :param port_2: Second interface name added to L2BD.
141 :param learn: Enable/disable MAC learn.
148 sw_if_index1 = Topology.get_interface_sw_index(node, port_1)
149 sw_if_index2 = Topology.get_interface_sw_index(node, port_2)
150 VatExecutor.cmd_from_template(node,
151 'l2_bridge_domain.vat',
152 sw_if_id1=sw_if_index1,
153 sw_if_id2=sw_if_index2,
158 def vpp_setup_bidirectional_cross_connect(node, interface1, interface2):
159 """Create bidirectional cross-connect between 2 interfaces on vpp node.
161 :param node: Node to add bidirectional cross-connect
162 :param interface1: first interface name or sw_if_index
163 :param interface2: second interface name or sw_if_index
165 :type interface1: str or int
166 :type interface2: str or int
169 if isinstance(interface1, basestring):
170 sw_iface1 = Topology().get_interface_sw_index(node, interface1)
172 sw_iface1 = interface1
174 if isinstance(interface2, basestring):
175 sw_iface2 = Topology().get_interface_sw_index(node, interface2)
177 sw_iface2 = interface2
179 with VatTerminal(node) as vat:
180 vat.vat_terminal_exec_cmd_from_template('l2_xconnect.vat',
181 interface1=sw_iface1,
182 interface2=sw_iface2)
183 vat.vat_terminal_exec_cmd_from_template('l2_xconnect.vat',
184 interface1=sw_iface2,
185 interface2=sw_iface1)