X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FInterfaceUtil.py;h=2980afa34972408d81598af8a926074f60aca4e0;hp=a16a02fbe8c5416993dab149a403df391143ca25;hb=eb4515115a69f5a3fe9b2fe178110cc5ff78b73a;hpb=80532e03b9d223407c4b9d2245449dbdc4c03c1b diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py index a16a02fbe8..2980afa349 100644 --- a/resources/libraries/python/InterfaceUtil.py +++ b/resources/libraries/python/InterfaceUtil.py @@ -212,6 +212,31 @@ class InterfaceUtil(object): return dict() return data + @staticmethod + def vpp_get_interface_mac(node, interface=None): + """Get MAC address for the given interface from actual interface dump. + + :param node: VPP node to get interface data from. + :param interface: Numeric index or name string of a specific interface. + :type node: dict + :type interface: int or str + :return: MAC address. + :rtype: str + """ + + if_data = InterfaceUtil.vpp_get_interface_data(node, interface) + if if_data['sup_sw_if_index'] != if_data['sw_if_index']: + if_data = InterfaceUtil.vpp_get_interface_data( + node, if_data['sup_sw_if_index']) + mac_data = [str(hex(item))[2:] for item in if_data['l2_address'][:6]] + mac_data_nice = [] + for item in mac_data: + if len(item) == 1: + item = '0' + item + mac_data_nice.append(item) + mac = ":".join(mac_data_nice) + return mac + @staticmethod def vpp_get_interface_ip_addresses(node, interface, ip_version): """Get list of IP addresses from an interface on a VPP node. @@ -427,21 +452,64 @@ class InterfaceUtil(object): InterfaceUtil.tg_set_interfaces_udev_rules(node) @staticmethod - def update_all_interface_data_on_all_nodes(nodes): + def iface_update_numa_node(node): + """For all interfaces from topology file update numa node based on + information from the node. + + :param node: Node from topology. + :type node: dict + :return: nothing + """ + ssh = SSH() + for if_key in Topology.get_node_interfaces(node): + if_pci = Topology.get_interface_pci_addr(node, if_key) + ssh.connect(node) + cmd = "cat /sys/bus/pci/devices/{}/numa_node".format(if_pci) + for _ in range(3): + (ret, out, _) = ssh.exec_command(cmd) + if ret == 0: + try: + numa_node = int(out) + if numa_node < 0: + raise ValueError + except ValueError: + logger.trace('Reading numa location failed for: {0}'\ + .format(if_pci)) + else: + Topology.set_interface_numa_node(node, if_key, + numa_node) + break + else: + raise RuntimeError('Update numa node failed for: {0}'\ + .format(if_pci)) + + @staticmethod + def update_all_interface_data_on_all_nodes(nodes, skip_tg=False, + numa_node=False): """Update interface names on all nodes in DICT__nodes. This method updates the topology dictionary by querying interface lists of all nodes mentioned in the topology dictionary. :param nodes: Nodes in the topology. + :param skip_tg: Skip TG node + :param numa_node: Retrieve numa_node location. :type nodes: dict + :type skip_tg: bool + :type numa_node: bool """ for node_data in nodes.values(): if node_data['type'] == NodeType.DUT: InterfaceUtil.update_vpp_interface_data_on_node(node_data) - elif node_data['type'] == NodeType.TG: + elif node_data['type'] == NodeType.TG and not skip_tg: InterfaceUtil.update_tg_interface_data_on_node(node_data) + if numa_node: + if node_data['type'] == NodeType.DUT: + InterfaceUtil.iface_update_numa_node(node_data) + elif node_data['type'] == NodeType.TG and not skip_tg: + InterfaceUtil.iface_update_numa_node(node_data) + @staticmethod def create_vlan_subinterface(node, interface, vlan): """Create VLAN subinterface on node. @@ -712,6 +780,29 @@ class InterfaceUtil(object): ip_version=ip_version, table_index=table_index) + @staticmethod + def get_interface_classify_table(node, interface): + """Get name of classify table for the given interface. + + :param node: VPP node to get data from. + :param interface: Name or sw_if_index of a specific interface. + :type node: dict + :type interface: str or int + :return: Classify table name. + :rtype: str + """ + if isinstance(interface, basestring): + sw_if_index = InterfaceUtil.get_sw_if_index(node, interface) + else: + sw_if_index = interface + + with VatTerminal(node) as vat: + data = vat.vat_terminal_exec_cmd_from_template( + "classify_interface_table.vat", + sw_if_index=sw_if_index + ) + return data[0] + @staticmethod def get_sw_if_index(node, interface_name): """Get sw_if_index for the given interface from actual interface dump. @@ -795,22 +886,47 @@ class InterfaceUtil(object): interface_name=interface) @staticmethod - def assign_interface_to_fib_table(node, interface, table_id): + def assign_interface_to_fib_table(node, interface, table_id, ipv6=False): """Assign VPP interface to specific VRF/FIB table. :param node: VPP node where the FIB and interface are located. :param interface: Interface to be assigned to FIB. :param table_id: VRF table ID. + :param ipv6: Assign to IPv6 table. Default False. :type node: dict :type interface: str or int :type table_id: int + :type ipv6: bool """ if isinstance(interface, basestring): sw_if_index = Topology.get_interface_sw_index(node, interface) else: sw_if_index = interface + ipv6 = 'ipv6' if ipv6 else '' + with VatTerminal(node) as vat: vat.vat_terminal_exec_cmd_from_template("set_fib_to_interface.vat", sw_index=sw_if_index, - vrf=table_id) + vrf=table_id, + ipv6=ipv6) + + @staticmethod + def set_linux_interface_mac(node, interface, mac, namespace=None): + """Set MAC address for interface in linux. + + :param node: Node where to execute command. + :param interface: Interface in namespace. + :param mac: MAC to be assigned to interface. + :param namespace: Execute command in namespace. Optional + :type node: dict + :type interface: str + :type mac: str + :type namespace: str + """ + if namespace is not None: + cmd = 'ip netns exec {} ip link set {} address {}'.format( + namespace, interface, mac) + else: + cmd = 'ip link set {} address {}'.format(interface, mac) + exec_cmd_no_error(node, cmd, sudo=True)