X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FL2Util.py;h=2acb6dba34c2a71a9703b59e020322261813b081;hp=af4735fdf8187bdf815144dac936583e3c6d2a7e;hb=ac6cc22910ea0d3bda42c227d799f2d4e89bc9d0;hpb=f7feaf7804f267c9d7880917f6baf9d1bdb21584 diff --git a/resources/libraries/python/L2Util.py b/resources/libraries/python/L2Util.py index af4735fdf8..2acb6dba34 100644 --- a/resources/libraries/python/L2Util.py +++ b/resources/libraries/python/L2Util.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2018 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: @@ -13,6 +13,8 @@ """L2 Utilities Library.""" +from textwrap import wrap + from robot.api.deco import keyword from resources.libraries.python.topology import Topology @@ -23,6 +25,30 @@ from resources.libraries.python.ssh import exec_cmd_no_error class L2Util(object): """Utilities for l2 configuration.""" + @staticmethod + def mac_to_int(mac_str): + """Convert MAC address from string format (e.g. 01:02:03:04:05:06) to + integer representation (1108152157446). + + :param mac_str: MAC address in string representation. + :type mac_str: str + :returns: Integer representation of MAC address. + :rtype: int + """ + return int(mac_str.replace(':', ''), 16) + + @staticmethod + def int_to_mac(mac_int): + """Convert MAC address from integer representation (e.g. 1108152157446) + to string format (01:02:03:04:05:06). + + :param mac_int: MAC address in integer representation. + :type mac_int: str + :returns: String representation of MAC address. + :rtype: int + """ + return ':'.join(wrap("{:012x}".format(mac_int), width=2)) + @staticmethod def vpp_add_l2fib_entry(node, mac, interface, bd_id): """ Create a static L2FIB entry on a vpp node. @@ -66,7 +92,7 @@ class L2Util(object): :type uu_flood: bool :type forward: bool :type learn: bool - :type arp_term:bool + :type arp_term: bool """ VatExecutor.cmd_from_template(node, "l2_bd_create.vat", bd_id=bd_id, flood=flood, @@ -106,7 +132,6 @@ class L2Util(object): :type sw_if_index: int :type bd_id: int :type shg: int - :return: """ VatExecutor.cmd_from_template(node, "l2_bd_add_sw_if_index.vat", bd_id=bd_id, sw_if_index=sw_if_index, @@ -125,12 +150,12 @@ class L2Util(object): :param node: Node data dictionary. :param link_names: List of names of links the bridge domain should be - connecting. + 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. + :returns: Dictionary used to generate l2 bridge domain VAT configuration + from template file. :rtype: dict """ bd_dict = Topology().get_interfaces_by_link_names(node, link_names) @@ -192,18 +217,50 @@ class L2Util(object): interface2=sw_iface1) @staticmethod - def linux_add_bridge(node, br_name, if_1, if_2): + def vpp_setup_bidirectional_l2_patch(node, interface1, interface2): + """Create bidirectional l2 patch between 2 interfaces on vpp node. + + :param node: Node to add bidirectional l2 patch. + :param interface1: First interface name or sw_if_index. + :param interface2: Second interface name or sw_if_index. + :type node: dict + :type interface1: str or int + :type interface2: str or int + """ + + if isinstance(interface1, basestring): + sw_iface1 = Topology().get_interface_sw_index(node, interface1) + else: + sw_iface1 = interface1 + + if isinstance(interface2, basestring): + sw_iface2 = Topology().get_interface_sw_index(node, interface2) + else: + sw_iface2 = interface2 + + with VatTerminal(node) as vat: + vat.vat_terminal_exec_cmd_from_template('l2_patch.vat', + interface1=sw_iface1, + interface2=sw_iface2) + vat.vat_terminal_exec_cmd_from_template('l2_patch.vat', + interface1=sw_iface2, + interface2=sw_iface1) + + @staticmethod + def linux_add_bridge(node, br_name, if_1, if_2, set_up=True): """Bridge two interfaces on linux node. :param node: Node to add bridge on. :param br_name: Bridge name. :param if_1: First interface to be added to the bridge. :param if_2: Second interface to be added to the bridge. + :param set_up: Change bridge interface state to up after create bridge. + Optional. Default: True. :type node: dict :type br_name: str :type if_1: str :type if_2: str - + :type set_up: bool """ cmd = 'brctl addbr {0}'.format(br_name) exec_cmd_no_error(node, cmd, sudo=True) @@ -211,45 +268,28 @@ 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) + if set_up: + 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, - ip_address, prefix): - """Setup namespace on given node and attach interface and IP to - this namespace. Applicable also on TG node. - - :param node: Node to set namespace on. - :param namespace_name: Namespace name. - :param interface_name: Interface name. - :param ip_address: IP address of namespace's interface. - :param prefix: IP address prefix length. - :type node: dict - :type namespace_name: str - :type vhost_if: str - :type ip_address: str - :type prefix: int - - """ - cmd = ('ip netns add {0}'.format(namespace_name)) - exec_cmd_no_error(node, cmd, sudo=True) - - cmd = ('ip link set dev {0} up netns {1}'.format(interface_name, - namespace_name)) - exec_cmd_no_error(node, cmd, sudo=True) - - cmd = ('ip netns exec {0} ip addr add {1}/{2} dev {3}'.format( - namespace_name, ip_address, prefix, interface_name)) - exec_cmd_no_error(node, cmd, sudo=True) - - @staticmethod - def linux_del_bridge(node, br_name): + def linux_del_bridge(node, br_name, set_down=True): """Delete bridge from linux node. + ..note:: The network interface corresponding to the bridge must be + down before it can be deleted! + :param node: Node to delete bridge from. :param br_name: Bridge name. - ..note:: The network interface corresponding to the bridge must be - down before it can be deleted! + :param set_down: Change bridge interface state to down before delbr + command. Optional. Default: True. + :type node: str + :type br_name: str + :type set_down: bool """ + if set_down: + cmd = 'ip link set dev {0} down'.format(br_name) + exec_cmd_no_error(node, cmd, sudo=True) cmd = 'brctl delbr {0}'.format(br_name) exec_cmd_no_error(node, cmd, sudo=True) @@ -262,8 +302,8 @@ class L2Util(object): :param bd_id: Numeric ID of a specific bridge domain. :type node: dict :type bd_id: int - :return: List of dictionaries containing data for each bridge domain, or - a single dictionary for the specified bridge domain. + :returns: List of dictionaries containing data for each bridge domain, + or a single dictionary for the specified bridge domain. :rtype: list or dict """ with VatTerminal(node) as vat: @@ -288,7 +328,7 @@ class L2Util(object): :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. + instead of dot1ad. :param tag1_id: Optional tag1 ID for VLAN. :param tag2_id: Optional tag2 ID for VLAN. :type node: dict @@ -357,7 +397,7 @@ class L2Util(object): :param bd_index: Index of the bridge domain. :type node: dict :type bd_index: int - :return: L2 FIB table. + :returns: L2 FIB table. :rtype: list """ @@ -383,7 +423,7 @@ class L2Util(object): :type node: dict :type bd_index: int :type mac: str - :return: L2 FIB entry + :returns: L2 FIB entry :rtype: dict """