get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 119483,
    "url": "http://patches.dpdk.org/api/patches/119483/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20221104110523.511367-5-juraj.linkes@pantheon.tech/",
    "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": "<20221104110523.511367-5-juraj.linkes@pantheon.tech>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20221104110523.511367-5-juraj.linkes@pantheon.tech",
    "date": "2022-11-04T11:05:18",
    "name": "[v8,4/9] dts: add basic logging facility",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "e6ceced0de8209a102dd4da9c9f75a38faadb560",
    "submitter": {
        "id": 1626,
        "url": "http://patches.dpdk.org/api/people/1626/?format=api",
        "name": "Juraj Linkeš",
        "email": "juraj.linkes@pantheon.tech"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20221104110523.511367-5-juraj.linkes@pantheon.tech/mbox/",
    "series": [
        {
            "id": 25575,
            "url": "http://patches.dpdk.org/api/series/25575/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=25575",
            "date": "2022-11-04T11:05:14",
            "name": "dts: ssh connection to a node",
            "version": 8,
            "mbox": "http://patches.dpdk.org/series/25575/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/119483/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/119483/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 76005A00C5;\n\tFri,  4 Nov 2022 12:06:03 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 514EC42D3D;\n\tFri,  4 Nov 2022 12:05:39 +0100 (CET)",
            "from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20])\n by mails.dpdk.org (Postfix) with ESMTP id 9E76742D2C\n for <dev@dpdk.org>; Fri,  4 Nov 2022 12:05:37 +0100 (CET)",
            "from localhost (localhost [127.0.0.1])\n by lb.pantheon.sk (Postfix) with ESMTP id E100E1BA5AD;\n Fri,  4 Nov 2022 12:05:36 +0100 (CET)",
            "from lb.pantheon.sk ([127.0.0.1])\n by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024)\n with ESMTP id LloK4K_XWtvg; Fri,  4 Nov 2022 12:05:33 +0100 (CET)",
            "from entguard.lab.pantheon.local (unknown [46.229.239.141])\n by lb.pantheon.sk (Postfix) with ESMTP id F082B1BA5AB;\n Fri,  4 Nov 2022 12:05:27 +0100 (CET)"
        ],
        "X-Virus-Scanned": "amavisd-new at siecit.sk",
        "From": "=?utf-8?q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>",
        "To": "thomas@monjalon.net, Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu,\n lijuan.tu@intel.com, kda@semihalf.com, bruce.richardson@intel.com",
        "Cc": "dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>",
        "Subject": "[PATCH v8 4/9] dts: add basic logging facility",
        "Date": "Fri,  4 Nov 2022 11:05:18 +0000",
        "Message-Id": "<20221104110523.511367-5-juraj.linkes@pantheon.tech>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20221104110523.511367-1-juraj.linkes@pantheon.tech>",
        "References": "<20221103151934.450887-1-juraj.linkes@pantheon.tech>\n <20221104110523.511367-1-juraj.linkes@pantheon.tech>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "The logging module provides loggers distinguished by two attributes,\na custom format and a verbosity switch. The loggers log to both console\nand more verbosely to files.\n\nSigned-off-by: Owen Hilyard <ohilyard@iol.unh.edu>\nSigned-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>\n---\n .gitignore                |   3 +\n dts/framework/logger.py   | 113 ++++++++++++++++++++++++++++++++++++++\n dts/framework/settings.py |  23 ++++++++\n 3 files changed, 139 insertions(+)\n create mode 100644 dts/framework/logger.py",
    "diff": "diff --git a/.gitignore b/.gitignore\nindex 212c7aa28e..01a47a7606 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -36,6 +36,9 @@ TAGS\n # ignore python bytecode files\n *.pyc\n \n+# DTS results\n+dts/output\n+\n # ignore default build directory, and directories from test-meson-builds.sh\n build\n build-*\ndiff --git a/dts/framework/logger.py b/dts/framework/logger.py\nnew file mode 100644\nindex 0000000000..a31fcc8242\n--- /dev/null\n+++ b/dts/framework/logger.py\n@@ -0,0 +1,113 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2010-2014 Intel Corporation\n+# Copyright(c) 2022 PANTHEON.tech s.r.o.\n+# Copyright(c) 2022 University of New Hampshire\n+\n+\"\"\"\n+DTS logger module with several log level. DTS framework and TestSuite logs\n+are saved in different log files.\n+\"\"\"\n+\n+import logging\n+import os.path\n+from typing import TypedDict\n+\n+from .settings import SETTINGS\n+\n+date_fmt = \"%Y/%m/%d %H:%M:%S\"\n+stream_fmt = \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n+\n+\n+class LoggerDictType(TypedDict):\n+    logger: \"DTSLOG\"\n+    name: str\n+    node: str\n+\n+\n+# List for saving all using loggers\n+Loggers: list[LoggerDictType] = []\n+\n+\n+class DTSLOG(logging.LoggerAdapter):\n+    \"\"\"\n+    DTS log class for framework and testsuite.\n+    \"\"\"\n+\n+    logger: logging.Logger\n+    node: str\n+    sh: logging.StreamHandler\n+    fh: logging.FileHandler\n+    verbose_fh: logging.FileHandler\n+\n+    def __init__(self, logger: logging.Logger, node: str = \"suite\"):\n+        self.logger = logger\n+        # 1 means log everything, this will be used by file handlers if their level\n+        # is not set\n+        self.logger.setLevel(1)\n+\n+        self.node = node\n+\n+        # add handler to emit to stdout\n+        sh = logging.StreamHandler()\n+        sh.setFormatter(logging.Formatter(stream_fmt, date_fmt))\n+        sh.setLevel(logging.INFO)  # console handler default level\n+\n+        if SETTINGS.verbose is True:\n+            sh.setLevel(logging.DEBUG)\n+\n+        self.logger.addHandler(sh)\n+        self.sh = sh\n+\n+        logging_path_prefix = os.path.join(SETTINGS.output_dir, node)\n+\n+        fh = logging.FileHandler(f\"{logging_path_prefix}.log\")\n+        fh.setFormatter(\n+            logging.Formatter(\n+                fmt=\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\",\n+                datefmt=date_fmt,\n+            )\n+        )\n+\n+        self.logger.addHandler(fh)\n+        self.fh = fh\n+\n+        # This outputs EVERYTHING, intended for post-mortem debugging\n+        # Also optimized for processing via AWK (awk -F '|' ...)\n+        verbose_fh = logging.FileHandler(f\"{logging_path_prefix}.verbose.log\")\n+        verbose_fh.setFormatter(\n+            logging.Formatter(\n+                fmt=\"%(asctime)s|%(name)s|%(levelname)s|%(pathname)s|%(lineno)d|\"\n+                \"%(funcName)s|%(process)d|%(thread)d|%(threadName)s|%(message)s\",\n+                datefmt=date_fmt,\n+            )\n+        )\n+\n+        self.logger.addHandler(verbose_fh)\n+        self.verbose_fh = verbose_fh\n+\n+        super(DTSLOG, self).__init__(self.logger, dict(node=self.node))\n+\n+    def logger_exit(self) -> None:\n+        \"\"\"\n+        Remove stream handler and logfile handler.\n+        \"\"\"\n+        for handler in (self.sh, self.fh, self.verbose_fh):\n+            handler.flush()\n+            self.logger.removeHandler(handler)\n+\n+\n+def getLogger(name: str, node: str = \"suite\") -> DTSLOG:\n+    \"\"\"\n+    Get logger handler and if there's no handler for specified Node will create one.\n+    \"\"\"\n+    global Loggers\n+    # return saved logger\n+    logger: LoggerDictType\n+    for logger in Loggers:\n+        if logger[\"name\"] == name and logger[\"node\"] == node:\n+            return logger[\"logger\"]\n+\n+    # return new logger\n+    dts_logger: DTSLOG = DTSLOG(logging.getLogger(name), node)\n+    Loggers.append({\"logger\": dts_logger, \"name\": name, \"node\": node})\n+    return dts_logger\ndiff --git a/dts/framework/settings.py b/dts/framework/settings.py\nindex 007ab46c32..b6c5bba2b9 100644\n--- a/dts/framework/settings.py\n+++ b/dts/framework/settings.py\n@@ -57,6 +57,8 @@ def __call__(\n @dataclass(slots=True, frozen=True)\n class _Settings:\n     config_file_path: str\n+    output_dir: str\n+    verbose: bool\n \n \n def _get_parser() -> argparse.ArgumentParser:\n@@ -71,6 +73,25 @@ def _get_parser() -> argparse.ArgumentParser:\n         \"and targets.\",\n     )\n \n+    parser.add_argument(\n+        \"--output-dir\",\n+        \"--output\",\n+        action=_env_arg(\"DTS_OUTPUT_DIR\"),\n+        default=\"output\",\n+        required=False,\n+        help=\"[DTS_OUTPUT_DIR] Output directory where dts logs and results are saved.\",\n+    )\n+\n+    parser.add_argument(\n+        \"-v\",\n+        \"--verbose\",\n+        action=_env_arg(\"DTS_VERBOSE\"),\n+        default=\"N\",\n+        required=False,\n+        help=\"[DTS_VERBOSE] Set to 'Y' to enable verbose output, logging all messages \"\n+        \"to the console.\",\n+    )\n+\n     return parser\n \n \n@@ -78,6 +99,8 @@ def _get_settings() -> _Settings:\n     parsed_args = _get_parser().parse_args()\n     return _Settings(\n         config_file_path=parsed_args.config_file,\n+        output_dir=parsed_args.output_dir,\n+        verbose=(parsed_args.verbose == \"Y\"),\n     )\n \n \n",
    "prefixes": [
        "v8",
        "4/9"
    ]
}