Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/119483/?format=api
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" ] }{ "id": 119483, "url": "