DPDK patches and discussions
 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 5/7] dts: add global runtime context
Date: Wed, 12 Feb 2025 16:45:58 +0000	[thread overview]
Message-ID: <20250212164600.23759-6-luca.vizzarro@arm.com> (raw)
In-Reply-To: <20250212164600.23759-1-luca.vizzarro@arm.com>

Add a new context module which holds the runtime context. The new
context will describe the current scenario and aid underlying classes
used by the test suites to automatically infer their parameters. This
further simplifies the test writing process as the test writer won't need
to be concerned about the nodes, and can directly use the tools
implementing context awareness, e.g. TestPmdShell, as needed.

Bugzilla ID: 1461

Signed-off-by: Luca Vizzarro <luca.vizzarro@arm.com>
Reviewed-by: Paul Szczepanek <paul.szczepanek@arm.com>
Reviewed-by: Dean Marx <dmarx@iol.unh.edu>
---
 doc/api/dts/framework.context.rst             |   8 ++
 doc/api/dts/index.rst                         |   1 +
 dts/framework/context.py                      | 117 ++++++++++++++++++
 dts/framework/remote_session/dpdk_shell.py    |  53 +++-----
 .../single_active_interactive_shell.py        |  14 +--
 dts/framework/remote_session/testpmd_shell.py |  27 ++--
 dts/framework/test_suite.py                   |  73 +++++------
 dts/tests/TestSuite_blocklist.py              |   6 +-
 dts/tests/TestSuite_checksum_offload.py       |  14 +--
 dts/tests/TestSuite_dual_vlan.py              |   6 +-
 dts/tests/TestSuite_dynamic_config.py         |   8 +-
 dts/tests/TestSuite_dynamic_queue_conf.py     |   1 -
 dts/tests/TestSuite_hello_world.py            |   2 +-
 dts/tests/TestSuite_l2fwd.py                  |   9 +-
 dts/tests/TestSuite_mac_filter.py             |  10 +-
 dts/tests/TestSuite_mtu.py                    |  17 +--
 dts/tests/TestSuite_pmd_buffer_scatter.py     |   9 +-
 ...stSuite_port_restart_config_persistency.py |   8 +-
 dts/tests/TestSuite_promisc_support.py        |   8 +-
 dts/tests/TestSuite_smoke_tests.py            |   3 +-
 dts/tests/TestSuite_softnic.py                |   4 +-
 dts/tests/TestSuite_uni_pkt.py                |  14 +--
 dts/tests/TestSuite_vlan.py                   |   8 +-
 23 files changed, 247 insertions(+), 173 deletions(-)
 create mode 100644 doc/api/dts/framework.context.rst
 create mode 100644 dts/framework/context.py

diff --git a/doc/api/dts/framework.context.rst b/doc/api/dts/framework.context.rst
new file mode 100644
index 0000000000..a8c8b5022e
--- /dev/null
+++ b/doc/api/dts/framework.context.rst
@@ -0,0 +1,8 @@
+.. SPDX-License-Identifier: BSD-3-Clause
+
+context - DTS execution context
+===========================================================
+
+.. automodule:: framework.context
+   :members:
+   :show-inheritance:
diff --git a/doc/api/dts/index.rst b/doc/api/dts/index.rst
index 534512dc17..90092014d2 100644
--- a/doc/api/dts/index.rst
+++ b/doc/api/dts/index.rst
@@ -29,6 +29,7 @@ Modules
    framework.test_suite
    framework.test_result
    framework.settings
+   framework.context
    framework.logger
    framework.parser
    framework.utils
diff --git a/dts/framework/context.py b/dts/framework/context.py
new file mode 100644
index 0000000000..03eaf63b88
--- /dev/null
+++ b/dts/framework/context.py
@@ -0,0 +1,117 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2025 Arm Limited
+
+"""Runtime contexts."""
+
+import functools
+from dataclasses import MISSING, dataclass, field, fields
+from typing import TYPE_CHECKING, ParamSpec
+
+from framework.exception import InternalError
+from framework.settings import SETTINGS
+from framework.testbed_model.cpu import LogicalCoreCount, LogicalCoreList
+from framework.testbed_model.topology import Topology
+
+if TYPE_CHECKING:
+    from framework.testbed_model.sut_node import SutNode
+    from framework.testbed_model.tg_node import TGNode
+
+P = ParamSpec("P")
+
+
+@dataclass
+class LocalContext:
+    """Updatable context local to test suites and cases.
+
+    Attributes:
+        lcore_filter_specifier: A number of lcores/cores/sockets to use or a list of lcore ids to
+            use. The default will select one lcore for each of two cores on one socket, in ascending
+            order of core ids.
+        ascending_cores: Sort cores in ascending order (lowest to highest IDs). If :data:`False`,
+            sort in descending order.
+        append_prefix_timestamp: If :data:`True`, will append a timestamp to DPDK file prefix.
+        timeout: The timeout used for the SSH channel that is dedicated to this interactive
+            shell. This timeout is for collecting output, so if reading from the buffer
+            and no output is gathered within the timeout, an exception is thrown.
+    """
+
+    lcore_filter_specifier: LogicalCoreCount | LogicalCoreList = field(
+        default_factory=LogicalCoreCount
+    )
+    ascending_cores: bool = True
+    append_prefix_timestamp: bool = True
+    timeout: float = SETTINGS.timeout
+
+    def reset(self) -> None:
+        """Reset the local context to the default values."""
+        for _field in fields(LocalContext):
+            default = (
+                _field.default_factory()
+                if _field.default_factory is not MISSING
+                else _field.default
+            )
+
+            assert (
+                default is not MISSING
+            ), "{LocalContext.__name__} must have defaults on all fields!"
+
+            setattr(self, _field.name, default)
+
+
+@dataclass(frozen=True)
+class Context:
+    """Runtime context."""
+
+    sut_node: "SutNode"
+    tg_node: "TGNode"
+    topology: Topology
+    local: LocalContext = field(default_factory=LocalContext)
+
+
+__current_ctx: Context | None = None
+
+
+def get_ctx() -> Context:
+    """Retrieve the current runtime context.
+
+    Raises:
+        InternalError: If there is no context.
+    """
+    if __current_ctx:
+        return __current_ctx
+
+    raise InternalError("Attempted to retrieve context that has not been initialized yet.")
+
+
+def init_ctx(ctx: Context) -> None:
+    """Initialize context."""
+    global __current_ctx
+    __current_ctx = ctx
+
+
+def filter_cores(
+    specifier: LogicalCoreCount | LogicalCoreList, ascending_cores: bool | None = None
+):
+    """Decorates functions that require a temporary update to the lcore specifier."""
+
+    def decorator(func):
+        @functools.wraps(func)
+        def wrapper(*args: P.args, **kwargs: P.kwargs):
+            local_ctx = get_ctx().local
+
+            old_specifier = local_ctx.lcore_filter_specifier
+            local_ctx.lcore_filter_specifier = specifier
+            if ascending_cores is not None:
+                old_ascending_cores = local_ctx.ascending_cores
+                local_ctx.ascending_cores = ascending_cores
+
+            try:
+                return func(*args, **kwargs)
+            finally:
+                local_ctx.lcore_filter_specifier = old_specifier
+                if ascending_cores is not None:
+                    local_ctx.ascending_cores = old_ascending_cores
+
+        return wrapper
+
+    return decorator
diff --git a/dts/framework/remote_session/dpdk_shell.py b/dts/framework/remote_session/dpdk_shell.py
index c11d9ab81c..b55deb7fa0 100644
--- a/dts/framework/remote_session/dpdk_shell.py
+++ b/dts/framework/remote_session/dpdk_shell.py
@@ -9,54 +9,45 @@
 from abc import ABC
 from pathlib import PurePath
 
