Update of VPP_STABLE_VER files
[csit.git] / resources / libraries / python / VPPUtil.py
index 6268e36..432a589 100644 (file)
 
 """VPP util library."""
 
-import binascii
-
 from robot.api import logger
 
 from resources.libraries.python.Constants import Constants
 from resources.libraries.python.DUTSetup import DUTSetup
-from resources.libraries.python.PapiExecutor import PapiExecutor
+from resources.libraries.python.PapiExecutor import PapiSocketExecutor
 from resources.libraries.python.ssh import exec_cmd_no_error
 from resources.libraries.python.topology import NodeType
-from resources.libraries.python.VatExecutor import VatExecutor
 
 
 class VPPUtil(object):
@@ -115,6 +112,10 @@ class VPPUtil(object):
         :param node: Topology node.
         :type node: dict
         """
+        cmd = 'echo "show pci" | sudo socat - UNIX-CONNECT:/run/vpp/cli.sock'
+        exec_cmd_no_error(
+            node, cmd, sudo=False, message='VPP failed to start!', retries=120)
+
         cmd = ('vppctl show pci 2>&1 | '
                'fgrep -v "Connection refused" | '
                'fgrep -v "No such file or directory"')
@@ -136,6 +137,7 @@ class VPPUtil(object):
             VPPUtil.verify_vpp_started(node)
             # Verify responsivness of PAPI.
             VPPUtil.show_log(node)
+            VPPUtil.vpp_show_version(node)
         finally:
             DUTSetup.get_service_logs(node, Constants.VPP_UNIT)
 
@@ -162,18 +164,18 @@ class VPPUtil(object):
         :returns: VPP version.
         :rtype: str
         """
-        with PapiExecutor(node) as papi_exec:
-            data = papi_exec.add('show_version').execute_should_pass().\
-                verify_reply()
-        version = ('VPP version:      {ver}\n'.
-                   format(ver=data['version'].rstrip('\0x00')))
+        cmd = 'show_version'
+        with PapiSocketExecutor(node) as papi_exec:
+            reply = papi_exec.add(cmd).get_reply()
+        return_version = reply['version'].rstrip('\0x00')
+        version = 'VPP version:      {ver}\n'.format(ver=return_version)
         if verbose:
             version += ('Compile date:     {date}\n'
-                        'Compile location: {cl}\n '.
-                        format(date=data['build_date'].rstrip('\0x00'),
-                               cl=data['build_directory'].rstrip('\0x00')))
+                        'Compile location: {cl}\n'.
+                        format(date=reply['build_date'].rstrip('\0x00'),
+                               cl=reply['build_directory'].rstrip('\0x00')))
         logger.info(version)
-        return data['version'].rstrip('\0x00')
+        return return_version
 
     @staticmethod
     def show_vpp_version_on_all_duts(nodes):
@@ -195,61 +197,66 @@ class VPPUtil(object):
         """
 
         cmd = 'sw_interface_dump'
-        cmd_reply = 'sw_interface_details'
-        args = dict(name_filter_valid=0, name_filter='')
+        args = dict(
+            name_filter_valid=False,
+            name_filter=''
+        )
         err_msg = 'Failed to get interface dump on host {host}'.format(
             host=node['host'])
-        with PapiExecutor(node) as papi_exec:
-            papi_resp = papi_exec.add(cmd, **args).execute_should_pass(err_msg)
-
-        papi_if_dump = papi_resp.reply[0]['api_reply']
-
-        if_data = list()
-        for item in papi_if_dump:
-            data = item[cmd_reply]
-            data['interface_name'] = data['interface_name'].rstrip('\x00')
-            data['tag'] = data['tag'].rstrip('\x00')
-            data['l2_address'] = str(':'.join(binascii.hexlify(
-                data['l2_address'])[i:i + 2] for i in range(0, 12, 2)).
-                                     decode('ascii'))
-            if_data.append(data)
+        with PapiSocketExecutor(node) as papi_exec:
+            details = papi_exec.add(cmd, **args).get_details(err_msg)
+
+        for if_dump in details:
+            if_dump['l2_address'] = str(if_dump['l2_address'])
+            if_dump['b_dmac'] = str(if_dump['b_dmac'])
+            if_dump['b_smac'] = str(if_dump['b_smac'])
+            if_dump['flags'] = if_dump['flags'].value
+            if_dump['type'] = if_dump['type'].value
+            if_dump['link_duplex'] = if_dump['link_duplex'].value
+            if_dump['sub_if_flags'] = if_dump['sub_if_flags'].value \
+                if hasattr(if_dump['sub_if_flags'], 'value') \
+                else int(if_dump['sub_if_flags'])
         # TODO: return only base data
-        logger.trace('Interface data of host {host}:\n{if_data}'.format(
-            host=node['host'], if_data=if_data))
-
-    @staticmethod
-    def vpp_show_crypto_device_mapping(node):
-        """Run "show crypto device mapping" CLI command.
-
-        :param node: Node to run command on.
-        :type node: dict
-        """
-        vat = VatExecutor()
-        vat.execute_script("show_crypto_device_mapping.vat", node,
-                           json_out=False)
+        logger.trace('Interface data of host {host}:\n{details}'.format(
+            host=node['host'], details=details))
 
     @staticmethod
-    def vpp_enable_traces_on_dut(node):
+    def vpp_enable_traces_on_dut(node, fail_on_error=False):
         """Enable vpp packet traces on the DUT node.
 
         :param node: DUT node to set up.
