Add keywords for Honeycomb tests 94/694/12
authorselias <samuel.elias@pantheon.tech>
Wed, 6 Apr 2016 14:49:15 +0000 (16:49 +0200)
committerGerrit Code Review <gerrit@fd.io>
Wed, 13 Apr 2016 13:19:15 +0000 (13:19 +0000)
 -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 <samuel.elias@pantheon.tech>
resources/libraries/python/InterfaceUtil.py
resources/libraries/python/L2Util.py
resources/templates/vat/interface_dump.vat [new file with mode: 0644]
resources/templates/vat/l2_bd_dump.vat [new file with mode: 0644]

index 58af5aa..25503c0 100644 (file)
@@ -108,29 +108,28 @@ class InterfaceUtil(object):
         :raises: RuntimeError if the timeout period value has elapsed.
         """
         if_ready = False
         :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:
                 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):
 
     @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)
         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
index 0d34ce3..724ec0c 100644 (file)
@@ -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
 
 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"""
 
 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)
         """
         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 (file)
index 0000000..850c348
--- /dev/null
@@ -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 (file)
index 0000000..6d0b9d0
--- /dev/null
@@ -0,0 +1 @@
+bridge_domain_dump