+from framework.context import get_ctx
 from framework.params.eal import EalParams
 from framework.remote_session.single_active_interactive_shell import (
     SingleActiveInteractiveShell,
 )
-from framework.settings import SETTINGS
-from framework.testbed_model.cpu import LogicalCoreCount, LogicalCoreList
+from framework.testbed_model.cpu import LogicalCoreList
 from framework.testbed_model.sut_node import SutNode
 
 
 def compute_eal_params(
-    sut_node: SutNode,
     params: EalParams | None = None,
-    lcore_filter_specifier: LogicalCoreCount | LogicalCoreList = LogicalCoreCount(),
-    ascending_cores: bool = True,
-    append_prefix_timestamp: bool = True,
 ) -> EalParams:
     """Compute EAL parameters based on the node's specifications.
 
     Args:
-        sut_node: The SUT node to compute the values for.
         params: If :data:`None`, a new object is created and returned. Otherwise `params.lcore_list`
             is modified according to `lcore_filter_specifier`. A DPDK file prefix is also added. If
             `params.ports` is :data:`None`, then `sut_node.ports` is assigned to it.
-        lcore_filter_specifier: A number of lcores/cores/sockets to use or a list of lcore ids to
-            use. The default will select one lcore for each of two cores on one socket, in ascending
-            order of core ids.
-        ascending_cores: Sort cores in ascending order (lowest to highest IDs). If :data:`False`,
-            sort in descending order.
-        append_prefix_timestamp: If :data:`True`, will append a timestamp to DPDK file prefix.
     """
+    ctx = get_ctx()
+
     if params is None:
         params = EalParams()
 
     if params.lcore_list is None:
         params.lcore_list = LogicalCoreList(
-            sut_node.filter_lcores(lcore_filter_specifier, ascending_cores)
+            ctx.sut_node.filter_lcores(ctx.local.lcore_filter_specifier, ctx.local.ascending_cores)
         )
 
     prefix = params.prefix
-    if append_prefix_timestamp:
-        prefix = f"{prefix}_{sut_node.dpdk_timestamp}"
-    prefix = sut_node.main_session.get_dpdk_file_prefix(prefix)
+    if ctx.local.append_prefix_timestamp:
+        prefix = f"{prefix}_{ctx.sut_node.dpdk_timestamp}"
+    prefix = ctx.sut_node.main_session.get_dpdk_file_prefix(prefix)
     if prefix:
-        sut_node.dpdk_prefix_list.append(prefix)
+        ctx.sut_node.dpdk_prefix_list.append(prefix)
     params.prefix = prefix
 
     if params.allowed_ports is None:
-        params.allowed_ports = sut_node.ports
+        params.allowed_ports = ctx.topology.sut_ports
 
     return params
 
@@ -74,29 +65,15 @@ class DPDKShell(SingleActiveInteractiveShell, ABC):
 
     def __init__(
         self,
-        node: SutNode,
+        name: str | None = None,
         privileged: bool = True,
-        timeout: float = SETTINGS.timeout,
-        lcore_filter_specifier: LogicalCoreCount | LogicalCoreList = LogicalCoreCount(),
-        ascending_cores: bool = True,
-        append_prefix_timestamp: bool = True,
         app_params: EalParams = EalParams(),
-        name: str | None = None,
     ) -> None:
-        """Extends :meth:`~.interactive_shell.InteractiveShell.__init__`.
-
-        Adds the `lcore_filter_specifier`, `ascending_cores` and `append_prefix_timestamp` arguments
-        which are then used to compute the EAL parameters based on the node's configuration.
-        """
-        app_params = compute_eal_params(
-            node,
-            app_params,
-            lcore_filter_specifier,
-            ascending_cores,
-            append_prefix_timestamp,
-        )
+        """Extends :meth:`~.interactive_shell.InteractiveShell.__init__`."""
+        app_params = compute_eal_params(app_params)
+        node = get_ctx().sut_node
 
-        super().__init__(node, privileged, timeout, app_params, name)
+        super().__init__(node, name, privileged, app_params)
 
     def _update_real_path(self, path: PurePath) -> None:
         """Extends :meth:`~.interactive_shell.InteractiveShell._update_real_path`.
diff --git a/dts/framework/remote_session/single_active_interactive_shell.py b/dts/framework/remote_session/single_active_interactive_shell.py
index cfe5baec14..2eec2f698a 100644
--- a/dts/framework/remote_session/single_active_interactive_shell.py
+++ b/dts/framework/remote_session/single_active_interactive_shell.py
@@ -27,6 +27,7 @@
 from paramiko import Channel, channel
 from typing_extensions import Self
 
+from framework.context import get_ctx
 from framework.exception import (
     InteractiveCommandExecutionError,
     InteractiveSSHSessionDeadError,
@@ -34,7 +35,6 @@
 )
 from framework.logger import DTSLogger, get_dts_logger
 from framework.params import Params
-from framework.settings import SETTINGS
 from framework.testbed_model.node import Node
 from framework.utils import MultiInheritanceBaseClass
 
@@ -90,10 +90,9 @@ class SingleActiveInteractiveShell(MultiInheritanceBaseClass, ABC):
     def __init__(
         self,
         node: Node,
+        name: str | None = None,
         privileged: bool = False,
-        timeout: float = SETTINGS.timeout,
         app_params: Params = Params(),
-        name: str | None = None,
         **kwargs,
     ) -> None:
         """Create an SSH channel during initialization.
