X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FL2Util.py;h=4832ffac1c1e9bd09626d75033c20a8e2bdd7f9b;hp=e44a6b360aa43dad89b9c61d43f2cf78bd2afa6e;hb=7c3e0cc41f55327d6eeb04fe757c6e80064ab28a;hpb=6000b2abc3d6b8bb8ff2941aacf005a04a33be60 diff --git a/resources/libraries/python/L2Util.py b/resources/libraries/python/L2Util.py index e44a6b360a..4832ffac1c 100644 --- a/resources/libraries/python/L2Util.py +++ b/resources/libraries/python/L2Util.py @@ -211,6 +211,8 @@ class L2Util(object): exec_cmd_no_error(node, cmd, sudo=True) cmd = 'brctl addif {0} {1}'.format(br_name, if_2) exec_cmd_no_error(node, cmd, sudo=True) + cmd = 'ip link set dev {0} up'.format(br_name) + exec_cmd_no_error(node, cmd, sudo=True) @staticmethod def setup_network_namespace(node, namespace_name, interface_name, @@ -280,30 +282,115 @@ class L2Util(object): return data @staticmethod - def l2_tag_rewrite(node, interface, tag_rewrite_method, tag1_id=None): - """Rewrite tags in frame. + def l2_vlan_tag_rewrite(node, interface, tag_rewrite_method, + push_dot1q=True, tag1_id=None, tag2_id=None): + """Rewrite tags in ethernet frame. :param node: Node to rewrite tags. :param interface: Interface on which rewrite tags. :param tag_rewrite_method: Method of tag rewrite. + :param push_dot1q: Optional parameter to disable to push dot1q tag + instead of dot1ad. :param tag1_id: Optional tag1 ID for VLAN. + :param tag2_id: Optional tag2 ID for VLAN. :type node: dict :type interface: str or int - :type tag_rewrite_method : str + :type tag_rewrite_method: str + :type push_dot1q: bool :type tag1_id: int + :type tag2_id: int """ - if tag1_id is None: - tag1_id = '' - else: - tag1_id = 'tag1 {0}'.format(tag1_id) + push_dot1q = 'push_dot1q 0' if not push_dot1q else '' + + tag1_id = 'tag1 {0}'.format(tag1_id) if tag1_id else '' + tag2_id = 'tag2 {0}'.format(tag2_id) if tag2_id else '' + if isinstance(interface, basestring): - sw_if_index = Topology.get_interface_sw_index(node, interface) + iface_key = Topology.get_interface_by_name(node, interface) + sw_if_index = Topology.get_interface_sw_index(node, iface_key) else: sw_if_index = interface with VatTerminal(node) as vat: - vat.vat_terminal_exec_cmd_from_template("l2_tag_rewrite.vat", + vat.vat_terminal_exec_cmd_from_template("l2_vlan_tag_rewrite.vat", sw_if_index=sw_if_index, tag_rewrite_method= tag_rewrite_method, - tag1_optional=tag1_id) + push_dot1q=push_dot1q, + tag1_optional=tag1_id, + tag2_optional=tag2_id) + + @staticmethod + def delete_bridge_domain_vat(node, bd_id): + """Delete the specified bridge domain from the node. + + :param node: VPP node to delete a bridge domain from. + :param bd_id: Bridge domain ID. + :type node: dict + :type bd_id: int + """ + + with VatTerminal(node) as vat: + vat.vat_terminal_exec_cmd_from_template( + "l2_bridge_domain_delete.vat", bd_id=bd_id) + + @staticmethod + def delete_l2_fib_entry(node, bd_id, mac): + """Delete the specified L2 FIB entry. + + :param node: VPP node. + :param bd_id: Bridge domain ID. + :param mac: MAC address used as the key in L2 FIB entry. + :type node: dict + :type bd_id: int + :type mac: str + """ + + with VatTerminal(node) as vat: + vat.vat_terminal_exec_cmd_from_template("l2_fib_entry_delete.vat", + mac=mac, + bd_id=bd_id) + + @staticmethod + def get_l2_fib_table_vat(node, bd_index): + """Retrieves the L2 FIB table using VAT. + + :param node: VPP node. + :param bd_index: Index of the bridge domain. + :type node: dict + :type bd_index: int + :return: L2 FIB table. + :rtype: list + """ + + bd_data = L2Util.vpp_get_bridge_domain_data(node) + bd_id = bd_data[bd_index-1]["bd_id"] + + try: + with VatTerminal(node) as vat: + table = vat.vat_terminal_exec_cmd_from_template( + "l2_fib_table_dump.vat", bd_id=bd_id) + + return table[0] + except ValueError: + return [] + + @staticmethod + def get_l2_fib_entry_vat(node, bd_index, mac): + """Retrieves the L2 FIB entry specified by MAC address using VAT. + + :param node: VPP node. + :param bd_index: Index of the bridge domain. + :param mac: MAC address used as the key in L2 FIB data structure. + :type node: dict + :type bd_index: int + :type mac: str + :return: L2 FIB entry + :rtype: dict + """ + + table = L2Util.get_l2_fib_table_vat(node, bd_index) + for entry in table: + if entry["mac"] == mac: + return entry + return {}