@@ -54,7 +54,14 @@ def __init__(
eal_params.append_str(app_params)
app_params = eal_params
- super().__init__(name, privileged, path, app_params)
+ self._path = path
+
+ super().__init__(name, privileged, app_params)
+
+ @property
+ def path(self) -> PurePath:
+ """The path of the DPDK app relative to the DPDK build folder."""
+ return self._path
def wait_until_ready(self, end_token: str) -> None:
"""Start app and wait until ready.
@@ -6,7 +6,7 @@
Provides a base class to create interactive shells based on DPDK.
"""
-from abc import ABC
+from abc import ABC, abstractmethod
from pathlib import PurePath
from framework.context import get_ctx
@@ -65,20 +65,22 @@ def __init__(
self,
name: str | None = None,
privileged: bool = True,
- path: PurePath | None = None,
app_params: EalParams = EalParams(),
) -> None:
"""Extends :meth:`~.interactive_shell.InteractiveShell.__init__`."""
app_params = compute_eal_params(app_params)
node = get_ctx().sut_node
- super().__init__(node, name, privileged, path, app_params)
+ super().__init__(node, name, privileged, app_params)
- def _update_real_path(self, path: PurePath) -> None:
- """Extends :meth:`~.interactive_shell.InteractiveShell._update_real_path`.
+ @property
+ @abstractmethod
+ def path(self) -> PurePath:
+ """Relative path to the shell executable from the build folder."""
+
+ def _make_real_path(self):
+ """Overrides :meth:`~.interactive_shell.InteractiveShell._make_real_path`.
Adds the remote DPDK build directory to the path.
"""
- super()._update_real_path(
- PurePath(get_ctx().dpdk_build.remote_dpdk_build_dir).joinpath(path)
- )
+ return get_ctx().dpdk_build.remote_dpdk_build_dir.joinpath(self.path)
@@ -21,7 +21,7 @@
environment variable configure the timeout of getting the output from command execution.
"""
-from abc import ABC
+from abc import ABC, abstractmethod
from pathlib import PurePath
from typing import ClassVar
@@ -66,7 +66,6 @@ class InteractiveShell(MultiInheritanceBaseClass, ABC):
_timeout: float
_app_params: Params
_privileged: bool
- _real_path: PurePath
#: The number of times to try starting the application before considering it a failure.
_init_attempts: ClassVar[int] = 5
@@ -83,9 +82,6 @@ class InteractiveShell(MultiInheritanceBaseClass, ABC):
#: the expected prompt.
_command_extra_chars: ClassVar[str] = ""
- #: Path to the executable to start the interactive application.
- path: ClassVar[PurePath]
-
is_alive: bool = False
def __init__(
@@ -93,7 +89,6 @@ def __init__(
node: Node,
name: str | None = None,
privileged: bool = False,
- path: PurePath | None = None,
app_params: Params = Params(),
**kwargs,
) -> None:
@@ -107,7 +102,6 @@ def __init__(
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.
- path: Path to the executable. If :data:`None`, then the class' path attribute is used.
app_params: The command line parameters to be passed to the application on startup.
**kwargs: Any additional arguments if any.
"""
@@ -118,8 +112,6 @@ def __init__(
self._app_params = app_params
self._privileged = privileged
self._timeout = SETTINGS.timeout
- # Ensure path is properly formatted for the host
- self._update_real_path(path or self.path)
super().__init__(**kwargs)
def _setup_ssh_channel(self):
@@ -131,7 +123,7 @@ def _setup_ssh_channel(self):
def _make_start_command(self) -> str:
"""Makes the command that starts the interactive shell."""
- start_command = f"{self._real_path} {self._app_params or ''}"
+ start_command = f"{self._make_real_path()} {self._app_params or ''}"
if self._privileged:
start_command = self._node.main_session._get_privileged_command(start_command)
return start_command
@@ -250,9 +242,13 @@ def close(self) -> None:
raise InteractiveSSHTimeoutError("Application 'exit' command") from e
self._ssh_channel.close()
- def _update_real_path(self, path: PurePath) -> None:
- """Updates the interactive shell's real path used at command line."""
- self._real_path = self._node.main_session.join_remote_path(path)
+ @property
+ @abstractmethod
+ def path(self) -> PurePath:
+ """Path to the shell executable."""
+
+ def _make_real_path(self) -> PurePath:
+ return self._node.main_session.join_remote_path(self.path)
def __enter__(self) -> Self:
"""Enter the context block.
@@ -27,8 +27,10 @@ class PythonShell(InteractiveShell):
#: This forces the prompt to appear after sending a command.
_command_extra_chars: ClassVar[str] = "\n"
- #: The Python executable.
- path: ClassVar[PurePath] = PurePath("python3")
+ @property
+ def path(self) -> PurePath:
+ """Path to the Python3 executable."""
+ return PurePath("python3")
def close(self):
"""Close Python shell."""
@@ -1520,9 +1520,6 @@ class TestPmdShell(DPDKShell):
_app_params: TestPmdParams
_ports: list[TestPmdPort] | None
- #: The path to the testpmd executable.
- path: ClassVar[PurePath] = PurePath("app", "dpdk-testpmd")
-
#: The testpmd's prompt.
_default_prompt: ClassVar[str] = "testpmd>"
@@ -1544,6 +1541,11 @@ def __init__(
self.ports_started = not self._app_params.disable_device_start
self._ports = None
+ @property
+ def path(self) -> PurePath:
+ """The path to the testpmd executable."""
+ return PurePath("app/dpdk-testpmd")
+
@property
def ports(self) -> list[TestPmdPort]:
"""The ports of the instance.