diff options
author | Vratko Polak <vrpolak@cisco.com> | 2020-12-15 13:39:56 +0100 |
---|---|---|
committer | Vratko Polak <vrpolak@cisco.com> | 2020-12-17 12:28:57 +0000 |
commit | a33b52ae0f255021d89307ebc694f6e907906151 (patch) | |
tree | 133f7cc93cd5475d211982c952244e96a223ba59 /resources/libraries/python/VPPUtil.py | |
parent | 37877d670e7e2d81673222b6c3d9e7649ccd5cd5 (diff) |
PAPI: Cache connected client instances
Disconnect+connect cycle is expensive and slow.
This change tracks connected client instances
so later "connect" to the same target uses it.
Explicit disconnects are allowed (and executed before VPP ends),
but once again disconnected instances are cached and reused,
as creating a new instance is more expensive than just connect.
+ Add missing checks on interfaces being up to appropriate keyword.
+ Use appropriate keywords.
+ Add a comment explaining why a simpler keyword is not appropriate.
+ Improve VPP checks in containers.
+ Fix the vppctl check to actually work.
+ Add PAPI check to ensure VPP is really ready.
+ Delay/reorder checks to make them faster with multiple containers.
+ Leave some TODOs to improve various lifecycles later.
+ As we do not stop VPP in test/suite teardown:
+ One final disconnect is needed, added to __init__.robot teardowns.
- Import of the final disconnect keyword is ugly, but it works.
- We could use a hashable class for distinguishing node+socket pairs.
- Are we connecting to VPP inside VMs?
Change-Id: I49cd726740c3e8cae1591c7c84b85a447241228f
Signed-off-by: Vratko Polak <vrpolak@cisco.com>
Diffstat (limited to 'resources/libraries/python/VPPUtil.py')
-rw-r--r-- | resources/libraries/python/VPPUtil.py | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/resources/libraries/python/VPPUtil.py b/resources/libraries/python/VPPUtil.py index a7ec44c974..17043aa599 100644 --- a/resources/libraries/python/VPPUtil.py +++ b/resources/libraries/python/VPPUtil.py @@ -58,11 +58,15 @@ class VPPUtil: def restart_vpp_service(node, node_key=None): """Restart VPP service on the specified topology node. + Disconnect possibly connected PAPI executor. + :param node: Topology node. :param node_key: Topology node key. :type node: dict :type node_key: str """ + # Containers have a separate lifecycle, but better be safe. + PapiSocketExecutor.disconnect_all_sockets_by_node(node) DUTSetup.restart_service(node, Constants.VPP_UNIT) if node_key: Topology.add_new_socket( @@ -85,11 +89,15 @@ class VPPUtil: def stop_vpp_service(node, node_key=None): """Stop VPP service on the specified topology node. + Disconnect possibly connected PAPI executor. + :param node: Topology node. :param node_key: Topology node key. :type node: dict :type node_key: str """ + # Containers have a separate lifecycle, but better be safe. + PapiSocketExecutor.disconnect_all_sockets_by_node(node) DUTSetup.stop_service(node, Constants.VPP_UNIT) if node_key: Topology.del_node_socket_id(node, SocketType.PAPI, node_key) @@ -184,18 +192,28 @@ class VPPUtil: VPPUtil.verify_vpp(node) @staticmethod - def vpp_show_version(node): + def vpp_show_version( + node, remote_vpp_socket=Constants.SOCKSVR_PATH, log=True): """Run "show_version" PAPI command. + Socket is configurable, so VPP inside container can be accessed. + :param node: Node to run command on. + :param remote_vpp_socket: Path to remote socket to target VPP. + :param log: If true, show the result in Robot log. :type node: dict + :type remote_vpp_socket: str + :type log: bool :returns: VPP version. :rtype: str + :raises RuntimeError: If PAPI connection fails. + :raises AssertionError: If PAPI retcode is nonzero. """ cmd = u"show_version" - with PapiSocketExecutor(node) as papi_exec: + with PapiSocketExecutor(node, remote_vpp_socket) as papi_exec: reply = papi_exec.add(cmd).get_reply() - logger.info(f"VPP version: {reply[u'version']}\n") + if log: + logger.info(f"VPP version: {reply[u'version']}\n") return f"{reply[u'version']}" @staticmethod |