+        :param fail_on_error: If True, keyword fails if an error occurs,
+            otherwise passes.
         :type node: dict
+        :type fail_on_error: bool
         """
-        vat = VatExecutor()
-        vat.execute_script("enable_dpdk_traces.vat", node, json_out=False)
-        vat.execute_script("enable_vhost_user_traces.vat", node, json_out=False)
-        vat.execute_script("enable_memif_traces.vat", node, json_out=False)
+        cmds = [
+            "trace add dpdk-input 50",
+            "trace add vhost-user-input 50",
+            "trace add memif-input 50",
+            "trace add avf-input 50"
+        ]
+
+        for cmd in cmds:
+            try:
+                PapiSocketExecutor.run_cli_cmd(node, cmd)
+            except AssertionError:
+                if fail_on_error:
+                    raise
 
     @staticmethod
-    def vpp_enable_traces_on_all_duts(nodes):
+    def vpp_enable_traces_on_all_duts(nodes, fail_on_error=False):
         """Enable vpp packet traces on all DUTs in the given topology.
 
         :param nodes: Nodes in the topology.
+        :param fail_on_error: If True, keyword fails if an error occurs,
+            otherwise passes.
         :type nodes: dict
+        :type fail_on_error: bool
         """
         for node in nodes.values():
             if node['type'] == NodeType.DUT:
-                VPPUtil.vpp_enable_traces_on_dut(node)
+                VPPUtil.vpp_enable_traces_on_dut(node, fail_on_error)
 
     @staticmethod
     def vpp_enable_elog_traces_on_dut(node):
@@ -258,9 +265,7 @@ class VPPUtil(object):
         :param node: DUT node to set up.
         :type node: dict
         """
-        vat = VatExecutor()
-        vat.execute_script("elog_trace_api_cli_barrier.vat", node,
-                           json_out=False)
+        PapiSocketExecutor.run_cli_cmd(node, "elog trace api cli barrier")
 
     @staticmethod
     def vpp_enable_elog_traces_on_all_duts(nodes):
@@ -280,8 +285,7 @@ class VPPUtil(object):
         :param node: DUT node to show traces on.
         :type node: dict
         """
-        vat = VatExecutor()
-        vat.execute_script("show_event_logger.vat", node, json_out=False)
+        PapiSocketExecutor.run_cli_cmd(node, "show event-logger")
 
     @staticmethod
     def show_event_logger_on_all_duts(nodes):
@@ -303,9 +307,7 @@ class VPPUtil(object):
         :returns: VPP log data.
         :rtype: list
         """
-        with PapiExecutor(node) as papi_exec:
-            return papi_exec.add('cli_inband', cmd='show log').get_replies().\
-                verify_reply()["reply"]
+        return PapiSocketExecutor.run_cli_cmd(node, "show log")
 
     @staticmethod
     def vpp_show_threads(node):
@@ -316,6 +318,19 @@ class VPPUtil(object):
         :returns: VPP thread data.
         :rtype: list
         """
-        with PapiExecutor(node) as papi_exec:
-            return papi_exec.add('show_threads').execute_should_pass().\
-                verify_reply()["thread_data"]
+        cmd = 'show_threads'
+        with PapiSocketExecutor(node) as papi_exec:
+            reply = papi_exec.add(cmd).get_reply()
+
+        threads_data = list()
+        for thread in reply["thread_data"]:
+            thread_data = list()
+            for item in thread:
+                if isinstance(item, unicode):
+                    item = item.rstrip('\x00')
+                thread_data.append(item)
+            threads_data.append(thread_data)
+
+        logger.info("show threads:\n{threads}".format(threads=threads_data))
+
+        return threads_data