X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FInterfaceUtil.py;h=2e44e913aa1ae3e5acb33a9391332ab0d49be22a;hb=b037f5f0f010ebe3d1cf49ff4966733897bac814;hp=1c1ada8f6c300835d0386c23bfd141c8cb9e92cf;hpb=95bf11e637855dc91e490f526406fa7538a21ac6;p=csit.git diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py index 1c1ada8f6c..2e44e913aa 100644 --- a/resources/libraries/python/InterfaceUtil.py +++ b/resources/libraries/python/InterfaceUtil.py @@ -32,19 +32,36 @@ class InterfaceUtil(object): __UDEV_IF_RULES_FILE = '/etc/udev/rules.d/10-network.rules' @staticmethod - def set_interface_state(node, interface, state): + def set_interface_state(node, interface, state, if_type="key"): """Set interface state on a node. Function can be used for DUTs as well as for TGs. :param node: Node where the interface is. - :param interface: Interface name or sw_if_index. + :param interface: Interface key or sw_if_index or name. :param state: One of 'up' or 'down'. + :param if_type: Interface type :type node: dict :type interface: str or int :type state: str + :type if_type: str :return: nothing """ + + if if_type == "key": + if isinstance(interface, basestring): + sw_if_index = Topology.get_interface_sw_index(node, interface) + iface_name = Topology.get_interface_name(node, interface) + else: + sw_if_index = interface + elif if_type == "name": + iface_key = Topology.get_interface_by_name(node, interface) + if iface_key is not None: + sw_if_index = Topology.get_interface_sw_index(node, iface_key) + iface_name = interface + else: + raise ValueError("if_type unknown: {}".format(if_type)) + if node['type'] == NodeType.DUT: if state == 'up': state = 'admin-up' @@ -52,33 +69,26 @@ class InterfaceUtil(object): state = 'admin-down' else: raise ValueError('Unexpected interface state: {}'.format(state)) - - if isinstance(interface, basestring): - sw_if_index = Topology.get_interface_sw_index(node, interface) - else: - sw_if_index = interface - VatExecutor.cmd_from_template(node, 'set_if_state.vat', sw_if_index=sw_if_index, state=state) - elif node['type'] == NodeType.TG or node['type'] == NodeType.VM: - cmd = 'ip link set {} {}'.format(interface, state) + cmd = 'ip link set {} {}'.format(iface_name, state) exec_cmd_no_error(node, cmd, sudo=True) else: raise Exception('Node {} has unknown NodeType: "{}"'. format(node['host'], node['type'])) @staticmethod - def set_interface_ethernet_mtu(node, interface, mtu): + def set_interface_ethernet_mtu(node, iface_key, mtu): """Set Ethernet MTU for specified interface. Function can be used only for TGs. :param node: Node where the interface is. - :param interface: Interface name. + :param interface: Interface key from topology file. :param mtu: MTU to set. :type node: dict - :type interface: str + :type iface_key: str :type mtu: int :return: nothing """ @@ -86,7 +96,8 @@ class InterfaceUtil(object): ValueError('Node {}: Setting Ethernet MTU for interface ' 'on DUT nodes not supported', node['host']) elif node['type'] == NodeType.TG: - cmd = 'ip link set {} mtu {}'.format(interface, mtu) + iface_name = Topology.get_interface_name(node, iface_key) + cmd = 'ip link set {} mtu {}'.format(iface_name, mtu) exec_cmd_no_error(node, cmd, sudo=True) else: raise ValueError('Node {} has unknown NodeType: "{}"'. @@ -102,8 +113,8 @@ class InterfaceUtil(object): :type node: dict :return: nothing """ - for ifc in node['interfaces'].values(): - InterfaceUtil.set_interface_ethernet_mtu(node, ifc['name'], 1500) + for ifc in node['interfaces']: + InterfaceUtil.set_interface_ethernet_mtu(node, ifc, 1500) @staticmethod def vpp_node_interfaces_ready_wait(node, timeout=10): @@ -190,15 +201,15 @@ class InterfaceUtil(object): if interface is not None: if isinstance(interface, basestring): - sw_if_index = Topology.get_interface_sw_index(node, interface) + param = "interface_name" + elif isinstance(interface, int): + param = "sw_if_index" else: - sw_if_index = interface - + raise TypeError for data_if in data: - if data_if["sw_if_index"] == sw_if_index: - + if data_if[param] == interface: return data_if - + return dict() return data @staticmethod @@ -216,7 +227,7 @@ class InterfaceUtil(object): Note: A single interface may have multiple IP addresses assigned. :rtype: list """ - sw_if_index = Topology.get_interface_sw_index(node, interface) + sw_if_index = InterfaceUtil.get_sw_if_index(node, interface) with VatTerminal(node) as vat: response = vat.vat_terminal_exec_cmd_from_template( @@ -444,7 +455,8 @@ class InterfaceUtil(object): :return: Name and index of created subinterface. :rtype: tuple """ - 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) output = VatExecutor.cmd_from_template(node, "create_vlan_subif.vat", sw_if_index=sw_if_index, @@ -490,7 +502,7 @@ class InterfaceUtil(object): if output["retval"] == 0: return output["sw_if_index"] else: - raise RuntimeError('Unable to create VXLAN interface on node {}' + raise RuntimeError('Unable to create VXLAN interface on node {0}' .format(node)) @staticmethod @@ -504,7 +516,7 @@ class InterfaceUtil(object): :type interface: int or str :return: Dictionary containing data for the given VxLAN interface or if interface=None, the list of dictionaries with all VxLAN interfaces. - :rtype dict or list + :rtype: dict or list """ param = "sw_if_index" if interface is None: @@ -543,6 +555,30 @@ class InterfaceUtil(object): return response[0] + @staticmethod + def tap_dump(node, name=None): + """Get all TAP interface data from the given node, or data about + a specific TAP interface. + + :param node: VPP node to get data from. + :param name: Optional name of a specific TAP interface. + :type node: dict + :type name: str + :return: Dictionary of information about a specific TAP interface, or + a List of dictionaries containing all TAP data for the given node. + :rtype: dict or list + """ + with VatTerminal(node) as vat: + response = vat.vat_terminal_exec_cmd_from_template( + "tap_dump.vat") + if name is None: + return response[0] + else: + for item in response[0]: + if name == item['dev_name']: + return item + return {} + @staticmethod def create_subinterface(node, interface, sub_id, outer_vlan_id, inner_vlan_id, type_subif): @@ -662,3 +698,72 @@ class InterfaceUtil(object): sw_if_index=sw_if_index, ip_version=ip_version, table_index=table_index) + + @staticmethod + def get_sw_if_index(node, interface_name): + """Get sw_if_index for the given interface from actual interface dump. + + :param node: VPP node to get interface data from. + :param interface_name: Name of the specific interface. + :type node: dict + :type interface_name: str + :return: sw_if_index of the given interface. + :rtype: str + """ + + with VatTerminal(node) as vat: + if_data = vat.vat_terminal_exec_cmd_from_template( + "interface_dump.vat") + for interface in if_data[0]: + if interface["interface_name"] == interface_name: + return interface["sw_if_index"] + + return None + + @staticmethod + def vxlan_gpe_dump(node, interface_name=None): + """Get VxLAN GPE data for the given interface. + + :param node: VPP node to get interface data from. + :param interface_name: Name of the specific interface. If None, + information about all VxLAN GPE interfaces is returned. + :type node: dict + :type interface_name: str + :return: Dictionary containing data for the given VxLAN GPE interface or + if interface=None, the list of dictionaries with all VxLAN GPE + interfaces. + :rtype: dict or list + """ + + with VatTerminal(node) as vat: + vxlan_gpe_data = vat.vat_terminal_exec_cmd_from_template( + "vxlan_gpe_dump.vat") + + if interface_name: + sw_if_index = InterfaceUtil.get_sw_if_index(node, interface_name) + if sw_if_index: + for vxlan_gpe in vxlan_gpe_data[0]: + if vxlan_gpe["sw_if_index"] == sw_if_index: + return vxlan_gpe + return {} + + return vxlan_gpe_data[0] + + @staticmethod + def vpp_proxy_arp_interface_enable(node, interface): + """Enable proxy ARP on interface. + + :param node: VPP node to enable proxy ARP on interface. + :param interface: Interface to enable proxy ARP. + :type node: dict + :type interface: str or int + """ + if isinstance(interface, basestring): + sw_if_index = InterfaceUtil.get_sw_if_index(node, interface) + else: + sw_if_index = interface + + with VatTerminal(node) as vat: + vat.vat_terminal_exec_cmd_from_template( + "proxy_arp_intfc_enable.vat", + sw_if_index=sw_if_index)