All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luca Vizzarro <luca.vizzarro@arm.com>
To: dev@dpdk.org
Cc: Nicholas Pratte <npratte@iol.unh.edu>,
	Dean Marx <dmarx@iol.unh.edu>,
	Luca Vizzarro <luca.vizzarro@arm.com>,
	Paul Szczepanek <paul.szczepanek@arm.com>,
	Patrick Robb <probb@iol.unh.edu>
Subject: [PATCH v2 3/7] dts: revamp Topology model
Date: Wed, 12 Feb 2025 16:45:56 +0000	[thread overview]
Message-ID: <20250212164600.23759-4-luca.vizzarro@arm.com> (raw)
In-Reply-To: <20250212164600.23759-1-luca.vizzarro@arm.com>

Change the Topology model to add further flexility in its usage as a
standalone entry point to test suites.

Signed-off-by: Luca Vizzarro <luca.vizzarro@arm.com>
Reviewed-by: Paul Szczepanek <paul.szczepanek@arm.com>
Reviewed-by: Nicholas Pratte <npratte@iol.unh.edu>
Reviewed-by: Dean Marx <dmarx@iol.unh.edu>
---
 dts/framework/testbed_model/topology.py | 85 +++++++++++++------------
 1 file changed, 45 insertions(+), 40 deletions(-)

diff --git a/dts/framework/testbed_model/topology.py b/dts/framework/testbed_model/topology.py
index 814c3f3fe4..cf5c2c28ba 100644
--- a/dts/framework/testbed_model/topology.py
+++ b/dts/framework/testbed_model/topology.py
@@ -9,10 +9,12 @@
 """
 
 from collections.abc import Iterator
+from dataclasses import dataclass
 from enum import Enum
 from typing import NamedTuple
 
-from framework.config.node import PortConfig
+from typing_extensions import Self
+
 from framework.exception import ConfigurationError
 
 from .port import Port
@@ -43,35 +45,32 @@ class PortLink(NamedTuple):
     tg_port: Port
 
 
+@dataclass(frozen=True)
 class Topology:
     """Testbed topology.
 
     The topology contains ports processed into ingress and egress ports.
-    If there are no ports on a node, dummy ports (ports with no actual values) are stored.
-    If there is only one link available, the ports of this link are stored
+    If there are no ports on a node, accesses to :attr:`~Topology.tg_port_egress` and alike will
+    raise an exception. If there is only one link available, the ports of this link are stored
     as both ingress and egress ports.
 
-    The dummy ports shouldn't be used. It's up to :class:`~framework.runner.DTSRunner`
-    to ensure no test case or suite requiring actual links is executed
-    when the topology prohibits it and up to the developers to make sure that test cases
-    not requiring any links don't use any ports. Otherwise, the underlying methods
-    using the ports will fail.
+    It's up to :class:`~framework.test_run.TestRun` to ensure no test case or suite requiring actual
+    links is executed when the topology prohibits it and up to the developers to make sure that test
+    cases not requiring any links don't use any ports. Otherwise, the underlying methods using the
+    ports will fail.
 
     Attributes:
         type: The type of the topology.
-        tg_port_egress: The egress port of the TG node.
-        sut_port_ingress: The ingress port of the SUT node.
-        sut_port_egress: The egress port of the SUT node.
-        tg_port_ingress: The ingress port of the TG node.
+        sut_ports: The SUT ports.
+        tg_ports: The TG ports.
     """
 
     type: TopologyType
-    tg_port_egress: Port
-    sut_port_ingress: Port
-    sut_port_egress: Port
-    tg_port_ingress: Port
+    sut_ports: list[Port]
+    tg_ports: list[Port]
 
-    def __init__(self, port_links: Iterator[PortLink]):
+    @classmethod
+    def from_port_links(cls, port_links: Iterator[PortLink]) -> Self:
         """Create the topology from `port_links`.
 
         Args:
