[v3,09/17] usertools: add new telemetry python script

Message ID 20200421123949.38270-10-ciara.power@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series update and simplify telemetry library. |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Power, Ciara April 21, 2020, 12:39 p.m. UTC
  From: Bruce Richardson <bruce.richardson@intel.com>

This patch adds a python script that can be used with the new telemetry
socket. It connects as a client to the socket, and allows the user send
a command and see the JSON response.

The example usage below shows the script connecting to the new telemetry
socket, and sending two basic ethdev commands entered by the user.
The response for each command is shown below the user input.

Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
{"pid": 63724, "version": "DPDK 20.05.0-rc0", "max_output_len": 16384}
--> /
{"/": ["/", "/ethdev/link_status", "/ethdev/list", "/ethdev/xstats", \
    "/info"]}
--> /info
{"/info": {"pid": 63724, "version": "DPDK 20.05.0-rc0", \
    "max_output_len": 16384}}
--> /ethdev/list
{"/ethdev/list": [0, 1]}
--> /ethdev/link_status,0
{"/ethdev/link_status": {"status": "UP", "speed": 10000, "duplex": \
    "full-duplex"}}
--> /ethdev/xstats,0
{"/ethdev/xstats": {"rx_good_packets": 0, "tx_good_packets": 0, \
    <snip>
    "tx_priority7_xon_to_xoff_packets": 0}}

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: Ciara Power <ciara.power@intel.com>

---
v2:
  - Renamed new python script to dpdk-telemetry.py.
  - Fixed script to validate input before sending to Telemetry.

v3: Added readline support
---
 usertools/dpdk-telemetry.py | 83 +++++++++++++++++++++++++++++++++++++
 usertools/meson.build       |  2 +-
 2 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100755 usertools/dpdk-telemetry.py
  

Patch

diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py
new file mode 100755
index 0000000000..afbf01b196
--- /dev/null
+++ b/usertools/dpdk-telemetry.py
@@ -0,0 +1,83 @@ 
+#! /usr/bin/python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2020 Intel Corporation
+
+"""
+Script to be used with V2 Telemetry.
+Allows the user input commands and read the Telemetry response.
+"""
+
+import socket
+import os
+import glob
+import json
+import readline
+
+# global vars
+TELEMETRY_VERSION = "v2"
+CMDS = []
+
+
+def read_socket(sock, buf_len, echo=True):
+    """ Read data from socket and return it in JSON format """
+    reply = sock.recv(buf_len).decode()
+    try:
+        ret = json.loads(reply)
+    except json.JSONDecodeError:
+        print("Error in reply: ", reply)
+        sock.close()
+        raise
+    if echo:
+        print(json.dumps(ret))
+    return ret
+
+
+def handle_socket(path):
+    """ Connect to socket and handle user input """
+    sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
+    global CMDS
+    print("Connecting to " + path)
+    try:
+        sock.connect(path)
+    except OSError:
+        print("Error connecting to " + path)
+        sock.close()
+        return
+    json_reply = read_socket(sock, 1024)
+    output_buf_len = json_reply["max_output_len"]
+
+    # get list of commands for readline completion
+    sock.send("/".encode())
+    CMDS = read_socket(sock, output_buf_len, False)["/"]
+
+    # interactive prompt
+    text = input('--> ').strip()
+    while text != "quit":
+        if text.startswith('/'):
+            sock.send(text.encode())
+            read_socket(sock, output_buf_len)
+        text = input('--> ').strip()
+    sock.close()
+
+
+def readline_complete(text, state):
+    """ Find any matching commands from the list based on user input """
+    all_cmds = ['quit'] + CMDS
+    if text:
+        matches = [c for c in all_cmds if c.startswith(text)]
+    else:
+        matches = all_cmds
+    return matches[state]
+
+
+readline.parse_and_bind('tab: complete')
+readline.set_completer(readline_complete)
+readline.set_completer_delims(readline.get_completer_delims().replace('/', ''))
+
+# Path to sockets for processes run as a root user
+for f in glob.glob('/var/run/dpdk/*/dpdk_telemetry.%s' % TELEMETRY_VERSION):
+    handle_socket(f)
+# Path to sockets for processes run as a regular user
+for f in glob.glob('/run/user/%d/dpdk/*/dpdk_telemetry.%s' %
+                   (os.getuid(), TELEMETRY_VERSION)):
+    handle_socket(f)
diff --git a/usertools/meson.build b/usertools/meson.build
index 149e788e3d..64e27238f4 100644
--- a/usertools/meson.build
+++ b/usertools/meson.build
@@ -1,4 +1,4 @@ 
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2017 Intel Corporation
 
-install_data(['dpdk-devbind.py', 'dpdk-pmdinfo.py'], install_dir: 'bin')
+install_data(['dpdk-devbind.py', 'dpdk-pmdinfo.py', 'dpdk-telemetry.py'], install_dir: 'bin')