CSIT-1291 Improve service handling with container detection
[csit.git] / resources / libraries / python / VPPUtil.py
index 3a0148a..de3caad 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-"""VPP util library"""
-from resources.libraries.python.ssh import SSH
+"""VPP util library."""
+from resources.libraries.python.constants import Constants
+from resources.libraries.python.DUTSetup import DUTSetup
+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):
@@ -42,10 +46,30 @@ class VPPUtil(object):
         if additional_cmds:
             for cmd in additional_cmds:
                 def_setting_tb_displayed['Custom Setting: {}'.format(cmd)] = cmd
-        ssh = SSH()
-        ssh.connect(node)
-        for _, value in def_setting_tb_displayed.items():
-            ssh.exec_command_sudo('vppctl sh {}'.format(value))
+
+        for _, cmd in def_setting_tb_displayed.items():
+            command = 'vppctl sh {cmd}'.format(cmd=cmd)
+            exec_cmd_no_error(node, command, timeout=30, sudo=True)
+
+    @staticmethod
+    def start_vpp_service(node):
+        """Start VPP service on the specified node.
+
+        :param node: VPP node.
+        :type node: dict
+        :raises RuntimeError: If VPP service fails to start.
+        """
+        DUTSetup.start_service(node, Constants.VPP_UNIT)
+        DUTSetup.get_service_logs(node, Constants.VPP_UNIT)
+
+    @staticmethod
+    def start_vpp_service_on_all_duts(nodes):
+        """Start up the VPP service on all nodes.
+
+        :param nodes: Nodes in the topology.
+        :type nodes: dict
+        """
+        DUTSetup.start_service_on_all_duts(nodes, Constants.VPP_UNIT)
 
     @staticmethod
     def stop_vpp_service(node):
@@ -53,28 +77,128 @@ class VPPUtil(object):
 
         :param node: VPP node.
         :type node: dict
-        :raises RuntimeError: If VPP fails to stop.
+        :raises RuntimeError: If VPP service fails to stop.
+        """
+        DUTSetup.stop_service(node, Constants.VPP_UNIT)
+
+    @staticmethod
+    def verify_vpp_on_dut(node):
+        """Verify that VPP is installed on DUT node.
+
+        :param node: DUT node.
+        :type node: dict
+        :raises RuntimeError: If failed to restart VPP, get VPP version
+            or get VPP interfaces.
         """
+        VPPUtil.vpp_show_version_verbose(node)
+        VPPUtil.vpp_show_interfaces(node)
 
-        ssh = SSH()
-        ssh.connect(node)
-        cmd = "service vpp stop"
-        ret_code, _, _ = ssh.exec_command_sudo(cmd, timeout=80)
-        if int(ret_code) != 0:
-            raise RuntimeError("VPP service did not shut down gracefully.")
+    @staticmethod
+    def verify_vpp_on_all_duts(nodes):
+        """Verify that VPP is installed on all DUT nodes.
+
+        :param nodes: Nodes in the topology.
+        :type nodes: dict
+        """
+        for node in nodes.values():
+            if node['type'] == NodeType.DUT:
+                DUTSetup.start_service(node, Constants.VPP_UNIT)
+                VPPUtil.vpp_show_version_verbose(node)
+                VPPUtil.vpp_show_interfaces(node)
 
     @staticmethod
-    def start_vpp_service(node):
-        """start VPP service on the specified node.
+    def vpp_show_version_verbose(node):
+        """Run "show version verbose" CLI command.
 
-        :param node: VPP node.
+        :param node: Node to run command on.
+        :type node: dict
+        """
+        vat = VatExecutor()
+        vat.execute_script("show_version_verbose.vat", node, json_out=False)
+
+        try:
+            vat.script_should_have_passed()
+        except AssertionError:
+            raise RuntimeError('Failed to get VPP version on host: {name}'.
+                               format(name=node['host']))
+
+    @staticmethod
+    def show_vpp_version_on_all_duts(nodes):
+        """Show VPP version verbose on all DUTs.
+
+        :param nodes: VPP nodes.
+        :type nodes: dict
+        """
+        for node in nodes.values():
+            if node['type'] == NodeType.DUT:
+                VPPUtil.vpp_show_version_verbose(node)
+
+    @staticmethod
+    def vpp_show_interfaces(node):
+        """Run "show interface" CLI command.
+
+        :param node: Node to run command on.
+        :type node: dict
+        """
+        vat = VatExecutor()
+        vat.execute_script("show_interface.vat", node, json_out=False)
+
+        try:
+            vat.script_should_have_passed()
+        except AssertionError:
+            raise RuntimeError('Failed to get VPP interfaces on host: {name}'.
+                               format(name=node['host']))
+
+    @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)
+
+    @staticmethod
+    def vpp_api_trace_dump(node):
+        """Run "api trace custom-dump" CLI command.
+
+        :param node: Node to run command on.
+        :type node: dict
+        """
+        vat = VatExecutor()
+        vat.execute_script("api_trace_dump.vat", node, json_out=False)
+
+    @staticmethod
+    def vpp_api_trace_save(node):
+        """Run "api trace save" CLI command.
+
+        :param node: Node to run command on.
+        :type node: dict
+        """
+        vat = VatExecutor()
+        vat.execute_script("api_trace_save.vat", node, json_out=False)
+
+    @staticmethod
+    def vpp_enable_traces_on_dut(node):
+        """Enable vpp packet traces on the DUT node.
+
+        :param node: DUT node to set up.
         :type node: dict
-        :raises RuntimeError: If VPP fails to start.
         """
+        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)
 
-        ssh = SSH()
-        ssh.connect(node)
-        cmd = "service vpp start"
-        ret_code, _, _ = ssh.exec_command_sudo(cmd)
-        if int(ret_code) != 0:
-            raise RuntimeError("VPP service did not start.")
+    @staticmethod
+    def vpp_enable_traces_on_all_duts(nodes):
+        """Enable vpp packet traces on all DUTs in the given topology.
+
+        :param nodes: Nodes in the topology.
+        :type nodes: dict
+        """
+        for node in nodes.values():
+            if node['type'] == NodeType.DUT:
+                VPPUtil.vpp_enable_traces_on_dut(node)