This commit provides a state container for TestPmdShell. It currently only indicates whether the packet forwarding has started or not, and the number of ports which were given to the shell.
This also fixes the behaviour of `wait_link_status_up` to use the command timeout as inherited from InteractiveShell. Signed-off-by: Luca Vizzarro <luca.vizza...@arm.com> Reviewed-by: Jack Bond-Preston <jack.bond-pres...@arm.com> Reviewed-by: Honnappa Nagarahalli <honnappa.nagaraha...@arm.com> --- dts/framework/remote_session/testpmd_shell.py | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framework/remote_session/testpmd_shell.py index a823dc53be..ea1d254f86 100644 --- a/dts/framework/remote_session/testpmd_shell.py +++ b/dts/framework/remote_session/testpmd_shell.py @@ -678,19 +678,27 @@ def __str__(self) -> str: return self.pci_address +@dataclass(slots=True) +class TestPmdState: + """Session state container.""" + + #: + packet_forwarding_started: bool = False + + #: The number of ports which were allowed on the command-line when testpmd was started. + number_of_ports: int = 0 + + class TestPmdShell(InteractiveShell): """Testpmd interactive shell. The testpmd shell users should never use the :meth:`~.interactive_shell.InteractiveShell.send_command` method directly, but rather call specialized methods. If there isn't one that satisfies a need, it should be added. - - Attributes: - number_of_ports: The number of ports which were allowed on the command-line when testpmd - was started. """ - number_of_ports: int + #: Current state + state: TestPmdState = TestPmdState() #: The path to the testpmd executable. path: ClassVar[PurePath] = PurePath("app", "dpdk-testpmd") @@ -723,7 +731,13 @@ def _start_application(self, get_privileged_command: Callable[[str], str] | None if self._app_args.app_params is None: self._app_args.app_params = TestPmdParameters() - self.number_of_ports = len(self._app_args.ports) if self._app_args.ports is not None else 0 + assert isinstance(self._app_args.app_params, TestPmdParameters) + + if self._app_args.app_params.auto_start: + self.state.packet_forwarding_started = True + + if self._app_args.ports is not None: + self.state.number_of_ports = len(self._app_args.ports) super()._start_application(get_privileged_command) @@ -746,12 +760,14 @@ def start(self, verify: bool = True) -> None: self._logger.debug(f"Failed to start packet forwarding: \n{start_cmd_output}") raise InteractiveCommandExecutionError("Testpmd failed to start packet forwarding.") - for port_id in range(self.number_of_ports): + for port_id in range(self.state.number_of_ports): if not self.wait_link_status_up(port_id): raise InteractiveCommandExecutionError( "Not all ports came up after starting packet forwarding in testpmd." ) + self.state.packet_forwarding_started = True + def stop(self, verify: bool = True) -> None: """Stop packet forwarding. @@ -773,6 +789,8 @@ def stop(self, verify: bool = True) -> None: self._logger.debug(f"Failed to stop packet forwarding: \n{stop_cmd_output}") raise InteractiveCommandExecutionError("Testpmd failed to stop packet forwarding.") + self.state.packet_forwarding_started = False + def get_devices(self) -> list[TestPmdDevice]: """Get a list of device names that are known to testpmd. @@ -788,19 +806,16 @@ def get_devices(self) -> list[TestPmdDevice]: dev_list.append(TestPmdDevice(line)) return dev_list - def wait_link_status_up(self, port_id: int, timeout=SETTINGS.timeout) -> bool: - """Wait until the link status on the given port is "up". + def wait_link_status_up(self, port_id: int) -> bool: + """Wait until the link status on the given port is "up". Times out. Arguments: port_id: Port to check the link status on. - timeout: Time to wait for the link to come up. The default value for this - argument may be modified using the :option:`--timeout` command-line argument - or the :envvar:`DTS_TIMEOUT` environment variable. Returns: Whether the link came up in time or not. """ - time_to_stop = time.time() + timeout + time_to_stop = time.time() + self._timeout port_info: str = "" while time.time() < time_to_stop: port_info = self.send_command(f"show port info {port_id}") -- 2.34.1