@@ -103,13 +102,10 @@ def __init__(
 
         Args:
             node: The node on which to run start the interactive shell.
-            privileged: Enables the shell to run as superuser.
-            timeout: The timeout used for the SSH channel that is dedicated to this interactive
-                shell. This timeout is for collecting output, so if reading from the buffer
-                and no output is gathered within the timeout, an exception is thrown.
-            app_params: The command line parameters to be passed to the application on startup.
             name: Name for the interactive shell to use for logging. This name will be appended to
                 the name of the underlying node which it is running on.
+            privileged: Enables the shell to run as superuser.
+            app_params: The command line parameters to be passed to the application on startup.
             **kwargs: Any additional arguments if any.
         """
         self._node = node
@@ -118,7 +114,7 @@ def __init__(
         self._logger = get_dts_logger(f"{node.name}.{name}")
         self._app_params = app_params
         self._privileged = privileged
-        self._timeout = timeout
+        self._timeout = get_ctx().local.timeout
         # Ensure path is properly formatted for the host
         self._update_real_path(self.path)
         super().__init__(**kwargs)
diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framework/remote_session/testpmd_shell.py
index 287886ec44..672ecd970f 100644
--- a/dts/framework/remote_session/testpmd_shell.py
+++ b/dts/framework/remote_session/testpmd_shell.py
@@ -32,6 +32,9 @@
     TypeAlias,
 )
 
+from framework.context import get_ctx
+from framework.testbed_model.topology import TopologyType
+
 if TYPE_CHECKING or environ.get("DTS_DOC_BUILD"):
     from enum import Enum as NoAliasEnum
 else:
@@ -40,13 +43,11 @@
 from typing_extensions import Self, Unpack
 
 from framework.exception import InteractiveCommandExecutionError, InternalError
-from framework.params.testpmd import SimpleForwardingModes, TestPmdParams
+from framework.params.testpmd import PortTopology, SimpleForwardingModes, TestPmdParams
 from framework.params.types import TestPmdParamsDict
 from framework.parser import ParserFn, TextParser
 from framework.remote_session.dpdk_shell import DPDKShell
 from framework.settings import SETTINGS
-from framework.testbed_model.cpu import LogicalCoreCount, LogicalCoreList
-from framework.testbed_model.sut_node import SutNode
 from framework.utils import REGEX_FOR_MAC_ADDRESS, StrEnum
 
 P = ParamSpec("P")
@@ -1532,26 +1533,14 @@ class TestPmdShell(DPDKShell):
 
     def __init__(
         self,
-        node: SutNode,
-        privileged: bool = True,
-        timeout: float = SETTINGS.timeout,
-        lcore_filter_specifier: LogicalCoreCount | LogicalCoreList = LogicalCoreCount(),
-        ascending_cores: bool = True,
-        append_prefix_timestamp: bool = True,
         name: str | None = None,
+        privileged: bool = True,
         **app_params: Unpack[TestPmdParamsDict],
     ) -> None:
         """Overrides :meth:`~.dpdk_shell.DPDKShell.__init__`. Changes app_params to kwargs."""
-        super().__init__(
-            node,
-            privileged,
-            timeout,
-            lcore_filter_specifier,
-            ascending_cores,
-            append_prefix_timestamp,
-            TestPmdParams(**app_params),
-            name,
-        )
+        if "port_topology" not in app_params and get_ctx().topology.type is TopologyType.one_link:
+            app_params["port_topology"] = PortTopology.loop
+        super().__init__(name, privileged, TestPmdParams(**app_params))
         self.ports_started = not self._app_params.disable_device_start
         self._ports = None
 
diff --git a/dts/framework/test_suite.py b/dts/framework/test_suite.py
index 3d168d522b..b9b527e40d 100644
--- a/dts/framework/test_suite.py
+++ b/dts/framework/test_suite.py
@@ -24,7 +24,7 @@
 from ipaddress import IPv4Interface, IPv6Interface, ip_interface
 from pkgutil import iter_modules
 from types import ModuleType
-from typing import ClassVar, Protocol, TypeVar, Union, cast
+from typing import TYPE_CHECKING, ClassVar, Protocol, TypeVar, Union, cast
 
 from scapy.layers.inet import IP
 from scapy.layers.l2 import Ether
@@ -32,9 +32,6 @@
 from typing_extensions import Self
 
 from framework.testbed_model.capability import TestProtocol
-from framework.testbed_model.port import Port
-from framework.testbed_model.sut_node import SutNode
-from framework.testbed_model.tg_node import TGNode
 from framework.testbed_model.topology import Topology
 from framework.testbed_model.traffic_generator.capturing_traffic_generator import (
     PacketFilteringConfig,
@@ -44,6 +41,9 @@
 from .logger import DTSLogger, get_dts_logger
 from .utils import get_packet_summaries, to_pascal_case
 
+if TYPE_CHECKING:
+    from framework.context import Context
+
 
 class TestSuite(TestProtocol):
     """The base class with building blocks needed by most test cases.
@@ -69,33 +69,19 @@ class TestSuite(TestProtocol):
 
     The test suite is aware of the testbed (the SUT and TG) it's running on. From this, it can
     properly choose the IP addresses and other configuration that must be tailored to the testbed.
-
-    Attributes:
-        sut_node: The SUT node where the test suite is running.
-        tg_node: The TG node where the test suite is running.
     """
 
-    sut_node: SutNode
-    tg_node: TGNode
     #: Whether the test suite is blocking. A failure of a blocking test suite
     #: will block the execution of all subsequent test suites in the current test run.
     is_blocking: ClassVar[bool] = False
+    _ctx: "Context"
     _logger: DTSLogger
-    _sut_port_ingress: Port
-    _sut_port_egress: Port
     _sut_ip_address_ingress: Union[IPv4Interface, IPv6Interface]
     _sut_ip_address_egress: Union[IPv4Interface, IPv6Interface]
-    _tg_port_ingress: Port
-    _tg_port_egress: Port
     _tg_ip_address_ingress: Union[IPv4Interface, IPv6Interface]
     _tg_ip_address_egress: Union[IPv4Interface, IPv6Interface]
 
-    def __init__(
-        self,
-        sut_node: SutNode,
-        tg_node: TGNode,
-        topology: Topology,
-    ):
+    def __init__(self):
         """Initialize the test suite testbed information and basic configuration.
 
         Find links between ports and set up default IP addresses to be used when
@@ -106,18 +92,25 @@ def __init__(
             tg_node: The TG node where the test suite will run.
             topology: The topology where the test suite will run.
         """
-        self.sut_node = sut_node
-        self.tg_node = tg_node
+        from framework.context import get_ctx
+
+        self._ctx = get_ctx()
         self._logger = get_dts_logger(self.__class__.__name__)
-        self._tg_port_egress = topology.tg_port_egress
-        self._sut_port_ingress = topology.sut_port_ingress
-        self._sut_port_egress = topology.sut_port_egress
-        self._tg_port_ingress = topology.tg_port_ingress
         self._sut_ip_address_ingress = ip_interface("192.168.100.2/24")
         self._sut_ip_address_egress = ip_interface("192.168.101.2/24")
         self._tg_ip_address_egress = ip_interface("192.168.100.3/24")
         self._tg_ip_address_ingress = ip_interface("192.168.101.3/24")
 
+    @property
+    def name(self) -> str:
+        """The name of the test suite class."""
+        return type(self).__name__
+
+    @property
+    def topology(self) -> Topology:
+        """The current topology in use."""
+        return self._ctx.topology
+
     @classmethod
     def get_test_cases(cls) -> list[type["TestCase"]]:
         """A list of all the available test cases."""
@@ -254,10 +247,10 @@ def send_packets_and_capture(
             A list of received packets.
         """
         packets = self._adjust_addresses(packets)
-        return self.tg_node.send_packets_and_capture(
+        return self._ctx.tg_node.send_packets_and_capture(
             packets,
-            self._tg_port_egress,
-            self._tg_port_ingress,
+            self._ctx.topology.tg_port_egress,
+            self._ctx.topology.tg_port_ingress,
             filter_config,
             duration,
         )
@@ -272,7 +265,7 @@ def send_packets(
             packets: Packets to send.
         """
         packets = self._adjust_addresses(packets)
-        self.tg_node.send_packets(packets, self._tg_port_egress)
+        self._ctx.tg_node.send_packets(packets, self._ctx.topology.tg_port_egress)
 
     def get_expected_packets(
         self,
@@ -352,15 +345,15 @@ def _adjust_addresses(self, packets: list[Packet], expected: bool = False) -> li
             # only be the Ether src/dst.
             if "src" not in packet.fields:
                 packet.src = (
-                    self._sut_port_egress.mac_address
+                    self.topology.sut_port_egress.mac_address
                     if expected
-                    else self._tg_port_egress.mac_address
+                    else self.topology.tg_port_egress.mac_address
                 )
             if "dst" not in packet.fields:
                 packet.dst = (
-                    self._tg_port_ingress.mac_address
+                    self.topology.tg_port_ingress.mac_address
                     if expected
-                    else self._sut_port_ingress.mac_address
+                    else self.topology.sut_port_ingress.mac_address
                 )
 
             # update l3 addresses
@@ -400,10 +393,10 @@ def verify(self, condition: bool, failure_description: str) -> None:
 
     def _fail_test_case_verify(self, failure_description: str) -> None:
         self._logger.debug("A test case failed, showing the last 10 commands executed on SUT:")
-        for command_res in self.sut_node.main_session.remote_session.history[-10:]:
+        for command_res in self._ctx.sut_node.main_session.remote_session.history[-10:]:
             self._logger.debug(command_res.command)
         self._logger.debug("A test case failed, showing the last 10 commands executed on TG:")
-        for command_res in self.tg_node.main_session.remote_session.history[-10:]:
+        for command_res in self._ctx.tg_node.main_session.remote_session.history[-10:]:
             self._logger.debug(command_res.command)
         raise TestCaseVerifyError(failure_description)
 
@@ -517,14 +510,14 @@ def _verify_l2_frame(self, received_packet: Ether, l3: bool) -> bool:
         self._logger.debug("Looking at the Ether layer.")
         self._logger.debug(
             f"Comparing received dst mac '{received_packet.dst}' "
-            f"with expected '{self._tg_port_ingress.mac_address}'."
+            f"with expected '{self.topology.tg_port_ingress.mac_address}'."
         )
-        if received_packet.dst != self._tg_port_ingress.mac_address:
+        if received_packet.dst != self.topology.tg_port_ingress.mac_address:
             return False
 
-        expected_src_mac = self._tg_port_egress.mac_address
+        expected_src_mac = self.topology.tg_port_egress.mac_address
         if l3:
-            expected_src_mac = self._sut_port_egress.mac_address
+            expected_src_mac = self.topology.sut_port_egress.mac_address
         self._logger.debug(
             f"Comparing received src mac '{received_packet.src}' "
             f"with expected '{expected_src_mac}'."
diff --git a/dts/tests/TestSuite_blocklist.py b/dts/tests/TestSuite_blocklist.py
index b9e9cd1d1a..ce7da1cc8f 100644
--- a/dts/tests/TestSuite_blocklist.py
+++ b/dts/tests/TestSuite_blocklist.py
@@ -18,7 +18,7 @@ class TestBlocklist(TestSuite):
 
     def verify_blocklisted_ports(self, ports_to_block: list[Port]):
         """Runs testpmd with the given ports blocklisted and verifies the ports."""
-        with TestPmdShell(self.sut_node, allowed_ports=[], blocked_ports=ports_to_block) as testpmd:
+        with TestPmdShell(allowed_ports=[], blocked_ports=ports_to_block) as testpmd:
             allowlisted_ports = {port.device_name for port in testpmd.show_port_info_all()}
             blocklisted_ports = {port.pci for port in ports_to_block}
 
@@ -49,7 +49,7 @@ def one_port_blocklisted(self):
         Verify:
             That the port was successfully blocklisted.
         """
-        self.verify_blocklisted_ports(self.sut_node.ports[:1])
+        self.verify_blocklisted_ports(self.topology.sut_ports[:1])
 
     @func_test
     def all_but_one_port_blocklisted(self):
@@ -60,4 +60,4 @@ def all_but_one_port_blocklisted(self):
         Verify:
             That all specified ports were successfully blocklisted.
         """
-        self.verify_blocklisted_ports(self.sut_node.ports[:-1])
+        self.verify_blocklisted_ports(self.topology.sut_ports[:-1])
diff --git a/dts/tests/TestSuite_checksum_offload.py b/dts/tests/TestSuite_checksum_offload.py
index a8bb6a71f7..b38d73421b 100644
--- a/dts/tests/TestSuite_checksum_offload.py
+++ b/dts/tests/TestSuite_checksum_offload.py
@@ -128,7 +128,7 @@ def test_insert_checksums(self) -> None:
             Ether(dst=mac_id) / IPv6(src="::1") / UDP() / Raw(payload),
             Ether(dst=mac_id) / IPv6(src="::1") / TCP() / Raw(payload),
         ]
-        with TestPmdShell(node=self.sut_node, enable_rx_cksum=True) as testpmd:
+        with TestPmdShell(enable_rx_cksum=True) as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.csum)
             testpmd.set_verbose(level=1)
             self.setup_hw_offload(testpmd=testpmd)
@@ -160,7 +160,7 @@ def test_no_insert_checksums(self) -> None:
             Ether(dst=mac_id) / IPv6(src="::1") / UDP() / Raw(payload),
             Ether(dst=mac_id) / IPv6(src="::1") / TCP() / Raw(payload),
         ]
-        with TestPmdShell(node=self.sut_node, enable_rx_cksum=True) as testpmd:
+        with TestPmdShell(enable_rx_cksum=True) as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.csum)
             testpmd.set_verbose(level=1)
             testpmd.start()
@@ -190,7 +190,7 @@ def test_l4_rx_checksum(self) -> None:
             Ether(dst=mac_id) / IP() / UDP(chksum=0xF),
             Ether(dst=mac_id) / IP() / TCP(chksum=0xF),
         ]
-        with TestPmdShell(node=self.sut_node, enable_rx_cksum=True) as testpmd:
+        with TestPmdShell(enable_rx_cksum=True) as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.csum)
             testpmd.set_verbose(level=1)
             self.setup_hw_offload(testpmd=testpmd)
@@ -223,7 +223,7 @@ def test_l3_rx_checksum(self) -> None:
             Ether(dst=mac_id) / IP(chksum=0xF) / UDP(),
             Ether(dst=mac_id) / IP(chksum=0xF) / TCP(),
         ]
-        with TestPmdShell(node=self.sut_node, enable_rx_cksum=True) as testpmd:
+        with TestPmdShell(enable_rx_cksum=True) as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.csum)
             testpmd.set_verbose(level=1)
             self.setup_hw_offload(testpmd=testpmd)
@@ -260,7 +260,7 @@ def test_validate_rx_checksum(self) -> None:
             Ether(dst=mac_id) / IPv6(src="::1") / UDP(chksum=0xF),
             Ether(dst=mac_id) / IPv6(src="::1") / TCP(chksum=0xF),
         ]
-        with TestPmdShell(node=self.sut_node, enable_rx_cksum=True) as testpmd:
+        with TestPmdShell(enable_rx_cksum=True) as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.csum)
             testpmd.set_verbose(level=1)
             self.setup_hw_offload(testpmd=testpmd)
@@ -299,7 +299,7 @@ def test_vlan_checksum(self) -> None:
             Ether(dst=mac_id) / Dot1Q(vlan=1) / IPv6(src="::1") / UDP(chksum=0xF) / Raw(payload),
             Ether(dst=mac_id) / Dot1Q(vlan=1) / IPv6(src="::1") / TCP(chksum=0xF) / Raw(payload),
         ]
-        with TestPmdShell(node=self.sut_node, enable_rx_cksum=True) as testpmd:
+        with TestPmdShell(enable_rx_cksum=True) as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.csum)
             testpmd.set_verbose(level=1)
             self.setup_hw_offload(testpmd=testpmd)
@@ -333,7 +333,7 @@ def test_validate_sctp_checksum(self) -> None:
             Ether(dst=mac_id) / IP() / SCTP(),
             Ether(dst=mac_id) / IP() / SCTP(chksum=0xF),
         ]
-        with TestPmdShell(node=self.sut_node, enable_rx_cksum=True) as testpmd:
+        with TestPmdShell(enable_rx_cksum=True) as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.csum)
             testpmd.set_verbose(level=1)
             testpmd.csum_set_hw(layers=ChecksumOffloadOptions.sctp)
diff --git a/dts/tests/TestSuite_dual_vlan.py b/dts/tests/TestSuite_dual_vlan.py
index bdbee7e8d1..6af503528d 100644
--- a/dts/tests/TestSuite_dual_vlan.py
+++ b/dts/tests/TestSuite_dual_vlan.py
@@ -193,7 +193,7 @@ def insert_second_vlan(self) -> None:
             Packets are received.
             Packet contains two VLAN tags.
         """
-        with TestPmdShell(self.sut_node, forward_mode=SimpleForwardingModes.mac) as testpmd:
+        with TestPmdShell(forward_mode=SimpleForwardingModes.mac) as testpmd:
             testpmd.tx_vlan_set(port=self.tx_port, enable=True, vlan=self.vlan_insert_tag)
             testpmd.start()
             recv = self.send_packet_and_capture(
@@ -229,7 +229,7 @@ def all_vlan_functions(self) -> None:
             / Dot1Q(vlan=self.inner_vlan_tag)
             / Raw(b"X" * 20)
         )
-        with TestPmdShell(self.sut_node, forward_mode=SimpleForwardingModes.mac) as testpmd:
+        with TestPmdShell(forward_mode=SimpleForwardingModes.mac) as testpmd:
             testpmd.start()
             recv = self.send_packet_and_capture(send_pkt)
             self.verify(len(recv) > 0, "Unmodified packet was not received.")
@@ -269,7 +269,7 @@ def maintains_priority(self) -> None:
             / Dot1Q(vlan=self.inner_vlan_tag, prio=2)
             / Raw(b"X" * 20)
         )
-        with TestPmdShell(self.sut_node, forward_mode=SimpleForwardingModes.mac) as testpmd:
+        with TestPmdShell(forward_mode=SimpleForwardingModes.mac) as testpmd:
             testpmd.start()
             recv = self.send_packet_and_capture(pkt)
             self.verify(len(recv) > 0, "Did not receive any packets when testing VLAN priority.")
diff --git a/dts/tests/TestSuite_dynamic_config.py b/dts/tests/TestSuite_dynamic_config.py
index 5a33f6f3c2..a4bee2e90b 100644
--- a/dts/tests/TestSuite_dynamic_config.py
+++ b/dts/tests/TestSuite_dynamic_config.py
@@ -88,7 +88,7 @@ def test_default_mode(self) -> None:
         and sends two packets; one matching source MAC address and one unknown.
         Verifies that both are received.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             is_promisc = testpmd.show_port_info(0).is_promiscuous_mode_enabled
             self.verify(is_promisc, "Promiscuous mode was not enabled by default.")
             testpmd.start()
@@ -106,7 +106,7 @@ def test_disable_promisc(self) -> None:
         and sends two packets; one matching source MAC address and one unknown.
         Verifies that only the matching address packet is received.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd = self.disable_promisc_setup(testpmd=testpmd, port_id=0)
             mac = testpmd.show_port_info(0).mac_address
             self.send_packet_and_verify(should_receive=True, mac_address=str(mac))
@@ -120,7 +120,7 @@ def test_disable_promisc_broadcast(self) -> None:
         and sends two packets; one matching source MAC address and one broadcast.
         Verifies that both packets are received.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd = self.disable_promisc_setup(testpmd=testpmd, port_id=0)
             mac = testpmd.show_port_info(0).mac_address
             self.send_packet_and_verify(should_receive=True, mac_address=str(mac))
@@ -134,7 +134,7 @@ def test_disable_promisc_multicast(self) -> None:
         and sends two packets; one matching source MAC address and one multicast.
         Verifies that the multicast packet is only received once allmulticast mode is enabled.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd = self.disable_promisc_setup(testpmd=testpmd, port_id=0)
             testpmd.set_multicast_all(on=False)
             # 01:00:5E:00:00:01 is the first of the multicast MAC range of addresses
diff --git a/dts/tests/TestSuite_dynamic_queue_conf.py b/dts/tests/TestSuite_dynamic_queue_conf.py
index e55716f545..344dd540eb 100644
--- a/dts/tests/TestSuite_dynamic_queue_conf.py
+++ b/dts/tests/TestSuite_dynamic_queue_conf.py
@@ -84,7 +84,6 @@ def wrap(self: "TestDynamicQueueConf", is_rx_testing: bool) -> None:
             queues_to_config.add(random.randint(1, self.number_of_queues - 1))
         unchanged_queues = set(range(self.number_of_queues)) - queues_to_config
         with TestPmdShell(
-            self.sut_node,
             port_topology=PortTopology.chained,
             rx_queues=self.number_of_queues,
             tx_queues=self.number_of_queues,
diff --git a/dts/tests/TestSuite_hello_world.py b/dts/tests/TestSuite_hello_world.py
index 031b94de4d..141f2bc4c9 100644
--- a/dts/tests/TestSuite_hello_world.py
+++ b/dts/tests/TestSuite_hello_world.py
@@ -23,6 +23,6 @@ def test_hello_world(self) -> None:
         Verify:
             The testpmd session throws no errors.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd.start()
         self.log("Hello World!")
diff --git a/dts/tests/TestSuite_l2fwd.py b/dts/tests/TestSuite_l2fwd.py
index 0f6ff18907..0555d75ed8 100644
--- a/dts/tests/TestSuite_l2fwd.py
+++ b/dts/tests/TestSuite_l2fwd.py
@@ -7,6 +7,7 @@
 The forwarding test is performed with several packets being sent at once.
 """
 
+from framework.context import filter_cores
 from framework.params.testpmd import EthPeer, SimpleForwardingModes
 from framework.remote_session.testpmd_shell import TestPmdShell
 from framework.test_suite import TestSuite, func_test
@@ -33,6 +34,7 @@ def set_up_suite(self) -> None:
         """
         self.packets = generate_random_packets(self.NUMBER_OF_PACKETS_TO_SEND, self.PAYLOAD_SIZE)
 
+    @filter_cores(LogicalCoreCount(cores_per_socket=4))
     @func_test
     def l2fwd_integrity(self) -> None:
         """Test the L2 forwarding integrity.
@@ -44,11 +46,12 @@ def l2fwd_integrity(self) -> None:
         """
         queues = [1, 2, 4, 8]
 
+        self.topology.sut_ports[0]
+        self.topology.tg_ports[0]
+
         with TestPmdShell(
-            self.sut_node,
-            lcore_filter_specifier=LogicalCoreCount(cores_per_socket=4),
             forward_mode=SimpleForwardingModes.mac,
-            eth_peer=[EthPeer(1, self.tg_node.ports[1].mac_address)],
+            eth_peer=[EthPeer(1, self.topology.tg_port_ingress.mac_address)],
             disable_device_start=True,
         ) as shell:
             for queues_num in queues:
diff --git a/dts/tests/TestSuite_mac_filter.py b/dts/tests/TestSuite_mac_filter.py
index 11e4b595c7..e6c55d3ec6 100644
--- a/dts/tests/TestSuite_mac_filter.py
+++ b/dts/tests/TestSuite_mac_filter.py
@@ -101,10 +101,10 @@ def test_add_remove_mac_addresses(self) -> None:
             Remove the fake mac address from the PMD's address pool.
             Send a packet with the fake mac address to the PMD. (Should not receive)
         """
-        with TestPmdShell(self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd.set_promisc(0, enable=False)
             testpmd.start()
-            mac_address = self._sut_port_ingress.mac_address
+            mac_address = self.topology.sut_port_ingress.mac_address
 
             # Send a packet with NIC default mac address
             self.send_packet_and_verify(mac_address=mac_address, should_receive=True)
@@ -137,9 +137,9 @@ def test_invalid_address(self) -> None:
             Determine the device's mac address pool size, and fill the pool with fake addresses.
             Attempt to add another fake mac address, overloading the address pool. (Should fail)
         """
-        with TestPmdShell(self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd.start()
-            mac_address = self._sut_port_ingress.mac_address
+            mac_address = self.topology.sut_port_ingress.mac_address
             try:
                 testpmd.set_mac_addr(0, "00:00:00:00:00:00", add=True)
                 self.verify(False, "Invalid mac address added.")
@@ -191,7 +191,7 @@ def test_multicast_filter(self) -> None:
             Remove the fake multicast address from the PMDs multicast address filter.
             Send a packet with the fake multicast address to the PMD. (Should not receive)
         """
-        with TestPmdShell(self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd.start()
             testpmd.set_promisc(0, enable=False)
             multicast_address = "01:00:5E:00:00:00"
diff --git a/dts/tests/TestSuite_mtu.py b/dts/tests/TestSuite_mtu.py
index 4b59515bae..63e570ba03 100644
--- a/dts/tests/TestSuite_mtu.py
+++ b/dts/tests/TestSuite_mtu.py
@@ -51,8 +51,8 @@ def set_up_suite(self) -> None:
             Set traffic generator MTU lengths to a size greater than scope of all
             test cases.
         """
-        self.tg_node.main_session.configure_port_mtu(JUMBO_MTU + 200, self._tg_port_egress)
-        self.tg_node.main_session.configure_port_mtu(JUMBO_MTU + 200, self._tg_port_ingress)
+        self.topology.tg_port_egress.configure_mtu(JUMBO_MTU + 200)
+        self.topology.tg_port_ingress.configure_mtu(JUMBO_MTU + 200)
 
     def send_packet_and_verify(self, pkt_size: int, should_receive: bool) -> None:
         """Generate, send a packet, and assess its behavior based on a given packet size.
@@ -156,11 +156,7 @@ def test_runtime_mtu_updating_and_forwarding(self) -> None:
             Verify that standard MTU packets forward, in addition to packets within the limits of
             an MTU size set during runtime.
         """
-        with TestPmdShell(
-            self.sut_node,
-            tx_offloads=0x8000,
-            mbuf_size=[JUMBO_MTU + 200],
-        ) as testpmd:
+        with TestPmdShell(tx_offloads=0x8000, mbuf_size=[JUMBO_MTU + 200]) as testpmd:
             testpmd.set_port_mtu_all(1500, verify=True)
             testpmd.start()
             self.assess_mtu_boundary(testpmd, 1500)
@@ -201,7 +197,6 @@ def test_cli_mtu_forwarding_for_std_packets(self) -> None:
             MTU modification.
         """
         with TestPmdShell(
-            self.sut_node,
             tx_offloads=0x8000,
             mbuf_size=[JUMBO_MTU + 200],
             mbcache=200,
@@ -230,7 +225,6 @@ def test_cli_jumbo_forwarding_for_jumbo_mtu(self) -> None:
             Verify that all packets are forwarded after pre-runtime MTU modification.
         """
         with TestPmdShell(
-            self.sut_node,
             tx_offloads=0x8000,
             mbuf_size=[JUMBO_MTU + 200],
             mbcache=200,
@@ -259,7 +253,6 @@ def test_cli_mtu_std_packets_for_jumbo_mtu(self) -> None:
             MTU modification.
         """
         with TestPmdShell(
-            self.sut_node,
             tx_offloads=0x8000,
             mbuf_size=[JUMBO_MTU + 200],
             mbcache=200,
@@ -277,5 +270,5 @@ def tear_down_suite(self) -> None:
         Teardown:
             Set the MTU size of the traffic generator back to the standard 1518 byte size.
         """
-        self.tg_node.main_session.configure_port_mtu(STANDARD_MTU, self._tg_port_egress)
-        self.tg_node.main_session.configure_port_mtu(STANDARD_MTU, self._tg_port_ingress)
+        self.topology.tg_port_egress.configure_mtu(STANDARD_MTU)
+        self.topology.tg_port_ingress.configure_mtu(STANDARD_MTU)
diff --git a/dts/tests/TestSuite_pmd_buffer_scatter.py b/dts/tests/TestSuite_pmd_buffer_scatter.py
index a8c111eea7..5e23f28bc6 100644
--- a/dts/tests/TestSuite_pmd_buffer_scatter.py
+++ b/dts/tests/TestSuite_pmd_buffer_scatter.py
@@ -58,8 +58,8 @@ def set_up_suite(self) -> None:
             Increase the MTU of both ports on the traffic generator to 9000
             to support larger packet sizes.
         """
-        self.tg_node.main_session.configure_port_mtu(9000, self._tg_port_egress)
-        self.tg_node.main_session.configure_port_mtu(9000, self._tg_port_ingress)
+        self.topology.tg_port_egress.configure_mtu(9000)
+        self.topology.tg_port_ingress.configure_mtu(9000)
 
     def scatter_pktgen_send_packet(self, pkt_size: int) -> list[Packet]:
         """Generate and send a packet to the SUT then capture what is forwarded back.
@@ -110,7 +110,6 @@ def pmd_scatter(self, mb_size: int, enable_offload: bool = False) -> None:
             Start testpmd and run functional test with preset `mb_size`.
         """
         with TestPmdShell(
-            self.sut_node,
             forward_mode=SimpleForwardingModes.mac,
             mbcache=200,
             mbuf_size=[mb_size],
@@ -147,5 +146,5 @@ def tear_down_suite(self) -> None:
         Teardown:
             Set the MTU of the tg_node back to a more standard size of 1500.
         """
-        self.tg_node.main_session.configure_port_mtu(1500, self._tg_port_egress)
-        self.tg_node.main_session.configure_port_mtu(1500, self._tg_port_ingress)
+        self.topology.tg_port_egress.configure_mtu(1500)
+        self.topology.tg_port_ingress.configure_mtu(1500)
diff --git a/dts/tests/TestSuite_port_restart_config_persistency.py b/dts/tests/TestSuite_port_restart_config_persistency.py
index ad42c6c2e6..42ea221586 100644
--- a/dts/tests/TestSuite_port_restart_config_persistency.py
+++ b/dts/tests/TestSuite_port_restart_config_persistency.py
@@ -61,8 +61,8 @@ def port_configuration_persistence(self) -> None:
         Verify:
             The configuration persists after the port is restarted.
         """
-        with TestPmdShell(self.sut_node, disable_device_start=True) as testpmd:
-            for port_id in range(len(self.sut_node.ports)):
+        with TestPmdShell(disable_device_start=True) as testpmd:
+            for port_id, _ in enumerate(self.topology.sut_ports):
                 testpmd.set_port_mtu(port_id=port_id, mtu=STANDARD_MTU, verify=True)
                 self.restart_port_and_verify(port_id, testpmd, "MTU")
 
@@ -90,8 +90,8 @@ def flow_ctrl_port_configuration_persistence(self) -> None:
         Verify:
             The configuration persists after the port is restarted.
         """
-        with TestPmdShell(self.sut_node, disable_device_start=True) as testpmd:
-            for port_id in range(len(self.sut_node.ports)):
+        with TestPmdShell(disable_device_start=True) as testpmd:
+            for port_id, _ in enumerate(self.topology.sut_ports):
                 flow_ctrl = TestPmdPortFlowCtrl(rx=True)
                 testpmd.set_flow_control(port=port_id, flow_ctrl=flow_ctrl)
                 self.restart_port_and_verify(port_id, testpmd, "flow_ctrl")
diff --git a/dts/tests/TestSuite_promisc_support.py b/dts/tests/TestSuite_promisc_support.py
index a3ea2461f0..445f6e1d69 100644
--- a/dts/tests/TestSuite_promisc_support.py
+++ b/dts/tests/TestSuite_promisc_support.py
@@ -38,10 +38,8 @@ def test_promisc_packets(self) -> None:
         """
         packet = [Ether(dst=self.ALTERNATIVE_MAC_ADDRESS) / IP() / Raw(load=b"\x00" * 64)]
 
-        with TestPmdShell(
-            self.sut_node,
-        ) as testpmd:
-            for port_id in range(len(self.sut_node.ports)):
+        with TestPmdShell() as testpmd:
+            for port_id, _ in enumerate(self.topology.sut_ports):
                 testpmd.set_promisc(port=port_id, enable=True, verify=True)
             testpmd.start()
 
@@ -51,7 +49,7 @@ def test_promisc_packets(self) -> None:
 
             testpmd.stop()
 
-            for port_id in range(len(self.sut_node.ports)):
+            for port_id, _ in enumerate(self.topology.sut_ports):
                 testpmd.set_promisc(port=port_id, enable=False, verify=True)
             testpmd.start()
 
diff --git a/dts/tests/TestSuite_smoke_tests.py b/dts/tests/TestSuite_smoke_tests.py
index 7ed266dac0..8a5799c684 100644
--- a/dts/tests/TestSuite_smoke_tests.py
+++ b/dts/tests/TestSuite_smoke_tests.py
@@ -46,6 +46,7 @@ def set_up_suite(self) -> None:
         Setup:
             Set the build directory path and a list of NICs in the SUT node.
         """
+        self.sut_node = self._ctx.sut_node  # FIXME: accessing the context should be forbidden
         self.dpdk_build_dir_path = self.sut_node.remote_dpdk_build_dir
         self.nics_in_node = self.sut_node.config.ports
 
@@ -104,7 +105,7 @@ def test_devices_listed_in_testpmd(self) -> None:
         Test:
             List all devices found in testpmd and verify the configured devices are among them.
         """
-        with TestPmdShell(self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             dev_list = [str(x) for x in testpmd.get_devices()]
         for nic in self.nics_in_node:
             self.verify(
diff --git a/dts/tests/TestSuite_softnic.py b/dts/tests/TestSuite_softnic.py
index 07480db392..370fd6b419 100644
--- a/dts/tests/TestSuite_softnic.py
+++ b/dts/tests/TestSuite_softnic.py
@@ -32,6 +32,7 @@ def set_up_suite(self) -> None:
         Setup:
             Generate the random packets that will be sent and create the softnic config files.
         """
+        self.sut_node = self._ctx.sut_node  # FIXME: accessing the context should be forbidden
         self.packets = generate_random_packets(self.NUMBER_OF_PACKETS_TO_SEND, self.PAYLOAD_SIZE)
         self.cli_file = self.prepare_softnic_files()
 
@@ -105,9 +106,8 @@ def softnic(self) -> None:
 
         """
         with TestPmdShell(
-            self.sut_node,
             vdevs=[VirtualDevice(f"net_softnic0,firmware={self.cli_file},cpu_id=1,conn_port=8086")],
-            eth_peer=[EthPeer(1, self.tg_node.ports[1].mac_address)],
+            eth_peer=[EthPeer(1, self.topology.tg_port_ingress.mac_address)],
             port_topology=None,
         ) as shell:
             shell.start()
diff --git a/dts/tests/TestSuite_uni_pkt.py b/dts/tests/TestSuite_uni_pkt.py
index 0898187675..656a69b0f1 100644
--- a/dts/tests/TestSuite_uni_pkt.py
+++ b/dts/tests/TestSuite_uni_pkt.py
@@ -85,7 +85,7 @@ def test_l2_packet_detect(self) -> None:
         mac_id = "00:00:00:00:00:01"
         packet_list = [Ether(dst=mac_id, type=0x88F7) / Raw(), Ether(dst=mac_id) / ARP() / Raw()]
         flag_list = [RtePTypes.L2_ETHER_TIMESYNC, RtePTypes.L2_ETHER_ARP]
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.setup_session(testpmd=testpmd, expected_flags=flag_list, packet_list=packet_list)
 
     @func_test
@@ -118,7 +118,7 @@ def test_l3_l4_packet_detect(self) -> None:
             RtePTypes.L4_ICMP,
             RtePTypes.L4_FRAG | RtePTypes.L3_IPV4_EXT_UNKNOWN | RtePTypes.L2_ETHER,
         ]
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.setup_session(testpmd=testpmd, expected_flags=flag_list, packet_list=packet_list)
 
     @func_test
@@ -147,7 +147,7 @@ def test_ipv6_l4_packet_detect(self) -> None:
             RtePTypes.L4_TCP,
             RtePTypes.L3_IPV6_EXT_UNKNOWN,
         ]
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.setup_session(testpmd=testpmd, expected_flags=flag_list, packet_list=packet_list)
 
     @func_test
@@ -182,7 +182,7 @@ def test_l3_tunnel_packet_detect(self) -> None:
             RtePTypes.TUNNEL_IP | RtePTypes.INNER_L4_ICMP,
             RtePTypes.TUNNEL_IP | RtePTypes.INNER_L3_IPV6_EXT_UNKNOWN | RtePTypes.INNER_L4_FRAG,
         ]
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.setup_session(testpmd=testpmd, expected_flags=flag_list, packet_list=packet_list)
 
     @func_test
@@ -215,7 +215,7 @@ def test_gre_tunnel_packet_detect(self) -> None:
             RtePTypes.TUNNEL_GRENAT | RtePTypes.INNER_L4_SCTP,
             RtePTypes.TUNNEL_GRENAT | RtePTypes.INNER_L4_ICMP,
         ]
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.setup_session(testpmd=testpmd, expected_flags=flag_list, packet_list=packet_list)
 
     @func_test
@@ -250,7 +250,7 @@ def test_nsh_packet_detect(self) -> None:
             RtePTypes.L2_ETHER_NSH | RtePTypes.L3_IPV4_EXT_UNKNOWN | RtePTypes.L4_SCTP,
             RtePTypes.L2_ETHER_NSH | RtePTypes.L3_IPV6_EXT_UNKNOWN | RtePTypes.L4_NONFRAG,
         ]
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.setup_session(testpmd=testpmd, expected_flags=flag_list, packet_list=packet_list)
 
     @func_test
@@ -295,6 +295,6 @@ def test_vxlan_tunnel_packet_detect(self) -> None:
             RtePTypes.TUNNEL_GRENAT | RtePTypes.INNER_L4_ICMP,
             RtePTypes.TUNNEL_GRENAT | RtePTypes.INNER_L3_IPV6_EXT_UNKNOWN | RtePTypes.INNER_L4_FRAG,
         ]
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd.rx_vxlan(4789, 0, True)
             self.setup_session(testpmd=testpmd, expected_flags=flag_list, packet_list=packet_list)
diff --git a/dts/tests/TestSuite_vlan.py b/dts/tests/TestSuite_vlan.py
index c67520baef..d2a9e614d4 100644
--- a/dts/tests/TestSuite_vlan.py
+++ b/dts/tests/TestSuite_vlan.py
@@ -124,7 +124,7 @@ def test_vlan_receipt_no_stripping(self) -> None:
         Test:
             Create an interactive testpmd shell and verify a VLAN packet.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.vlan_setup(testpmd=testpmd, port_id=0, filtered_id=1)
             testpmd.start()
             self.send_vlan_packet_and_verify(True, strip=False, vlan_id=1)
@@ -137,7 +137,7 @@ def test_vlan_receipt_stripping(self) -> None:
         Test:
             Create an interactive testpmd shell and verify a VLAN packet.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.vlan_setup(testpmd=testpmd, port_id=0, filtered_id=1)
             testpmd.set_vlan_strip(port=0, enable=True)
             testpmd.start()
@@ -150,7 +150,7 @@ def test_vlan_no_receipt(self) -> None:
         Test:
             Create an interactive testpmd shell and verify a VLAN packet.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             self.vlan_setup(testpmd=testpmd, port_id=0, filtered_id=1)
             testpmd.start()
             self.send_vlan_packet_and_verify(should_receive=False, strip=False, vlan_id=2)
@@ -162,7 +162,7 @@ def test_vlan_header_insertion(self) -> None:
         Test:
             Create an interactive testpmd shell and verify a non-VLAN packet.
         """
-        with TestPmdShell(node=self.sut_node) as testpmd:
+        with TestPmdShell() as testpmd:
             testpmd.set_forward_mode(SimpleForwardingModes.mac)
             testpmd.set_promisc(port=0, enable=False)
             testpmd.stop_all_ports()
-- 
2.43.0


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

Thread overview: 33+ 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   ` [PATCH v2 3/7] dts: revamp Topology model Luca Vizzarro
2025-02-12 16:45   ` [PATCH v2 4/7] dts: improve Port model Luca Vizzarro
2025-02-12 16:45   ` Luca Vizzarro [this message]
2025-02-12 19:45     ` [PATCH v2 5/7] dts: add global runtime context Nicholas Pratte
2025-02-12 16:45   ` [PATCH v2 6/7] dts: revamp runtime internals Luca Vizzarro
2025-02-12 16:46   ` [PATCH v2 7/7] dts: remove node distinction Luca Vizzarro
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-6-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 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).