From e300d155302d493e0f4cf36b20081a1653909521 Mon Sep 17 00:00:00 2001 From: selias Date: Wed, 6 Apr 2016 16:49:15 +0200 Subject: [PATCH] Add keywords for Honeycomb tests -add interface dump and bridge-domain dump to Vat command templates -add low level keywords to implement vat dump commands The resulting data dumps will be used in Honeycomb testing, to verify data retrieved through Honeycomb API. Change-Id: I2a913eaf23aa13d7223576220681821007672812 Signed-off-by: selias --- resources/libraries/python/InterfaceUtil.py | 71 +++++++++++++++++++++-------- resources/libraries/python/L2Util.py | 27 +++++++++++ resources/templates/vat/interface_dump.vat | 1 + resources/templates/vat/l2_bd_dump.vat | 1 + 4 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 resources/templates/vat/interface_dump.vat create mode 100644 resources/templates/vat/l2_bd_dump.vat diff --git a/resources/libraries/python/InterfaceUtil.py b/resources/libraries/python/InterfaceUtil.py index 58af5aad75..25503c08df 100644 --- a/resources/libraries/python/InterfaceUtil.py +++ b/resources/libraries/python/InterfaceUtil.py @@ -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 diff --git a/resources/libraries/python/L2Util.py b/resources/libraries/python/L2Util.py index 0d34ce3e41..724ec0cdce 100644 --- a/resources/libraries/python/L2Util.py +++ b/resources/libraries/python/L2Util.py @@ -18,6 +18,7 @@ from resources.libraries.python.topology import Topology from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal from resources.libraries.python.ssh import exec_cmd_no_error + class L2Util(object): """Utilities for l2 configuration""" @@ -218,3 +219,29 @@ class L2Util(object): """ cmd = 'brctl delbr {0}'.format(br_name) exec_cmd_no_error(node, cmd, sudo=True) + + @staticmethod + def vpp_get_bridge_domain_data(node, bd_id=None): + """Get all bridge domain data from a VPP node. If a domain ID number is + provided, return only data for the matching bridge domain. + + :param node: VPP node to get bridge domain data from. + :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. + :rtype: list or dict + """ + with VatTerminal(node) as vat: + response = vat.vat_terminal_exec_cmd_from_template("l2_bd_dump.vat") + + data = response[0] + + if bd_id is not None: + for bridge_domain in data: + if bridge_domain["bd_id"] == bd_id: + + return bridge_domain + + return data diff --git a/resources/templates/vat/interface_dump.vat b/resources/templates/vat/interface_dump.vat new file mode 100644 index 0000000000..850c348f69 --- /dev/null +++ b/resources/templates/vat/interface_dump.vat @@ -0,0 +1 @@ +sw_interface_dump diff --git a/resources/templates/vat/l2_bd_dump.vat b/resources/templates/vat/l2_bd_dump.vat new file mode 100644 index 0000000000..6d0b9d0778 --- /dev/null +++ b/resources/templates/vat/l2_bd_dump.vat @@ -0,0 +1 @@ +bridge_domain_dump -- 2.16.6