@@ -80,34 +79,40 @@ def __init__(self, port_links: Iterator[PortLink]):
         Raises:
             ConfigurationError: If an unsupported link topology is supplied.
         """
-        dummy_port = Port(
-            "",
-            PortConfig(
-                name="dummy",
-                pci="0000:00:00.0",
-                os_driver_for_dpdk="",
-                os_driver="",
-            ),
-        )
-
-        self.type = TopologyType.no_link
-        self.tg_port_egress = dummy_port
-        self.sut_port_ingress = dummy_port
-        self.sut_port_egress = dummy_port
-        self.tg_port_ingress = dummy_port
+        type = TopologyType.no_link
 
         if port_link := next(port_links, None):
-            self.type = TopologyType.one_link
-            self.tg_port_egress = port_link.tg_port
-            self.sut_port_ingress = port_link.sut_port
-            self.sut_port_egress = self.sut_port_ingress
-            self.tg_port_ingress = self.tg_port_egress
+            type = TopologyType.one_link
+            sut_ports = [port_link.sut_port]
+            tg_ports = [port_link.tg_port]
 
             if port_link := next(port_links, None):
-                self.type = TopologyType.two_links
-                self.sut_port_egress = port_link.sut_port
-                self.tg_port_ingress = port_link.tg_port
+                type = TopologyType.two_links
+                sut_ports.append(port_link.sut_port)
+                tg_ports.append(port_link.tg_port)
 
                 if next(port_links, None) is not None:
                     msg = "More than two links in a topology are not supported."
                     raise ConfigurationError(msg)
+
+        return cls(type, sut_ports, tg_ports)
+
+    @property
+    def tg_port_egress(self) -> Port:
+        """The egress port of the TG node."""
+        return self.tg_ports[0]
+
+    @property
+    def sut_port_ingress(self) -> Port:
+        """The ingress port of the SUT node."""
+        return self.sut_ports[0]
+
+    @property
+    def sut_port_egress(self) -> Port:
+        """The egress port of the SUT node."""
+        return self.sut_ports[1 if self.type is TopologyType.two_links else 0]
+
+    @property
+    def tg_port_ingress(self) -> Port:
+        """The ingress port of the TG node."""
+        return self.tg_ports[1 if self.type is TopologyType.two_links else 0]
-- 
2.43.0


  parent reply	other threads:[~2025-02-12 16:46 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-03 15:16 [RFC PATCH 0/7] dts: revamp framework Luca Vizzarro
2025-02-03 15:16 ` [RFC PATCH 1/7] dts: add port topology configuration Luca Vizzarro
2025-02-07 18:25   ` Nicholas Pratte
2025-02-12 16:47     ` Luca Vizzarro
2025-02-11 18:00   ` Dean Marx
2025-02-12 16:47     ` Luca Vizzarro
2025-02-03 15:16 ` [RFC PATCH 2/7] dts: isolate test specification to config Luca Vizzarro
2025-02-10 19:09   ` Nicholas Pratte
2025-02-11 18:11   ` Dean Marx
2025-02-03 15:16 ` [RFC PATCH 3/7] dts: revamp Topology model Luca Vizzarro
2025-02-10 19:42   ` Nicholas Pratte
2025-02-11 18:18   ` Dean Marx
2025-02-03 15:16 ` [RFC PATCH 4/7] dts: improve Port model Luca Vizzarro
2025-02-11 18:56   ` Dean Marx
2025-02-03 15:16 ` [RFC PATCH 5/7] dts: add runtime status Luca Vizzarro
2025-02-11 19:45   ` Dean Marx
2025-02-12 18:50   ` Nicholas Pratte
2025-02-03 15:16 ` [RFC PATCH 6/7] dts: add global runtime context Luca Vizzarro
2025-02-11 20:26   ` Dean Marx
2025-02-03 15:16 ` [RFC PATCH 7/7] dts: revamp runtime internals Luca Vizzarro
2025-02-11 20:50   ` Dean Marx
2025-02-04 21:08 ` [RFC PATCH 0/7] dts: revamp framework Dean Marx
2025-02-12 16:52   ` Luca Vizzarro
2025-02-12 16:45 ` [PATCH v2 " Luca Vizzarro
2025-02-12 16:45   ` [PATCH v2 1/7] dts: add port topology configuration Luca Vizzarro
2025-02-12 16:45   ` [PATCH v2 2/7] dts: isolate test specification to config Luca Vizzarro
2025-02-12 16:45   ` Luca Vizzarro [this message]
2025-02-12 16:45   ` [PATCH v2 4/7] dts: improve Port model Luca Vizzarro
2025-02-12 16:45   ` [PATCH v2 5/7] dts: add global runtime context Luca Vizzarro
2025-02-12 19:45     ` Nicholas Pratte
2025-02-12 16:45   ` [PATCH v2 6/7] dts: revamp runtime internals Luca Vizzarro
2025-02-14 18:54     ` Nicholas Pratte
2025-02-17 10:26       ` Luca Vizzarro
2025-02-12 16:46   ` [PATCH v2 7/7] dts: remove node distinction Luca Vizzarro
2025-02-14 19:14     ` Nicholas Pratte
2025-02-12 16:47   ` [PATCH v2 0/7] dts: revamp framework Luca Vizzarro

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=20250212164600.23759-4-luca.vizzarro@arm.com \
    --to=luca.vizzarro@arm.com \
    --cc=dev@dpdk.org \
    --cc=dmarx@iol.unh.edu \
    --cc=npratte@iol.unh.edu \
    --cc=paul.szczepanek@arm.com \
    --cc=probb@iol.unh.edu \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.