get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/100515/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 100515,
    "url": "http://patches.dpdk.org/api/patches/100515/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211005135909.726091-6-bruce.richardson@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20211005135909.726091-6-bruce.richardson@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211005135909.726091-6-bruce.richardson@intel.com",
    "date": "2021-10-05T13:59:09",
    "name": "[v6,5/5] usertools/dpdk-telemetry: provide info on available sockets",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "3dcdd0e2b35a76bd5733a8e820e29fd3601b0ee2",
    "submitter": {
        "id": 20,
        "url": "http://patches.dpdk.org/api/people/20/?format=api",
        "name": "Bruce Richardson",
        "email": "bruce.richardson@intel.com"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20211005135909.726091-6-bruce.richardson@intel.com/mbox/",
    "series": [
        {
            "id": 19390,
            "url": "http://patches.dpdk.org/api/series/19390/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=19390",
            "date": "2021-10-05T13:59:04",
            "name": "improve telemetry support with in-memory mode",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/19390/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/100515/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/100515/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 27ED2A0C4C;\n\tTue,  5 Oct 2021 16:18:31 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4ACD5413C0;\n\tTue,  5 Oct 2021 16:18:08 +0200 (CEST)",
            "from mga17.intel.com (mga17.intel.com [192.55.52.151])\n by mails.dpdk.org (Postfix) with ESMTP id EEAFD41383\n for <dev@dpdk.org>; Tue,  5 Oct 2021 16:18:03 +0200 (CEST)",
            "from orsmga008.jf.intel.com ([10.7.209.65])\n by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 05 Oct 2021 06:59:29 -0700",
            "from silpixa00399126.ir.intel.com ([10.237.223.151])\n by orsmga008.jf.intel.com with ESMTP; 05 Oct 2021 06:59:27 -0700"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10128\"; a=\"206563970\"",
            "E=Sophos;i=\"5.85,349,1624345200\"; d=\"scan'208\";a=\"206563970\"",
            "E=Sophos;i=\"5.85,349,1624345200\"; d=\"scan'208\";a=\"488044144\""
        ],
        "X-ExtLoop1": "1",
        "From": "Bruce Richardson <bruce.richardson@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "Ciara Power <ciara.power@intel.com>,\n David Marchand <david.marchand@redhat.com>,\n Anatoly Burakov <anatoly.burakov@intel.com>,\n Kevin Traynor <ktraynor@redhat.com>,\n Bruce Richardson <bruce.richardson@intel.com>",
        "Date": "Tue,  5 Oct 2021 14:59:09 +0100",
        "Message-Id": "<20211005135909.726091-6-bruce.richardson@intel.com>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20211005135909.726091-1-bruce.richardson@intel.com>",
        "References": "<20210915141030.23514-1-bruce.richardson@intel.com>\n <20211005135909.726091-1-bruce.richardson@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v6 5/5] usertools/dpdk-telemetry: provide info on\n available sockets",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "When a user runs the dpdk-telemetry script and fails to connect because\nthe socket path does not exist, run a scan for possible sockets that\ncould be connected to and inform the user of the command needed to\nconnect to those.\n\nFor example, when running the script without any parameters, but there\nare DPDK processes running with in-memory mode (so they need to be\nidentified by PID), the error message will include the details of how to\nconnect to each process:\n\n  $ ./usertools/dpdk-telemetry.py\n  Connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2\n  Error connecting to /run/user/1000/dpdk/rte/dpdk_telemetry.v2\n\n  Other DPDK telemetry sockets found:\n  - dpdk_telemetry.v2.20755  # Connect with './usertools/dpdk-telemetry.py -p 20755'\n  - dpdk_telemetry.v2.20451  # Connect with './usertools/dpdk-telemetry.py -p 20451'\n\nSigned-off-by: Bruce Richardson <bruce.richardson@intel.com>\n---\n doc/guides/howto/telemetry.rst |  3 +++\n usertools/dpdk-telemetry.py    | 41 ++++++++++++++++++++++++++++++----\n 2 files changed, 40 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/doc/guides/howto/telemetry.rst b/doc/guides/howto/telemetry.rst\nindex c3adca9504..cdde57cb3b 100644\n--- a/doc/guides/howto/telemetry.rst\n+++ b/doc/guides/howto/telemetry.rst\n@@ -68,6 +68,9 @@ and query information using the telemetry client python script.\n      When connecting to a process run with `--in-memory` EAL flag,\n      one must specify the PID of the process to connect to using the `-p` flag.\n      This is because there may be multiple such instances.\n+     If there are only *in-memory* DPDK processes to connect to,\n+     and no PID, or an invalid PID parameter, is provided,\n+     the telemetry script will list any available telemetry sockets and how to connect to them.\n \n #. When connected, the script displays the following, waiting for user input::\n \ndiff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py\nindex 690014ba9a..7f22e21828 100755\n--- a/usertools/dpdk-telemetry.py\n+++ b/usertools/dpdk-telemetry.py\n@@ -10,6 +10,7 @@\n import socket\n import os\n import sys\n+import glob\n import json\n import errno\n import readline\n@@ -17,6 +18,8 @@\n \n # global vars\n TELEMETRY_VERSION = \"v2\"\n+SOCKET_NAME = 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION)\n+DEFAULT_PREFIX = 'rte'\n CMDS = []\n \n \n@@ -48,7 +51,28 @@ def get_app_name(pid):\n     return None\n \n \n-def handle_socket(path):\n+def find_sockets(path):\n+    \"\"\" Find any possible sockets to connect to and return them \"\"\"\n+    return glob.glob(os.path.join(path, SOCKET_NAME + '*'))\n+\n+\n+def print_socket_options(prefix, paths):\n+    \"\"\" Given a set of socket paths, give the commands needed to connect \"\"\"\n+    cmd = sys.argv[0]\n+    if prefix != DEFAULT_PREFIX:\n+        cmd += \" -f \" + prefix\n+    for s in paths:\n+        sock_name = os.path.basename(s)\n+        if sock_name.endswith(TELEMETRY_VERSION):\n+            print(\"- {}  # Connect with '{}'\".format(os.path.basename(s),\n+                                                     cmd))\n+        else:\n+            print(\"- {}  # Connect with '{} -p {}'\".format(os.path.basename(s),\n+                                                           cmd,\n+                                                           s.split('.')[-1]))\n+\n+\n+def handle_socket(args, path):\n     \"\"\" Connect to socket and handle user input \"\"\"\n     prompt = ''  # this evaluates to false in conditions\n     sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)\n@@ -62,6 +86,15 @@ def handle_socket(path):\n     except OSError:\n         print(\"Error connecting to \" + path)\n         sock.close()\n+        # if socket exists but is bad, or if non-interactive just return\n+        if os.path.exists(path) or not prompt:\n+            return\n+        # if user didn't give a valid socket path, but there are\n+        # some sockets, help the user out by printing how to connect\n+        socks = find_sockets(os.path.dirname(path))\n+        if socks:\n+            print(\"\\nOther DPDK telemetry sockets found:\")\n+            print_socket_options(args.file_prefix, socks)\n         return\n     json_reply = read_socket(sock, 1024, prompt)\n     output_buf_len = json_reply[\"max_output_len\"]\n@@ -110,13 +143,13 @@ def get_dpdk_runtime_dir(fp):\n readline.set_completer_delims(readline.get_completer_delims().replace('/', ''))\n \n parser = argparse.ArgumentParser()\n-parser.add_argument('-f', '--file-prefix', default='rte',\n+parser.add_argument('-f', '--file-prefix', default=DEFAULT_PREFIX,\n                     help='Provide file-prefix for DPDK runtime directory')\n parser.add_argument('-p', '--pid',\n                     help='Connect to DPDK process with the given pid')\n args = parser.parse_args()\n rd = get_dpdk_runtime_dir(args.file_prefix)\n-sock_path = os.path.join(rd, 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION))\n+sock_path = os.path.join(rd, SOCKET_NAME)\n if args.pid:\n     sock_path += \".{}\".format(args.pid)\n-handle_socket(sock_path)\n+handle_socket(args, sock_path)\n",
    "prefixes": [
        "v6",
        "5/5"
    ]
}