1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# Copyright (c) 2016 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""L2 bridge domain utilities Library."""
from robot.api.deco import keyword
from resources.libraries.python.topology import Topology
from resources.libraries.python.VatExecutor import VatExecutor
class L2Util(object):
"""Utilities for l2 bridge domain configuration"""
def __init__(self):
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
: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
:type node: dict
:type dst_mac: str
:type link: str
:type bd_id: str
"""
topology = Topology()
interface_name = topology.get_interface_by_link_name(node, link)
sw_if_index = topology.get_interface_sw_index(node, interface_name)
VatExecutor.cmd_from_template(node, "add_l2_fib_entry.vat",
mac=dst_mac, bd=bd_id,
interface=sw_if_index)
@staticmethod
@keyword('Setup l2 bridge domain with id "${bd_id}" flooding "${flood}" '
'forwarding "${forward}" learning "${learn}" and arp termination '
'"${arp_term}" on vpp node "${node}"')
def setup_vpp_l2_bridge_domain(node, bd_id, flood, forward, learn,
arp_term):
"""Create a l2 bridge domain on the chosen vpp node
Executes "bridge_domain_add_del bd_id {bd_id} flood {flood} uu-flood 1
forward {forward} learn {learn} arp-term {arp_term}" VAT command on
the node.
For the moment acts as a placeholder
:param node: node where we wish to crate the l2 bridge domain
:param bd_id: bridge domain id
:param flood: enable flooding
:param forward: enable forwarding
:param learn: enable mac address learning to fib
:param arp_term: enable arp_termination
:type node: str
:type bd_id: str
:type flood: bool
:type forward: bool
:type learn: bool
:type arp_term:bool
:return:
"""
pass
@keyword('Add interface "${interface}" to l2 bridge domain with index '
'"${bd_id}" and shg "${shg}" on vpp node "${node}"')
def add_interface_to_l2_bd(self, node, interface, bd_id, shg):
"""Adds interface to l2 bridge domain.
Executes the "sw_interface_set_l2_bridge {interface1} bd_id {bd_id}
shg {shg} enable" VAT command on the given node.
For the moment acts as a placeholder
:param node: node where we want to execute the command that does this.
:param interface:
:param bd_id:
:param shg:
:type node: dict
:type interface: str
:type bd_id: str
:type shg: str
:return:
"""
pass
@staticmethod
@keyword('Create dict used in bridge domain template file for node '
'"${node}" with links "${link_names}" and bd_id "${bd_id}"')
def create_bridge_domain_vat_dict(node, link_names, bd_id):
"""Creates dictionary that can be used in l2 bridge domain template.
:param node: node data dictionary
:param link_names: list of names of links the bridge domain should be
connecting
:param bd_id: bridge domain index number
:type node: dict
:type link_names: list
:return: dictionary used to generate l2 bridge domain VAT configuration
from template file
The resulting dictionary looks like this:
'interface1': interface name of first interface
'interface2': interface name of second interface
'bd_id': bridge domian index
"""
bd_dict = Topology().get_interfaces_by_link_names(node, link_names)
bd_dict['bd_id'] = bd_id
return bd_dict
|