DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Juraj Linkeš" <juraj.linkes@pantheon.tech>
To: thomas@monjalon.net, Honnappa.Nagarahalli@arm.com,
	jspewock@iol.unh.edu, probb@iol.unh.edu, paul.szczepanek@arm.com,
	yoan.picchi@foss.arm.com, Luca.Vizzarro@arm.com
Cc: dev@dpdk.org, "Juraj Linkeš" <juraj.linkes@pantheon.tech>
Subject: [PATCH v8 10/21] dts: config docstring update
Date: Thu, 23 Nov 2023 16:13:33 +0100	[thread overview]
Message-ID: <20231123151344.162812-11-juraj.linkes@pantheon.tech> (raw)
In-Reply-To: <20231123151344.162812-1-juraj.linkes@pantheon.tech>

Format according to the Google format and PEP257, with slight
deviations.

Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
---
 dts/framework/config/__init__.py | 369 ++++++++++++++++++++++++++-----
 dts/framework/config/types.py    | 132 +++++++++++
 2 files changed, 444 insertions(+), 57 deletions(-)
 create mode 100644 dts/framework/config/types.py

diff --git a/dts/framework/config/__init__.py b/dts/framework/config/__init__.py
index ef25a463c0..62eded7f04 100644
--- a/dts/framework/config/__init__.py
+++ b/dts/framework/config/__init__.py
@@ -3,8 +3,34 @@
 # Copyright(c) 2022-2023 University of New Hampshire
 # Copyright(c) 2023 PANTHEON.tech s.r.o.
 
