X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FInterfaceUtil.py;h=25503c08df66600046f0c16c8716e057b7708bd5;hp=be126503f78fba3fa5849bc6129c00e7ce0eb8c7;hb=e300d155302d493e0f4cf36b20081a1653909521;hpb=be157c8643a2c095d169e3ea78e8db60000189eb diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py index be126503f7..25503c08df 100644 --- a/resources/libraries/python/InterfaceUtil.py +++ b/resources/libraries/python/InterfaceUtil.py @@ -53,7 +53,7 @@ class InterfaceUtil(object): VatExecutor.cmd_from_template(node, 'set_if_state.vat', sw_if_index=sw_if_index, state=state) - elif node['type'] == NodeType.TG: + elif node['type'] == NodeType.TG or node['type'] == NodeType.VM: cmd = 'ip link set {} {}'.format(interface, state) exec_cmd_no_error(node, cmd, sudo=True) else: @@ -108,29 +108,28 @@ class InterfaceUtil(object): :raises: RuntimeError if the timeout period value has elapsed. """ if_ready = False - with VatTerminal(node) as vat: - not_ready = [] - start = time() - while not if_ready: - out = vat.vat_terminal_exec_cmd('sw_interface_dump') - if time() - start > timeout: - for interface in out: - if interface.get('admin_up_down') == 1: - if interface.get('link_up_down') != 1: - logger.debug('{0} link-down'.format( - interface.get('interface_name'))) - raise RuntimeError('timeout, not up {0}'.format(not_ready)) - not_ready = [] + not_ready = [] + start = time() + while not if_ready: + out = InterfaceUtil.vpp_get_interface_data(node) + if time() - start > timeout: for interface in out: if interface.get('admin_up_down') == 1: if interface.get('link_up_down') != 1: - not_ready.append(interface.get('interface_name')) - if not not_ready: - if_ready = True - else: - logger.debug('Interfaces still in link-down state: {0}, ' - 'waiting...'.format(not_ready)) - sleep(1) + logger.debug('{0} link-down'.format( + interface.get('interface_name'))) + raise RuntimeError('timeout, not up {0}'.format(not_ready)) + not_ready = [] + for interface in out: + if interface.get('admin_up_down') == 1: + if interface.get('link_up_down') != 1: + not_ready.append(interface.get('interface_name')) + if not not_ready: + if_ready = True + else: + logger.debug('Interfaces still in link-down state: {0}, ' + 'waiting...'.format(not_ready)) + sleep(1) @staticmethod def vpp_nodes_interfaces_ready_wait(nodes, timeout=10): @@ -160,3 +159,35 @@ class InterfaceUtil(object): for node in nodes.values(): if node['type'] == NodeType.DUT: InterfaceUtil.vpp_node_interfaces_ready_wait(node, timeout) + + @staticmethod + def vpp_get_interface_data(node, interface=None): + """Get all interface data from a VPP node. If a name or + sw_interface_index is provided, return only data for the matching + interface. + :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: List of dictionaries containing data for each interface, or a + single dictionary for the specified interface. + :rtype: list or dict + """ + with VatTerminal(node) as vat: + response = vat.vat_terminal_exec_cmd_from_template( + "interface_dump.vat") + + data = response[0] + + if interface is not None: + if isinstance(interface, basestring): + sw_if_index = Topology.get_interface_sw_index(node, interface) + else: + sw_if_index = interface + + for data_if in data: + if data_if["sw_if_index"] == sw_if_index: + + return data_if + + return data