X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FVPPUtil.py;h=8744dc0154a521d1363e6c5cd2ac27ea97a0d30b;hb=e08706e85b412b1307df3789fdbe747b43c2bd95;hp=d3ab54766ccc8c8445073c280bbdc1516239f6dd;hpb=bb33f1d16f1451253f942da0c55cdea72e71c398;p=csit.git diff --git a/resources/libraries/python/VPPUtil.py b/resources/libraries/python/VPPUtil.py index d3ab54766c..8744dc0154 100644 --- a/resources/libraries/python/VPPUtil.py +++ b/resources/libraries/python/VPPUtil.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Cisco and/or its affiliates. +# Copyright (c) 2020 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -19,7 +19,7 @@ from resources.libraries.python.Constants import Constants from resources.libraries.python.DUTSetup import DUTSetup 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.topology import Topology, SocketType, NodeType class VPPUtil: @@ -55,13 +55,20 @@ class VPPUtil: exec_cmd_no_error(node, command, timeout=30, sudo=True) @staticmethod - def restart_vpp_service(node): + def restart_vpp_service(node, node_key=None): """Restart VPP service on the specified topology node. :param node: Topology node. + :param node_key: Topology node key. :type node: dict + :type node_key: str """ DUTSetup.restart_service(node, Constants.VPP_UNIT) + if node_key: + Topology.add_new_socket( + node, SocketType.PAPI, node_key, Constants.SOCKSVR_PATH) + Topology.add_new_socket( + node, SocketType.STATS, node_key, Constants.SOCKSTAT_PATH) @staticmethod def restart_vpp_service_on_all_duts(nodes): @@ -70,18 +77,23 @@ class VPPUtil: :param nodes: Topology nodes. :type nodes: dict """ - for node in nodes.values(): + for node_key, node in nodes.items(): if node[u"type"] == NodeType.DUT: - VPPUtil.restart_vpp_service(node) + VPPUtil.restart_vpp_service(node, node_key) @staticmethod - def stop_vpp_service(node): + def stop_vpp_service(node, node_key=None): """Stop VPP service on the specified topology node. :param node: Topology node. + :param node_key: Topology node key. :type node: dict + :type node_key: str """ DUTSetup.stop_service(node, Constants.VPP_UNIT) + if node_key: + Topology.del_node_socket_id(node, SocketType.PAPI, node_key) + Topology.del_node_socket_id(node, SocketType.STATS, node_key) @staticmethod def stop_vpp_service_on_all_duts(nodes): @@ -90,9 +102,9 @@ class VPPUtil: :param nodes: Topology nodes. :type nodes: dict """ - for node in nodes.values(): + for node_key, node in nodes.items(): if node[u"type"] == NodeType.DUT: - VPPUtil.stop_vpp_service(node) + VPPUtil.stop_vpp_service(node, node_key) @staticmethod def verify_vpp_installed(node): @@ -101,8 +113,19 @@ class VPPUtil: :param node: Topology node. :type node: dict """ - cmd = u"command -v vpp" - exec_cmd_no_error(node, cmd, message=u"VPP is not installed!") + DUTSetup.verify_program_installed(node, u"vpp") + + @staticmethod + def adjust_privileges(node): + """Adjust privileges to control VPP without sudo. + + :param node: Topology node. + :type node: dict + """ + cmd = u"chmod -R o+rwx /run/vpp" + exec_cmd_no_error( + node, cmd, sudo=True, message=u"Failed to adjust privileges!", + retries=120) @staticmethod def verify_vpp_started(node): @@ -111,12 +134,12 @@ class VPPUtil: :param node: Topology node. :type node: dict """ - cmd = u"echo \"show ver\" | sudo socat - UNIX-CONNECT:/run/vpp/cli.sock" + cmd = u"echo \"show pci\" | sudo socat - UNIX-CONNECT:/run/vpp/cli.sock" exec_cmd_no_error( node, cmd, sudo=False, message=u"VPP failed to start!", retries=120 ) - cmd = u"vppctl show ver 2>&1 | fgrep -v \"Connection refused\" | " \ + cmd = u"vppctl show pci 2>&1 | fgrep -v \"Connection refused\" | " \ u"fgrep -v \"No such file or directory\"" exec_cmd_no_error( node, cmd, sudo=True, message=u"VPP failed to start!", retries=120 @@ -125,16 +148,18 @@ class VPPUtil: @staticmethod def verify_vpp(node): """Verify that VPP is installed and started on the specified topology - node. + node. Adjust privileges so user can connect without sudo. :param node: Topology node. :type node: dict :raises RuntimeError: If VPP service fails to start. """ - VPPUtil.verify_vpp_installed(node) + DUTSetup.verify_program_installed(node, 'vpp') try: # Verify responsiveness of vppctl. VPPUtil.verify_vpp_started(node) + # Adjust privileges. + VPPUtil.adjust_privileges(node) # Verify responsiveness of PAPI. VPPUtil.show_log(node) VPPUtil.vpp_show_version(node) @@ -227,7 +252,7 @@ class VPPUtil: for cmd in cmds: try: - PapiSocketExecutor.run_cli_cmd(node, cmd) + PapiSocketExecutor.run_cli_cmd_on_all_sockets(node, cmd) except AssertionError: if fail_on_error: raise @@ -253,7 +278,8 @@ class VPPUtil: :param node: Topology node. :type node: dict """ - PapiSocketExecutor.run_cli_cmd(node, "elog trace api cli barrier") + PapiSocketExecutor.run_cli_cmd_on_all_sockets( + node, u"elog trace api cli barrier") @staticmethod def vpp_enable_elog_traces_on_all_duts(nodes): @@ -273,7 +299,8 @@ class VPPUtil: :param node: Topology node. :type node: dict """ - PapiSocketExecutor.run_cli_cmd(node, u"show event-logger") + PapiSocketExecutor.run_cli_cmd_on_all_sockets( + node, u"show event-logger") @staticmethod def show_event_logger_on_all_duts(nodes): @@ -319,15 +346,7 @@ class VPPUtil: with PapiSocketExecutor(node) as papi_exec: reply = papi_exec.add(cmd).get_reply() - threads_data = list() - for thread in reply[u"thread_data"]: - thread_data = list() - for item in thread: - if isinstance(item, str): - item = item.rstrip('\x00') - thread_data.append(item) - threads_data.append(thread_data) - + threads_data = reply[u"thread_data"] logger.trace(f"show threads:\n{threads_data}") return threads_data