-"""
-Yaml config parsing methods
+"""Testbed configuration and test suite specification.
+
+This package offers classes that hold real-time information about the testbed, hold test run
+configuration describing the tested testbed and a loader function, :func:`load_config`, which loads
+the YAML test run configuration file
+and validates it according to :download:`the schema <conf_yaml_schema.json>`.
+
+The YAML test run configuration file is parsed into a dictionary, parts of which are used throughout
+this package. The allowed keys and types inside this dictionary are defined in
+the :doc:`types <framework.config.types>` module.
+
+The test run configuration has two main sections:
+
+    * The :class:`ExecutionConfiguration` which defines what tests are going to be run
+      and how DPDK will be built. It also references the testbed where these tests and DPDK
+      are going to be run,
+    * The nodes of the testbed are defined in the other section,
+      a :class:`list` of :class:`NodeConfiguration` objects.
+
+The real-time information about testbed is supposed to be gathered at runtime.
+
+The classes defined in this package make heavy use of :mod:`dataclasses`.
+All of them use slots and are frozen:
+
+    * Slots enables some optimizations, by pre-allocating space for the defined
+      attributes in the underlying data structure,
+    * Frozen makes the object immutable. This enables further optimizations,
+      and makes it thread safe should we ever want to move in that direction.
 """
 
 import json
@@ -12,11 +38,20 @@
 import pathlib
 from dataclasses import dataclass
 from enum import auto, unique
-from typing import Any, TypedDict, Union
+from typing import Union
 
 import warlock  # type: ignore[import]
 import yaml
 
+from framework.config.types import (
+    BuildTargetConfigDict,
+    ConfigurationDict,
+    ExecutionConfigDict,
+    NodeConfigDict,
+    PortConfigDict,
+    TestSuiteConfigDict,
+    TrafficGeneratorConfigDict,
+)
 from framework.exception import ConfigurationError
 from framework.settings import SETTINGS
 from framework.utils import StrEnum
@@ -24,55 +59,97 @@
 
 @unique
 class Architecture(StrEnum):
+    r"""The supported architectures of :class:`~framework.testbed_model.node.Node`\s."""
+
+    #:
     i686 = auto()
+    #:
     x86_64 = auto()
+    #:
     x86_32 = auto()
+    #:
     arm64 = auto()
+    #:
     ppc64le = auto()
 
 
 @unique
 class OS(StrEnum):
+    r"""The supported operating systems of :class:`~framework.testbed_model.node.Node`\s."""
+
+    #:
     linux = auto()
+    #:
     freebsd = auto()
+    #:
     windows = auto()
 
 
 @unique
 class CPUType(StrEnum):
+    r"""The supported CPUs of :class:`~framework.testbed_model.node.Node`\s."""
+
+    #:
     native = auto()
+    #:
     armv8a = auto()
+    #:
     dpaa2 = auto()
+    #:
     thunderx = auto()
+    #:
     xgene1 = auto()
 
 
 @unique
 class Compiler(StrEnum):
+    r"""The supported compilers of :class:`~framework.testbed_model.node.Node`\s."""
+
+    #:
     gcc = auto()
+    #:
     clang = auto()
+    #:
     icc = auto()
+    #:
     msvc = auto()
 
 
 @unique
 class TrafficGeneratorType(StrEnum):
+    """The supported traffic generators."""
+
+    #:
     SCAPY = auto()
 
 
-# Slots enables some optimizations, by pre-allocating space for the defined
-# attributes in the underlying data structure.
-#
-# Frozen makes the object immutable. This enables further optimizations,
-# and makes it thread safe should we every want to move in that direction.
 @dataclass(slots=True, frozen=True)
 class HugepageConfiguration:
+    r"""The hugepage configuration of :class:`~framework.testbed_model.node.Node`\s.
+
+    Attributes:
+        amount: The number of hugepages.
+        force_first_numa: If :data:`True`, the hugepages will be configured on the first NUMA node.
+    """
+
     amount: int
     force_first_numa: bool
 
 
 @dataclass(slots=True, frozen=True)
 class PortConfig:
+    r"""The port configuration of :class:`~framework.testbed_model.node.Node`\s.
+
+    Attributes:
+        node: The :class:`~framework.testbed_model.node.Node` where this port exists.
+        pci: The PCI address of the port.
+        os_driver_for_dpdk: The operating system driver name for use with DPDK.
+        os_driver: The operating system driver name when the operating system controls the port.
+        peer_node: The :class:`~framework.testbed_model.node.Node` of the port
+            connected to this port.
+        peer_pci: The PCI address of the port connected to this port.
+    """
+
     node: str
     pci: str
     os_driver_for_dpdk: str
@@ -81,18 +158,44 @@ class PortConfig:
     peer_pci: str
 
     @staticmethod
-    def from_dict(node: str, d: dict) -> "PortConfig":
+    def from_dict(node: str, d: PortConfigDict) -> "PortConfig":
+        """A convenience method that creates the object from fewer inputs.
+
+        Args:
+            node: The node where this port exists.
+            d: The configuration dictionary.
+
+        Returns:
+            The port configuration instance.
+        """
         return PortConfig(node=node, **d)
 
 
 @dataclass(slots=True, frozen=True)
 class TrafficGeneratorConfig:
+    """The configuration of traffic generators.
+
+    The class will be expanded when more configuration is needed.
+
+    Attributes:
+        traffic_generator_type: The type of the traffic generator.
+    """
+
     traffic_generator_type: TrafficGeneratorType
 
     @staticmethod
-    def from_dict(d: dict) -> "ScapyTrafficGeneratorConfig":
-        # This looks useless now, but is designed to allow expansion to traffic
-        # generators that require more configuration later.
+    def from_dict(d: TrafficGeneratorConfigDict) -> "ScapyTrafficGeneratorConfig":
+        """A convenience method that produces traffic generator config of the proper type.
+
+        Args:
+            d: The configuration dictionary.
+
+        Returns:
+            The traffic generator configuration instance.
+
+        Raises:
+            ConfigurationError: An unknown traffic generator type was encountered.
+        """
         match TrafficGeneratorType(d["type"]):
             case TrafficGeneratorType.SCAPY:
                 return ScapyTrafficGeneratorConfig(
@@ -104,11 +207,31 @@ def from_dict(d: dict) -> "ScapyTrafficGeneratorConfig":
 
 @dataclass(slots=True, frozen=True)
 class ScapyTrafficGeneratorConfig(TrafficGeneratorConfig):
+    """Scapy traffic generator specific configuration."""
+
     pass
 
 
 @dataclass(slots=True, frozen=True)
 class NodeConfiguration:
+    r"""The configuration of :class:`~framework.testbed_model.node.Node`\s.
+
+    Attributes:
+        name: The name of the :class:`~framework.testbed_model.node.Node`.
+        hostname: The hostname of the :class:`~framework.testbed_model.node.Node`.
+            Can be an IP or a domain name.
+        user: The name of the user used to connect to
+            the :class:`~framework.testbed_model.node.Node`.
+        password: The password of the user. The use of passwords is heavily discouraged.
+            Please use keys instead.
+        arch: The architecture of the :class:`~framework.testbed_model.node.Node`.
+        os: The operating system of the :class:`~framework.testbed_model.node.Node`.
+        lcores: A comma delimited list of logical cores to use when running DPDK.
+        use_first_core: If :data:`True`, the first logical core won't be used.
+        hugepages: An optional hugepage configuration.
+        ports: The ports that can be used in testing.
+    """
+
     name: str
     hostname: str
     user: str
@@ -121,55 +244,89 @@ class NodeConfiguration:
     ports: list[PortConfig]
 
     @staticmethod
-    def from_dict(d: dict) -> Union["SutNodeConfiguration", "TGNodeConfiguration"]:
-        hugepage_config = d.get("hugepages")
-        if hugepage_config:
-            if "force_first_numa" not in hugepage_config:
-                hugepage_config["force_first_numa"] = False
-            hugepage_config = HugepageConfiguration(**hugepage_config)
-
-        common_config = {
-            "name": d["name"],
-            "hostname": d["hostname"],
-            "user": d["user"],
-            "password": d.get("password"),
-            "arch": Architecture(d["arch"]),
-            "os": OS(d["os"]),
-            "lcores": d.get("lcores", "1"),
-            "use_first_core": d.get("use_first_core", False),
-            "hugepages": hugepage_config,
-            "ports": [PortConfig.from_dict(d["name"], port) for port in d["ports"]],
-        }
-
+    def from_dict(
+        d: NodeConfigDict,
+    ) -> Union["SutNodeConfiguration", "TGNodeConfiguration"]:
+        """A convenience method that processes the inputs before creating a specialized instance.
+
+        Args:
+            d: The configuration dictionary.
+
+        Returns:
+            Either an SUT or TG configuration instance.
+        """
+        hugepage_config = None
+        if "hugepages" in d:
+            hugepage_config_dict = d["hugepages"]
+            if "force_first_numa" not in hugepage_config_dict:
+                hugepage_config_dict["force_first_numa"] = False
+            hugepage_config = HugepageConfiguration(**hugepage_config_dict)
+
+        # The calls here contain duplicated code which is here because Mypy doesn't
+        # properly support dictionary unpacking with TypedDicts
         if "traffic_generator" in d:
             return TGNodeConfiguration(
+                name=d["name"],
+                hostname=d["hostname"],
+                user=d["user"],
+                password=d.get("password"),
+                arch=Architecture(d["arch"]),
+                os=OS(d["os"]),
+                lcores=d.get("lcores", "1"),
+                use_first_core=d.get("use_first_core", False),
+                hugepages=hugepage_config,
+                ports=[PortConfig.from_dict(d["name"], port) for port in d["ports"]],
                 traffic_generator=TrafficGeneratorConfig.from_dict(d["traffic_generator"]),
-                **common_config,
             )
         else:
             return SutNodeConfiguration(
-                memory_channels=d.get("memory_channels", 1), **common_config
+                name=d["name"],
+                hostname=d["hostname"],
+                user=d["user"],
+                password=d.get("password"),
+                arch=Architecture(d["arch"]),
+                os=OS(d["os"]),
+                lcores=d.get("lcores", "1"),
+                use_first_core=d.get("use_first_core", False),
+                hugepages=hugepage_config,
+                ports=[PortConfig.from_dict(d["name"], port) for port in d["ports"]],
+                memory_channels=d.get("memory_channels", 1),
             )
 
 
 @dataclass(slots=True, frozen=True)
 class SutNodeConfiguration(NodeConfiguration):
+    """:class:`~framework.testbed_model.sut_node.SutNode` specific configuration.
+
+    Attributes:
+        memory_channels: The number of memory channels to use when running DPDK.
+    """
+
     memory_channels: int
 
 
 @dataclass(slots=True, frozen=True)
 class TGNodeConfiguration(NodeConfiguration):
+    """:class:`~framework.testbed_model.tg_node.TGNode` specific configuration.
+
+    Attributes:
+        traffic_generator: The configuration of the traffic generator present on the TG node.
+    """
+
     traffic_generator: ScapyTrafficGeneratorConfig
 
 
 @dataclass(slots=True, frozen=True)
 class NodeInfo:
-    """Class to hold important versions within the node.
-
-    This class, unlike the NodeConfiguration class, cannot be generated at the start.
-    This is because we need to initialize a connection with the node before we can
-    collect the information needed in this class. Therefore, it cannot be a part of
-    the configuration class above.
+    """Supplemental node information.
+
+    Attributes:
+        os_name: The name of the running operating system of
+            the :class:`~framework.testbed_model.node.Node`.
+        os_version: The version of the running operating system of
+            the :class:`~framework.testbed_model.node.Node`.
+        kernel_version: The kernel version of the running operating system of
+            the :class:`~framework.testbed_model.node.Node`.
     """
 
     os_name: str
