usertools/telemetry: provide info on available sockets

When a user runs the dpdk-telemetry script and fails to connect because
the socket path does not exist, run a scan for possible sockets that
could be connected to and inform the user of the command needed to
connect to those.

For example:

  $ ./dpdk-telemetry.py -i4
  Connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2:4
  Error connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2:4

  Other DPDK telemetry sockets found:
  - dpdk_telemetry.v2  # Connect with './dpdk-telemetry.py'
  - dpdk_telemetry.v2:2  # Connect with './dpdk-telemetry.py -i 2'
  - dpdk_telemetry.v2:1  # Connect with './dpdk-telemetry.py -i 1'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Ciara Power <ciara.power@intel.com>
Reviewed-by: Conor Walsh <conor.walsh@intel.com>
This commit is contained in:
Bruce Richardson 2021-10-14 11:49:07 +01:00 committed by David Marchand
parent 11435aae20
commit b95af1946a

View File

@ -10,6 +10,7 @@ Allows the user input commands and read the Telemetry response.
import socket import socket
import os import os
import sys import sys
import glob
import json import json
import errno import errno
import readline import readline
@ -17,6 +18,8 @@ import argparse
# global vars # global vars
TELEMETRY_VERSION = "v2" TELEMETRY_VERSION = "v2"
SOCKET_NAME = 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION)
DEFAULT_PREFIX = 'rte'
CMDS = [] CMDS = []
@ -48,7 +51,28 @@ def get_app_name(pid):
return None return None
def handle_socket(path): def find_sockets(path):
""" Find any possible sockets to connect to and return them """
return glob.glob(os.path.join(path, SOCKET_NAME + '*'))
def print_socket_options(prefix, paths):
""" Given a set of socket paths, give the commands needed to connect """
cmd = sys.argv[0]
if prefix != DEFAULT_PREFIX:
cmd += " -f " + prefix
for s in sorted(paths):
sock_name = os.path.basename(s)
if sock_name.endswith(TELEMETRY_VERSION):
print("- {} # Connect with '{}'".format(os.path.basename(s),
cmd))
else:
print("- {} # Connect with '{} -i {}'".format(os.path.basename(s),
cmd,
s.split(':')[-1]))
def handle_socket(args, path):
""" Connect to socket and handle user input """ """ Connect to socket and handle user input """
prompt = '' # this evaluates to false in conditions prompt = '' # this evaluates to false in conditions
sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
@ -62,6 +86,15 @@ def handle_socket(path):
except OSError: except OSError:
print("Error connecting to " + path) print("Error connecting to " + path)
sock.close() sock.close()
# if socket exists but is bad, or if non-interactive just return
if os.path.exists(path) or not prompt:
return
# if user didn't give a valid socket path, but there are
# some sockets, help the user out by printing how to connect
socks = find_sockets(os.path.dirname(path))
if socks:
print("\nOther DPDK telemetry sockets found:")
print_socket_options(args.file_prefix, socks)
return return
json_reply = read_socket(sock, 1024, prompt) json_reply = read_socket(sock, 1024, prompt)
output_buf_len = json_reply["max_output_len"] output_buf_len = json_reply["max_output_len"]
@ -110,13 +143,12 @@ readline.set_completer(readline_complete)
readline.set_completer_delims(readline.get_completer_delims().replace('/', '')) readline.set_completer_delims(readline.get_completer_delims().replace('/', ''))
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file-prefix', default='rte', parser.add_argument('-f', '--file-prefix', default=DEFAULT_PREFIX,
help='Provide file-prefix for DPDK runtime directory') help='Provide file-prefix for DPDK runtime directory')
parser.add_argument('-i', '--instance', default='0', type=int, parser.add_argument('-i', '--instance', default='0', type=int,
help='Provide file-prefix for DPDK runtime directory') help='Provide file-prefix for DPDK runtime directory')
args = parser.parse_args() args = parser.parse_args()
rd = get_dpdk_runtime_dir(args.file_prefix) sock_path = os.path.join(get_dpdk_runtime_dir(args.file_prefix), SOCKET_NAME)
sock_path = os.path.join(rd, 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION))
if args.instance > 0: if args.instance > 0:
sock_path += ":{}".format(args.instance) sock_path += ":{}".format(args.instance)
handle_socket(sock_path) handle_socket(args, sock_path)