aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/L2Util.py
blob: 8581b1e87971c4c96a0d781378acad549a4d0d8b (plain)
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