@@ -179,6 +336,20 @@ class NodeInfo:
 
 @dataclass(slots=True, frozen=True)
 class BuildTargetConfiguration:
+    """DPDK build configuration.
+
+    The configuration used for building DPDK.
+
+    Attributes:
+        arch: The target architecture to build for.
+        os: The target os to build for.
+        cpu: The target CPU to build for.
+        compiler: The compiler executable to use.
+        compiler_wrapper: This string will be put in front of the compiler when
+            executing the build. Useful for adding wrapper commands, such as ``ccache``.
+        name: The name of the compiler.
+    """
+
     arch: Architecture
     os: OS
     cpu: CPUType
@@ -187,7 +358,18 @@ class BuildTargetConfiguration:
     name: str
 
     @staticmethod
-    def from_dict(d: dict) -> "BuildTargetConfiguration":
+    def from_dict(d: BuildTargetConfigDict) -> "BuildTargetConfiguration":
+        r"""A convenience method that processes the inputs before creating an instance.
+
+        `arch`, `os`, `cpu` and `compiler` are converted to :class:`Enum`\s and
+        `name` is constructed from `arch`, `os`, `cpu` and `compiler`.
+
+        Args:
+            d: The configuration dictionary.
+
+        Returns:
+            The build target configuration instance.
+        """
         return BuildTargetConfiguration(
             arch=Architecture(d["arch"]),
             os=OS(d["os"]),
@@ -200,23 +382,29 @@ def from_dict(d: dict) -> "BuildTargetConfiguration":
 
 @dataclass(slots=True, frozen=True)
 class BuildTargetInfo:
-    """Class to hold important versions within the build target.
+    """Various versions and other information about a build target.
 
-    This is very similar to the NodeInfo class, it just instead holds information
-    for the build target.
+    Attributes:
+        dpdk_version: The DPDK version that was built.
+        compiler_version: The version of the compiler used to build DPDK.
     """
 
     dpdk_version: str
     compiler_version: str
 
 
-class TestSuiteConfigDict(TypedDict):
-    suite: str
-    cases: list[str]
-
-
 @dataclass(slots=True, frozen=True)
 class TestSuiteConfig:
+    """Test suite configuration.
+
+    Information about a single test suite to be executed.
+
+    Attributes:
+        test_suite: The name of the test suite module without the starting ``TestSuite_``.
+        test_cases: The names of test cases from this test suite to execute.
+            If empty, all test cases will be executed.
+    """
+
     test_suite: str
     test_cases: list[str]
 
@@ -224,6 +412,14 @@ class TestSuiteConfig:
     def from_dict(
         entry: str | TestSuiteConfigDict,
     ) -> "TestSuiteConfig":
+        """Create an instance from two different types.
+
+        Args:
+            entry: Either a suite name or a dictionary containing the config.
+
+        Returns:
+            The test suite configuration instance.
+        """
         if isinstance(entry, str):
             return TestSuiteConfig(test_suite=entry, test_cases=[])
         elif isinstance(entry, dict):
@@ -234,19 +430,49 @@ def from_dict(
 
 @dataclass(slots=True, frozen=True)
 class ExecutionConfiguration:
+    """The configuration of an execution.
+
+    The configuration contains testbed information, what tests to execute
+    and with what DPDK build.
+
+    Attributes:
+        build_targets: A list of DPDK builds to test.
+        perf: Whether to run performance tests.
+        func: Whether to run functional tests.
+        skip_smoke_tests: Whether to skip smoke tests.
+        test_suites: The names of test suites and/or test cases to execute.
+        system_under_test_node: The SUT node to use in this execution.
+        traffic_generator_node: The TG node to use in this execution.
+        vdevs: The names of virtual devices to test.
+    """
+
     build_targets: list[BuildTargetConfiguration]
     perf: bool
     func: bool
+    skip_smoke_tests: bool
     test_suites: list[TestSuiteConfig]
     system_under_test_node: SutNodeConfiguration
     traffic_generator_node: TGNodeConfiguration
     vdevs: list[str]
-    skip_smoke_tests: bool
 
     @staticmethod
     def from_dict(
-        d: dict, node_map: dict[str, Union[SutNodeConfiguration | TGNodeConfiguration]]
+        d: ExecutionConfigDict,
+        node_map: dict[str, Union[SutNodeConfiguration | TGNodeConfiguration]],
     ) -> "ExecutionConfiguration":
+        """A convenience method that processes the inputs before creating an instance.
+
+        The build target and the test suite config are transformed into their respective objects.
+        SUT and TG configurations are taken from `node_map`. The other (:class:`bool`) attributes
+        are just stored.
+
+        Args:
+            d: The configuration dictionary.
+            node_map: A dictionary mapping node names to their config objects.
+
+        Returns:
+            The execution configuration instance.
+        """
         build_targets: list[BuildTargetConfiguration] = list(
             map(BuildTargetConfiguration.from_dict, d["build_targets"])
         )
@@ -283,10 +509,31 @@ def from_dict(
 
 @dataclass(slots=True, frozen=True)
 class Configuration:
+    """DTS testbed and test configuration.
+
+    The node configuration is not stored in this object. Rather, all used node configurations
+    are stored inside the execution configuration where the nodes are actually used.
+
+    Attributes:
+        executions: Execution configurations.
+    """
+
     executions: list[ExecutionConfiguration]
 
     @staticmethod
-    def from_dict(d: dict) -> "Configuration":
+    def from_dict(d: ConfigurationDict) -> "Configuration":
+        """A convenience method that processes the inputs before creating an instance.
+
+        Build target and test suite config are transformed into their respective objects.
+        SUT and TG configurations are taken from `node_map`. The other (:class:`bool`) attributes
+        are just stored.
+
+        Args:
+            d: The configuration dictionary.
+
+        Returns:
+            The whole configuration instance.
+        """
         nodes: list[Union[SutNodeConfiguration | TGNodeConfiguration]] = list(
             map(NodeConfiguration.from_dict, d["nodes"])
         )
@@ -303,9 +550,17 @@ def from_dict(d: dict) -> "Configuration":
 
 
 def load_config() -> Configuration:
-    """
-    Loads the configuration file and the configuration file schema,
-    validates the configuration file, and creates a configuration object.
+    """Load DTS test run configuration from a file.
+
+    Load the YAML test run configuration file
+    and :download:`the configuration file schema <conf_yaml_schema.json>`,
+    validate the test run configuration file, and create a test run configuration object.
+
+    The YAML test run configuration file is specified in the :option:`--config-file` command line
+    argument or the :envvar:`DTS_CFG_FILE` environment variable.
+
+    Returns:
+        The parsed test run configuration.
     """
     with open(SETTINGS.config_file_path, "r") as f:
         config_data = yaml.safe_load(f)
@@ -314,6 +569,6 @@ def load_config() -> Configuration:
 
     with open(schema_path, "r") as f:
         schema = json.load(f)
-    config: dict[str, Any] = warlock.model_factory(schema, name="_Config")(config_data)
-    config_obj: Configuration = Configuration.from_dict(dict(config))
+    config = warlock.model_factory(schema, name="_Config")(config_data)
+    config_obj: Configuration = Configuration.from_dict(dict(config))  # type: ignore[arg-type]
     return config_obj
diff --git a/dts/framework/config/types.py b/dts/framework/config/types.py
new file mode 100644
index 0000000000..1927910d88
--- /dev/null
+++ b/dts/framework/config/types.py
@@ -0,0 +1,132 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2023 PANTHEON.tech s.r.o.
+
+"""Configuration dictionary contents specification.
+
+These type definitions serve as documentation of the configuration dictionary contents.
+
+The definitions use the built-in :class:`~typing.TypedDict` construct.
+"""
+
+from typing import TypedDict
+
+
+class PortConfigDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    pci: str
+    #:
+    os_driver_for_dpdk: str
+    #:
+    os_driver: str
+    #:
+    peer_node: str
+    #:
+    peer_pci: str
+
+
+class TrafficGeneratorConfigDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    type: str
+
+
+class HugepageConfigurationDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    amount: int
+    #:
+    force_first_numa: bool
+
+
+class NodeConfigDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    hugepages: HugepageConfigurationDict
+    #:
+    name: str
+    #:
+    hostname: str
+    #:
+    user: str
+    #:
+    password: str
+    #:
+    arch: str
+    #:
+    os: str
+    #:
+    lcores: str
+    #:
+    use_first_core: bool
+    #:
+    ports: list[PortConfigDict]
+    #:
+    memory_channels: int
+    #:
+    traffic_generator: TrafficGeneratorConfigDict
+
+
+class BuildTargetConfigDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    arch: str
+    #:
+    os: str
+    #:
+    cpu: str
+    #:
+    compiler: str
+    #:
+    compiler_wrapper: str
+
+
+class TestSuiteConfigDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    suite: str
+    #:
+    cases: list[str]
+
+
+class ExecutionSUTConfigDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    node_name: str
+    #:
+    vdevs: list[str]
+
+
+class ExecutionConfigDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    build_targets: list[BuildTargetConfigDict]
+    #:
+    perf: bool
+    #:
+    func: bool
+    #:
+    skip_smoke_tests: bool
+    #:
+    test_suites: TestSuiteConfigDict
+    #:
+    system_under_test_node: ExecutionSUTConfigDict
+    #:
+    traffic_generator_node: str
+
+
+class ConfigurationDict(TypedDict):
+    """Allowed keys and values."""
+
+    #:
+    nodes: list[NodeConfigDict]
+    #:
+    executions: list[ExecutionConfigDict]
-- 
2.34.1


  parent reply	other threads:[~2023-11-23 15:15 UTC|newest]

Thread overview: 255+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-23 10:40 [RFC PATCH v1 0/4] dts: add dts api docs Juraj Linkeš
2023-03-23 10:40 ` [RFC PATCH v1 1/4] dts: code adjustments for sphinx Juraj Linkeš
2023-03-23 10:40 ` [RFC PATCH v1 2/4] dts: add doc generation dependencies Juraj Linkeš
2023-03-23 10:40 ` [RFC PATCH v1 3/4] dts: add doc generation Juraj Linkeš
2023-03-23 10:40 ` [RFC PATCH v1 4/4] dts: format docstrigs to google format Juraj Linkeš
2023-04-28 19:33   ` Jeremy Spewock
2023-04-03  9:17 ` [RFC PATCH v1 0/4] dts: add dts api docs Juraj Linkeš
2023-04-03  9:42   ` Bruce Richardson
2023-04-25  8:20     ` Juraj Linkeš
2023-04-25  8:44       ` Bruce Richardson
2023-04-25  8:57         ` Juraj Linkeš
2023-04-25  9:43           ` Bruce Richardson
2023-05-03 11:33             ` Juraj Linkeš
2023-05-04 12:37 ` [RFC PATCH v2 " Juraj Linkeš
2023-05-04 12:37   ` [RFC PATCH v2 1/4] dts: code adjustments for sphinx Juraj Linkeš
2023-05-04 12:37   ` [RFC PATCH v2 2/4] dts: add doc generation dependencies Juraj Linkeš
2023-05-04 12:37   ` [RFC PATCH v2 3/4] dts: add doc generation Juraj Linkeš
2023-05-04 12:45     ` Bruce Richardson
2023-05-05  7:53       ` Juraj Linkeš
2023-05-05 10:24         ` Bruce Richardson
2023-05-05 10:41           ` Juraj Linkeš
2023-05-05 10:56     ` Bruce Richardson
2023-05-05 11:13       ` Juraj Linkeš
2023-05-05 13:28         ` Bruce Richardson
2023-05-09  9:23           ` Juraj Linkeš
2023-05-09  9:40             ` Bruce Richardson
2023-05-10 12:19               ` Juraj Linkeš
2023-05-04 12:37   ` [RFC PATCH v2 4/4] dts: format docstrigs to google format Juraj Linkeš
2023-05-05 14:06   ` [RFC PATCH v2 0/4] dts: add dts api docs Bruce Richardson
2023-05-09 15:28     ` Juraj Linkeš
2023-05-11  8:55     ` Juraj Linkeš
2023-05-11  9:14   ` [RFC PATCH v3 " Juraj Linkeš
2023-05-11  9:14     ` [RFC PATCH v3 1/4] dts: code adjustments for sphinx Juraj Linkeš
2023-05-11  9:14     ` [RFC PATCH v3 2/4] dts: add doc generation dependencies Juraj Linkeš
2023-05-11  9:14     ` [RFC PATCH v3 3/4] dts: add doc generation Juraj Linkeš
2023-05-11  9:14     ` [RFC PATCH v3 4/4] dts: format docstrigs to google format Juraj Linkeš
2023-06-21 18:27       ` Jeremy Spewock
2023-05-17 16:56     ` [RFC PATCH v3 0/4] dts: add dts api docs Bruce Richardson
2023-05-22  9:17       ` Juraj Linkeš
2023-08-31 10:04     ` [RFC PATCH v4 " Juraj Linkeš
2023-08-31 10:04       ` [RFC PATCH v4 1/4] dts: code adjustments for sphinx Juraj Linkeš
2023-10-22 14:30         ` Yoan Picchi
2023-10-23  6:44           ` Juraj Linkeš
2023-10-23 11:52             ` Yoan Picchi
2023-10-24  6:39               ` Juraj Linkeš
2023-10-24 12:21                 ` Yoan Picchi
2023-08-31 10:04       ` [RFC PATCH v4 2/4] dts: add doc generation dependencies Juraj Linkeš
2023-10-27 15:27         ` Yoan Picchi
2023-08-31 10:04       ` [RFC PATCH v4 3/4] dts: add doc generation Juraj Linkeš
2023-09-20  7:08         ` Juraj Linkeš
2023-10-26 16:43         ` Yoan Picchi
2023-10-27  9:52           ` Juraj Linkeš
2023-08-31 10:04       ` [RFC PATCH v4 4/4] dts: format docstrigs to google format Juraj Linkeš
2023-09-01 17:02         ` Jeremy Spewock
2023-10-31 12:10         ` Yoan Picchi
2023-11-02 10:17           ` Juraj Linkeš
2023-11-06 17:15       ` [PATCH v5 00/23] dts: add dts api docs Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 01/23] dts: code adjustments for doc generation Juraj Linkeš
2023-11-08 13:35           ` Yoan Picchi
2023-11-15  7:46             ` Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 02/23] dts: add docstring checker Juraj Linkeš
2023-11-07 17:38           ` Yoan Picchi
2023-11-06 17:15         ` [PATCH v5 03/23] dts: add basic developer docs Juraj Linkeš
2023-11-07 14:39           ` Yoan Picchi
2023-11-08  9:01             ` Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 04/23] dts: exceptions docstring update Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 05/23] dts: settings " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 06/23] dts: logger and " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 07/23] dts: dts runner and main " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 08/23] dts: test suite " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 09/23] dts: test result " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 10/23] dts: config " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 11/23] dts: remote session " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 12/23] dts: interactive " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 13/23] dts: port and virtual device " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 14/23] dts: cpu " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 15/23] dts: os session " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 16/23] dts: posix and linux sessions " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 17/23] dts: node " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 18/23] dts: sut and tg nodes " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 19/23] dts: base traffic generators " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 20/23] dts: scapy tg " Juraj Linkeš
2023-11-06 17:15         ` [PATCH v5 21/23] dts: test suites " Juraj Linkeš
2023-11-06 17:16         ` [PATCH v5 22/23] dts: add doc generation dependencies Juraj Linkeš
2023-11-06 17:16         ` [PATCH v5 23/23] dts: add doc generation Juraj Linkeš
2023-11-08 12:53         ` [PATCH v6 01/23] dts: code adjustments for " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 02/23] dts: add docstring checker Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 03/23] dts: add basic developer docs Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 04/23] dts: exceptions docstring update Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 05/23] dts: settings " Juraj Linkeš
2023-11-08 16:17             ` Yoan Picchi
2023-11-15 10:09               ` Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 06/23] dts: logger and " Juraj Linkeš
2023-11-08 17:14             ` Yoan Picchi
2023-11-15 10:11               ` Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 07/23] dts: dts runner and main " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 08/23] dts: test suite " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 09/23] dts: test result " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 10/23] dts: config " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 11/23] dts: remote session " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 12/23] dts: interactive " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 13/23] dts: port and virtual device " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 14/23] dts: cpu " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 15/23] dts: os session " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 16/23] dts: posix and linux sessions " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 17/23] dts: node " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 18/23] dts: sut and tg nodes " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 19/23] dts: base traffic generators " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 20/23] dts: scapy tg " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 21/23] dts: test suites " Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 22/23] dts: add doc generation dependencies Juraj Linkeš
2023-11-08 16:00             ` Yoan Picchi
2023-11-15 10:00               ` Juraj Linkeš
2023-11-08 12:53           ` [PATCH v6 23/23] dts: add doc generation Juraj Linkeš
2023-11-15 13:09             ` [PATCH v7 00/21] dts: docstrings update Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 01/21] dts: code adjustments for doc generation Juraj Linkeš
2023-11-16 21:04                 ` Jeremy Spewock
2023-11-20 16:10                   ` Juraj Linkeš
2023-11-20 16:02                 ` Yoan Picchi
2023-11-15 13:09               ` [PATCH v7 02/21] dts: add docstring checker Juraj Linkeš
2023-11-20 16:03                 ` Yoan Picchi
2023-11-15 13:09               ` [PATCH v7 03/21] dts: add basic developer docs Juraj Linkeš
2023-11-20 16:03                 ` Yoan Picchi
2023-11-15 13:09               ` [PATCH v7 04/21] dts: exceptions docstring update Juraj Linkeš
2023-11-20 16:22                 ` Yoan Picchi
2023-11-20 16:35                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 05/21] dts: settings " Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 06/21] dts: logger and utils " Juraj Linkeš
2023-11-20 16:23                 ` Yoan Picchi
2023-11-20 16:36                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 07/21] dts: dts runner and main " Juraj Linkeš
2023-11-16 21:51                 ` Jeremy Spewock
2023-11-20 16:13                   ` Juraj Linkeš
2023-11-20 17:43                 ` Yoan Picchi
2023-11-21  9:10                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 08/21] dts: test suite " Juraj Linkeš
2023-11-16 22:16                 ` Jeremy Spewock
2023-11-20 16:25                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 09/21] dts: test result " Juraj Linkeš
2023-11-16 22:47                 ` Jeremy Spewock
2023-11-20 16:33                   ` Juraj Linkeš
2023-11-30 21:20                     ` Jeremy Spewock
2023-11-15 13:09               ` [PATCH v7 10/21] dts: config " Juraj Linkeš
2023-11-21 15:08                 ` Yoan Picchi
2023-11-22 10:42                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 11/21] dts: remote session " Juraj Linkeš
2023-11-21 15:36                 ` Yoan Picchi
2023-11-22 11:13                   ` Juraj Linkeš
2023-11-22 11:25                     ` Yoan Picchi
2023-11-15 13:09               ` [PATCH v7 12/21] dts: interactive " Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 13/21] dts: port and virtual device " Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 14/21] dts: cpu " Juraj Linkeš
2023-11-21 17:45                 ` Yoan Picchi
2023-11-22 11:18                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 15/21] dts: os session " Juraj Linkeš
2023-11-22 11:50                 ` Yoan Picchi
2023-11-22 13:27                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 16/21] dts: posix and linux sessions " Juraj Linkeš
2023-11-22 13:24                 ` Yoan Picchi
2023-11-22 13:35                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 17/21] dts: node " Juraj Linkeš
2023-11-22 12:18                 ` Yoan Picchi
2023-11-22 13:28                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 18/21] dts: sut and tg nodes " Juraj Linkeš
2023-11-22 13:12                 ` Yoan Picchi
2023-11-22 13:34                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 19/21] dts: base traffic generators " Juraj Linkeš
2023-11-21 16:20                 ` Yoan Picchi
2023-11-22 11:38                   ` Juraj Linkeš
2023-11-22 11:56                     ` Yoan Picchi
2023-11-22 13:11                       ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 20/21] dts: scapy tg " Juraj Linkeš
2023-11-21 16:33                 ` Yoan Picchi
2023-11-22 13:18                   ` Juraj Linkeš
2023-11-15 13:09               ` [PATCH v7 21/21] dts: test suites " Juraj Linkeš
2023-11-16 17:36                 ` Yoan Picchi
2023-11-20 10:17                   ` Juraj Linkeš
2023-11-20 12:50                     ` Yoan Picchi
2023-11-22 13:40                       ` Juraj Linkeš
2023-11-23 15:13               ` [PATCH v8 00/21] dts: docstrings update Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 01/21] dts: code adjustments for doc generation Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 02/21] dts: add docstring checker Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 03/21] dts: add basic developer docs Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 04/21] dts: exceptions docstring update Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 05/21] dts: settings " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 06/21] dts: logger and utils " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 07/21] dts: dts runner and main " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 08/21] dts: test suite " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 09/21] dts: test result " Juraj Linkeš
2023-11-23 15:13                 ` Juraj Linkeš [this message]
2023-11-23 15:13                 ` [PATCH v8 11/21] dts: remote session " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 12/21] dts: interactive " Juraj Linkeš
2023-11-30 21:49                   ` Jeremy Spewock
2023-12-04  9:50                     ` Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 13/21] dts: port and virtual device " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 14/21] dts: cpu " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 15/21] dts: os session " Juraj Linkeš
2023-12-01 17:33                   ` Jeremy Spewock
2023-12-04  9:53                     ` Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 16/21] dts: posix and linux sessions " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 17/21] dts: node " Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 18/21] dts: sut and tg nodes " Juraj Linkeš
2023-12-01 18:06                   ` Jeremy Spewock
2023-12-04 10:02                     ` Juraj Linkeš
2023-12-04 11:02                       ` Bruce Richardson
2023-11-23 15:13                 ` [PATCH v8 19/21] dts: base traffic generators " Juraj Linkeš
2023-12-01 18:05                   ` Jeremy Spewock
2023-12-04 10:03                     ` Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 20/21] dts: scapy tg " Juraj Linkeš
2023-12-01 18:17                   ` Jeremy Spewock
2023-12-04 10:07                     ` Juraj Linkeš
2023-11-23 15:13                 ` [PATCH v8 21/21] dts: test suites " Juraj Linkeš
2023-12-01 16:00                 ` [PATCH v8 00/21] dts: docstrings update Yoan Picchi
2023-12-01 18:23                   ` Jeremy Spewock
2023-12-04 10:24                 ` [PATCH v9 " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 01/21] dts: code adjustments for doc generation Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 02/21] dts: add docstring checker Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 03/21] dts: add basic developer docs Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 04/21] dts: exceptions docstring update Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 05/21] dts: settings " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 06/21] dts: logger and utils " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 07/21] dts: dts runner and main " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 08/21] dts: test suite " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 09/21] dts: test result " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 10/21] dts: config " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 11/21] dts: remote session " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 12/21] dts: interactive " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 13/21] dts: port and virtual device " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 14/21] dts: cpu " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 15/21] dts: os session " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 16/21] dts: posix and linux sessions " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 17/21] dts: node " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 18/21] dts: sut and tg nodes " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 19/21] dts: base traffic generators " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 20/21] dts: scapy tg " Juraj Linkeš
2023-12-04 10:24                   ` [PATCH v9 21/21] dts: test suites " Juraj Linkeš
2023-12-05 18:39                     ` Jeremy Spewock
2023-12-21 11:48                   ` [PATCH v9 00/21] dts: docstrings update Thomas Monjalon
2023-11-15 13:36             ` [PATCH v1 0/2] dts: api docs generation Juraj Linkeš
2023-11-15 13:36               ` [PATCH v1 1/2] dts: add doc generation dependencies Juraj Linkeš
2023-11-15 13:36               ` [PATCH v1 2/2] dts: add doc generation Juraj Linkeš
2024-01-22 12:00               ` [PATCH v2 0/3] dts: API docs generation Juraj Linkeš
2024-01-22 12:00                 ` [PATCH v2 1/3] dts: add doc generation dependencies Juraj Linkeš
2024-01-22 12:00                 ` [PATCH v2 2/3] dts: add API doc sources Juraj Linkeš
2024-01-22 12:00                 ` [PATCH v2 3/3] dts: add API doc generation Juraj Linkeš
2024-01-22 16:35               ` [PATCH v3 0/3] dts: API docs generation Juraj Linkeš
2024-01-22 16:35                 ` [PATCH v3 1/3] dts: add doc generation dependencies Juraj Linkeš
2024-01-22 16:35                 ` [PATCH v3 2/3] dts: add API doc sources Juraj Linkeš
2024-01-22 16:35                 ` [PATCH v3 3/3] dts: add API doc generation Juraj Linkeš
2024-01-29 17:09                   ` Jeremy Spewock
     [not found]                   ` <CAJvnSUCNjo0p-yhROF1MNLKhjiAw2QTyTHO2hpOaVVUn0xnJ0A@mail.gmail.com>
2024-02-29 18:12                     ` Nicholas Pratte
2024-04-12 10:14               ` [PATCH v4 0/3] dts: API docs generation Juraj Linkeš
2024-04-12 10:14                 ` [PATCH v4 1/3] dts: add doc generation dependencies Juraj Linkeš
2024-04-12 10:14                 ` [PATCH v4 2/3] dts: add API doc sources Juraj Linkeš
2024-04-12 10:14                 ` [PATCH v4 3/3] dts: add API doc generation Juraj Linkeš

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231123151344.162812-11-juraj.linkes@pantheon.tech \
    --to=juraj.linkes@pantheon.tech \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=Luca.Vizzarro@arm.com \
    --cc=dev@dpdk.org \
    --cc=jspewock@iol.unh.edu \
    --cc=paul.szczepanek@arm.com \
    --cc=probb@iol.unh.edu \
    --cc=thomas@monjalon.net \
    --cc=yoan.picchi@foss.arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).