From: Jeremy Spewock <jspewock@iol.unh.edu>
To: "Juraj Linkeš" <juraj.linkes@pantheon.tech>
Cc: Honnappa.Nagarahalli@arm.com, probb@iol.unh.edu,
paul.szczepanek@arm.com, thomas@monjalon.net,
wathsala.vithanage@arm.com, npratte@iol.unh.edu,
yoan.picchi@foss.arm.com, Luca.Vizzarro@arm.com, dev@dpdk.org
Subject: Re: [PATCH v3 3/4] dts: add methods for modifying MTU to testpmd shell
Date: Mon, 10 Jun 2024 16:07:22 -0400 [thread overview]
Message-ID: <CAAA20UTFCcA+6ZvWPwhiNFO99K4utx0923qGbAvA652yVbY6GA@mail.gmail.com> (raw)
In-Reply-To: <1e972b74-38b2-474c-b92c-e114ec5ce7cf@pantheon.tech>
On Mon, Jun 10, 2024 at 11:03 AM Juraj Linkeš
<juraj.linkes@pantheon.tech> wrote:
>
>
>
> On 5. 6. 2024 23:31, jspewock@iol.unh.edu wrote:
> > From: Jeremy Spewock <jspewock@iol.unh.edu>
> >
> > There are methods within DTS currently that support updating the MTU of
> > ports on a node, but the methods for doing this in a linux session rely
> > on the ip command and the port being bound to the kernel driver. Since
> > test suites are run while bound to the driver for DPDK, there needs to
> > be a way to modify the value while bound to said driver as well. This is
> > done by using testpmd to modify the MTU.
> >
> > Signed-off-by: Jeremy Spewock <jspewock@iol.unh.edu>
> > ---
> > .../remote_session/interactive_shell.py | 14 +++-
> > dts/framework/remote_session/testpmd_shell.py | 76 ++++++++++++++++++-
> > 2 files changed, 86 insertions(+), 4 deletions(-)
> >
> > diff --git a/dts/framework/remote_session/interactive_shell.py b/dts/framework/remote_session/interactive_shell.py
> > index 6dee7ebce0..34d1acf439 100644
> > --- a/dts/framework/remote_session/interactive_shell.py
> > +++ b/dts/framework/remote_session/interactive_shell.py
> > @@ -139,7 +139,9 @@ def _start_application(self, get_privileged_command: Callable[[str], str] | None
> > raise InteractiveCommandExecutionError("Failed to start application.")
> > self._ssh_channel.settimeout(self._timeout)
> >
> > - def send_command(self, command: str, prompt: str | None = None) -> str:
> > + def send_command(
> > + self, command: str, prompt: str | None = None, print_to_debug: bool = False
> > + ) -> str:
>
> As I mentioned in v2, this really should be in a separate patch, as it
> affects other parts of the code and the solution should be designed with
> that in mind.
Ack.
>
> > """Send `command` and get all output before the expected ending string.
> >
> > Lines that expect input are not included in the stdout buffer, so they cannot
> > @@ -155,6 +157,10 @@ def send_command(self, command: str, prompt: str | None = None) -> str:
> > command: The command to send.
> > prompt: After sending the command, `send_command` will be expecting this string.
> > If :data:`None`, will use the class's default prompt.
> > + print_to_debug: If :data:`True` the logging message that displays what command is
> > + being sent prior to sending it will be logged at the debug level instead of the
> > + info level. Useful when a single action requires multiple commands to complete to
> > + avoid clutter in the logs.
> >
> > Returns:
> > All output in the buffer before expected string.
> > @@ -163,7 +169,11 @@ def send_command(self, command: str, prompt: str | None = None) -> str:
> > raise InteractiveCommandExecutionError(
> > f"Cannot send command {command} to application because the shell is not running."
> > )
> > - self._logger.info(f"Sending: '{command}'")
> > + log_message = f"Sending: '{command}'"
> > + if print_to_debug:
> > + self._logger.debug(log_message)
> > + else:
> > + self._logger.info(log_message)
> > if prompt is None:
> > prompt = self._default_prompt
> > self._stdin.write(f"{command}{self._command_extra_chars}\n")
> > diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framework/remote_session/testpmd_shell.py
> > index ca30aac264..f2fa842b7f 100644
> > --- a/dts/framework/remote_session/testpmd_shell.py
> > +++ b/dts/framework/remote_session/testpmd_shell.py
> > @@ -135,10 +135,11 @@ def start(self, verify: bool = True) -> None:
> > InteractiveCommandExecutionError: If `verify` is :data:`True` and forwarding fails to
> > start or ports fail to come up.
> > """
> > - self.send_command("start")
> > + self._logger.info('Starting packet forwarding and waiting for port links to be "up".')
> > + self.send_command("start", print_to_debug=True)
> > if verify:
> > # If forwarding was already started, sending "start" again should tell us
> > - start_cmd_output = self.send_command("start")
> > + start_cmd_output = self.send_command("start", print_to_debug=True)
> > if "Packet forwarding already started" not in start_cmd_output:
> > self._logger.debug(f"Failed to start packet forwarding: \n{start_cmd_output}")
> > raise InteractiveCommandExecutionError("Testpmd failed to start packet forwarding.")
> > @@ -227,6 +228,77 @@ def set_forward_mode(self, mode: TestPmdForwardingModes, verify: bool = True):
> > f"Test pmd failed to set fwd mode to {mode.value}"
> > )
> >
> > + def _stop_port(self, port_id: int, verify: bool = True) -> None:
> > + """Stop port `port_id` in testpmd.
>
> Either "Stop `port_id` in testpmd." or "Stop port with `port_id` in
> testpmd.". I like the latter more.
Ack.
>
> > +
> > + Depending on the PMD, the port may need to be stopped before configuration can take place.
> > + This method wraps the command needed to properly stop ports and take their link down.
> > +
> > + Args:
> > + port_id: ID of the port to take down.
> > + verify: If :data:`True` the output will be scanned in an attempt to verify that the
> > + stopping of ports was successful. Defaults to True.
> > +
> > + Raises:
> > + InteractiveCommandExecutionError: If `verify` is :data:`True` and the port did not
> > + successfully stop.
> > + """
> > + stop_port_output = self.send_command(f"port stop {port_id}", print_to_debug=True)
> > + if verify and ("Done" not in stop_port_output):
> > + self._logger.debug(f"Failed to stop port {port_id}. Output was:\n{stop_port_output}")
> > + raise InteractiveCommandExecutionError(f"Test pmd failed to stop port {port_id}.")
> > +
> > + def _start_port(self, port_id: int, verify: bool = True) -> None:
> > + """Start port `port_id` in testpmd.
> > +
> > + Because the port may need to be stopped to make some configuration changes, it naturally
> > + follows that it will need to be started again once those changes have been made.
> > +
> > + Args:
> > + port_id: ID of the port to start.
> > + verify: If :data:`True` the output will be scanned in an attempt to verify that the
> > + port came back up without error. Defaults to True.
> > +
> > + Raises:
> > + InteractiveCommandExecutionError: If `verify` is :data:`True` and the port did not come
> > + back up.
> > + """
> > + start_port_output = self.send_command(f"port start {port_id}", print_to_debug=True)
> > + if verify and ("Done" not in start_port_output):
> > + self._logger.debug(f"Failed to start port {port_id}. Output was:\n{start_port_output}")
> > + raise InteractiveCommandExecutionError(f"Test pmd failed to start port {port_id}.")
> > +
> > + def set_port_mtu(self, port_id: int, mtu: int, verify: bool = True) -> None:
> > + """Change the MTU of a port using testpmd.
> > +
> > + Some PMDs require that the port be stopped before changing the MTU, and it does no harm to
> > + stop the port before configuring in cases where it isn't required, so we first stop ports,
> > + then update the MTU, then start the ports again afterwards.
> > +
> > + Args:
> > + port_id: ID of the port to adjust the MTU on.
> > + mtu: Desired value for the MTU to be set to.
> > + verify: If `verify` is :data:`True` then the output will be scanned in an attempt to
> > + verify that the mtu was properly set on the port. Defaults to True.
>
> The second instance of True should also be :data:`True`.
Ugh, good catch! My IDE generates boilerplate for them for me and I
caught this in another method I added here, but I guess I missed this
one.
>
> > +
> > + Raises:
> > + InteractiveCommandExecutionError: If `verify` is :data:`True` and the MTU was not
> > + properly updated on the port matching `port_id`.
> > + """
> > + self._logger.info(f"Changing MTU of port {port_id} to be {mtu}")
> > + self._stop_port(port_id, verify)
> > + set_mtu_output = self.send_command(f"port config mtu {port_id} {mtu}", print_to_debug=True)
> > + self._start_port(port_id, verify)
>
> Would making _stop_port and _start_port a decorator work? Can we do the
> verification even if the port is stopped?
I like this idea a lot. I just checked and it looks like you can do
the validation while the port is stopped, so I'll make this change.
>
> > + if verify and (
> > + f"MTU: {mtu}" not in self.send_command(f"show port info {port_id}", print_to_debug=True)
> > + ):
> > + self._logger.debug(
> > + f"Failed to set mtu to {mtu} on port {port_id}." f" Output was:\n{set_mtu_output}"
> > + )
> > + raise InteractiveCommandExecutionError(
> > + f"Test pmd failed to update mtu of port {port_id} to {mtu}"
> > + )
> > +
> > def _close(self) -> None:
> > """Overrides :meth:`~.interactive_shell.close`."""
> > self.send_command("quit", "Bye...")
next prev parent reply other threads:[~2024-06-10 20:07 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-14 20:14 [PATCH v1 0/4] Add second scatter test case jspewock
2024-05-14 20:14 ` [PATCH v1 1/4] dts: improve starting and stopping interactive shells jspewock
2024-05-20 17:17 ` Luca Vizzarro
2024-05-22 13:43 ` Patrick Robb
2024-05-14 20:14 ` [PATCH v1 2/4] dts: add context manager for " jspewock
2024-05-20 17:30 ` Luca Vizzarro
2024-05-29 20:37 ` Jeremy Spewock
2024-05-22 13:53 ` Patrick Robb
2024-05-29 20:37 ` Jeremy Spewock
2024-05-14 20:14 ` [PATCH v1 3/4] dts: add methods for modifying MTU to testpmd shell jspewock
2024-05-20 17:35 ` Luca Vizzarro
2024-05-29 20:38 ` Jeremy Spewock
2024-05-22 16:10 ` Patrick Robb
2024-05-14 20:14 ` [PATCH v1 4/4] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
2024-05-20 17:56 ` Luca Vizzarro
2024-05-29 20:40 ` Jeremy Spewock
2024-05-30 9:47 ` Luca Vizzarro
2024-05-30 16:33 ` [PATCH v2 0/4] Add second scatter test case jspewock
2024-05-30 16:33 ` [PATCH v2 1/4] dts: improve starting and stopping interactive shells jspewock
2024-05-31 16:37 ` Luca Vizzarro
2024-05-31 21:07 ` Jeremy Spewock
2024-05-30 16:33 ` [PATCH v2 2/4] dts: add context manager for " jspewock
2024-05-31 16:38 ` Luca Vizzarro
2024-05-30 16:33 ` [PATCH v2 3/4] dts: add methods for modifying MTU to testpmd shell jspewock
2024-05-31 16:34 ` Luca Vizzarro
2024-05-31 21:08 ` Jeremy Spewock
2024-06-10 14:35 ` Juraj Linkeš
2024-05-30 16:33 ` [PATCH v2 4/4] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
2024-05-31 16:33 ` Luca Vizzarro
2024-05-31 21:08 ` Jeremy Spewock
2024-06-05 21:31 ` [PATCH v3 0/4] Add second scatter test case jspewock
2024-06-05 21:31 ` [PATCH v3 1/4] dts: improve starting and stopping interactive shells jspewock
2024-06-10 13:36 ` Juraj Linkeš
2024-06-10 19:27 ` Jeremy Spewock
2024-06-05 21:31 ` [PATCH v3 2/4] dts: add context manager for " jspewock
2024-06-10 14:31 ` Juraj Linkeš
2024-06-10 20:06 ` Jeremy Spewock
2024-06-11 9:17 ` Juraj Linkeš
2024-06-11 15:33 ` Jeremy Spewock
2024-06-12 8:37 ` Juraj Linkeš
2024-06-05 21:31 ` [PATCH v3 3/4] dts: add methods for modifying MTU to testpmd shell jspewock
2024-06-10 15:03 ` Juraj Linkeš
2024-06-10 20:07 ` Jeremy Spewock [this message]
2024-06-05 21:31 ` [PATCH v3 4/4] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
2024-06-10 15:22 ` Juraj Linkeš
2024-06-10 20:08 ` Jeremy Spewock
2024-06-11 9:22 ` Juraj Linkeš
2024-06-11 15:33 ` Jeremy Spewock
2024-06-13 18:15 ` [PATCH v4 0/4] Add second scatter test case jspewock
2024-06-13 18:15 ` [PATCH v4 1/4] dts: add context manager for interactive shells jspewock
2024-06-18 15:47 ` Juraj Linkeš
2024-06-13 18:15 ` [PATCH v4 2/4] dts: improve starting and stopping " jspewock
2024-06-18 15:54 ` Juraj Linkeš
2024-06-18 16:47 ` Jeremy Spewock
2024-06-13 18:15 ` [PATCH v4 3/4] dts: add methods for modifying MTU to testpmd shell jspewock
2024-06-19 8:16 ` Juraj Linkeš
2024-06-20 19:23 ` Jeremy Spewock
2024-06-21 8:08 ` Juraj Linkeš
2024-06-13 18:15 ` [PATCH v4 4/4] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
2024-06-19 8:51 ` Juraj Linkeš
2024-06-20 19:24 ` Jeremy Spewock
2024-06-21 8:32 ` Juraj Linkeš
2024-06-25 16:27 ` [PATCH v5 0/4] Add second scatter test case jspewock
2024-06-25 16:27 ` [PATCH v5 1/4] dts: add context manager for interactive shells jspewock
2024-06-25 16:27 ` [PATCH v5 2/4] dts: improve starting and stopping " jspewock
2024-06-25 16:27 ` [PATCH v5 3/4] dts: add methods for modifying MTU to testpmd shell jspewock
2024-06-25 16:27 ` [PATCH v5 4/4] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
2024-06-28 17:32 ` [PATCH v6 0/4] Add second scatter test case jspewock
2024-06-28 17:32 ` [PATCH v6 1/4] dts: add context manager for interactive shells jspewock
2024-06-28 17:32 ` [PATCH v6 2/4] dts: improve starting and stopping " jspewock
2024-06-28 17:32 ` [PATCH v6 3/4] dts: add methods for modifying MTU to testpmd shell jspewock
2024-06-28 17:32 ` [PATCH v6 4/4] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
2024-07-09 17:53 ` [PATCH v7 0/2] Add second scatter test case jspewock
2024-07-09 17:53 ` [PATCH v7 1/2] dts: add methods for modifying MTU to testpmd shell jspewock
2024-08-20 13:05 ` Juraj Linkeš
2024-08-20 14:38 ` Jeremy Spewock
2024-07-09 17:53 ` [PATCH v7 2/2] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
2024-08-27 17:22 ` [PATCH v8 0/1] dts: add second scatter test case jspewock
2024-08-27 17:22 ` [PATCH v8 1/1] dts: add test case that utilizes offload to pmd_buffer_scatter jspewock
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=CAAA20UTFCcA+6ZvWPwhiNFO99K4utx0923qGbAvA652yVbY6GA@mail.gmail.com \
--to=jspewock@iol.unh.edu \
--cc=Honnappa.Nagarahalli@arm.com \
--cc=Luca.Vizzarro@arm.com \
--cc=dev@dpdk.org \
--cc=juraj.linkes@pantheon.tech \
--cc=npratte@iol.unh.edu \
--cc=paul.szczepanek@arm.com \
--cc=probb@iol.unh.edu \
--cc=thomas@monjalon.net \
--cc=wathsala.vithanage@arm.com \
--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).