Tested-by: Nicholas Pratte <npra...@iol.unh.edu> Reviewed-by: Nicholas Pratte <npra...@iol.unh.edu>
On Thu, May 9, 2024 at 7:21 AM Luca Vizzarro <luca.vizza...@arm.com> wrote: > > Interactive shells that inherit DPDKShell initialise their params > classes from a kwargs dict. Therefore, static type checking is > disabled. This change uses the functionality of Unpack added in > PEP 692 to re-enable it. The disadvantage is that this functionality has > been implemented only with TypedDict, forcing the creation of TypedDict > mirrors of the Params classes. > > Signed-off-by: Luca Vizzarro <luca.vizza...@arm.com> > Reviewed-by: Paul Szczepanek <paul.szczepa...@arm.com> > --- > dts/framework/params/types.py | 133 ++++++++++++++++++ > dts/framework/remote_session/testpmd_shell.py | 5 +- > 2 files changed, 137 insertions(+), 1 deletion(-) > create mode 100644 dts/framework/params/types.py > > diff --git a/dts/framework/params/types.py b/dts/framework/params/types.py > new file mode 100644 > index 0000000000..e668f658d8 > --- /dev/null > +++ b/dts/framework/params/types.py > @@ -0,0 +1,133 @@ > +# SPDX-License-Identifier: BSD-3-Clause > +# Copyright(c) 2024 Arm Limited > + > +"""Module containing TypeDict-equivalents of Params classes for static > typing and hinting. > + > +TypedDicts can be used in conjunction with Unpack and kwargs for type > hinting on function calls. > + > +Example: > + ..code:: python > + def create_testpmd(**kwargs: Unpack[TestPmdParamsDict]): > + params = TestPmdParams(**kwargs) > +""" > + > +from pathlib import PurePath > +from typing import TypedDict > + > +from framework.params import Switch, YesNoSwitch > +from framework.params.testpmd import ( > + AnonMempoolAllocationMode, > + EthPeer, > + Event, > + FlowGenForwardingMode, > + HairpinMode, > + NoisyForwardingMode, > + Params, > + PortNUMAConfig, > + PortTopology, > + RingNUMAConfig, > + RSSSetting, > + RXMultiQueueMode, > + RXRingParams, > + SimpleForwardingModes, > + SimpleMempoolAllocationMode, > + TxIPAddrPair, > + TXOnlyForwardingMode, > + TXRingParams, > + TxUDPPortPair, > +) > +from framework.testbed_model.cpu import LogicalCoreList > +from framework.testbed_model.port import Port > +from framework.testbed_model.virtual_device import VirtualDevice > + > + > +class EalParamsDict(TypedDict, total=False): > + """:class:`TypedDict` equivalent of :class:`~.eal.EalParams`.""" > + > + lcore_list: LogicalCoreList | None > + memory_channels: int | None > + prefix: str > + no_pci: Switch > + vdevs: list[VirtualDevice] | None > + ports: list[Port] | None > + other_eal_param: Params | None > + > + > +class TestPmdParamsDict(EalParamsDict, total=False): > + """:class:`TypedDict` equivalent of :class:`~.testpmd.TestPmdParams`.""" > + > + interactive_mode: Switch > + auto_start: Switch > + tx_first: Switch > + stats_period: int | None > + display_xstats: list[str] | None > + nb_cores: int | None > + coremask: int | None > + nb_ports: int | None > + port_topology: PortTopology | None > + portmask: int | None > + portlist: str | None > + numa: YesNoSwitch > + socket_num: int | None > + port_numa_config: list[PortNUMAConfig] | None > + ring_numa_config: list[RingNUMAConfig] | None > + total_num_mbufs: int | None > + mbuf_size: list[int] | None > + mbcache: int | None > + max_pkt_len: int | None > + eth_peers_configfile: PurePath | None > + eth_peer: list[EthPeer] | None > + tx_ip: TxIPAddrPair | None > + tx_udp: TxUDPPortPair | None > + enable_lro: Switch > + max_lro_pkt_size: int | None > + disable_crc_strip: Switch > + enable_scatter: Switch > + enable_hw_vlan: Switch > + enable_hw_vlan_filter: Switch > + enable_hw_vlan_strip: Switch > + enable_hw_vlan_extend: Switch > + enable_hw_qinq_strip: Switch > + pkt_drop_enabled: Switch > + rss: RSSSetting | None > + forward_mode: ( > + SimpleForwardingModes > + | FlowGenForwardingMode > + | TXOnlyForwardingMode > + | NoisyForwardingMode > + | None > + ) > + hairpin_mode: HairpinMode | None > + hairpin_queues: int | None > + burst: int | None > + enable_rx_cksum: Switch > + rx_queues: int | None > + rx_ring: RXRingParams | None > + no_flush_rx: Switch > + rx_segments_offsets: list[int] | None > + rx_segments_length: list[int] | None > + multi_rx_mempool: Switch > + rx_shared_queue: Switch | int > + rx_offloads: int | None > + rx_mq_mode: RXMultiQueueMode | None > + tx_queues: int | None > + tx_ring: TXRingParams | None > + tx_offloads: int | None > + eth_link_speed: int | None > + disable_link_check: Switch > + disable_device_start: Switch > + no_lsc_interrupt: Switch > + no_rmv_interrupt: Switch > + bitrate_stats: int | None > + latencystats: int | None > + print_events: list[Event] | None > + mask_events: list[Event] | None > + flow_isolate_all: Switch > + disable_flow_flush: Switch > + hot_plug: Switch > + vxlan_gpe_port: int | None > + geneve_parsed_port: int | None > + lock_all_memory: YesNoSwitch > + mempool_allocation_mode: SimpleMempoolAllocationMode | > AnonMempoolAllocationMode | None > + record_core_cycles: Switch > + record_burst_status: Switch > diff --git a/dts/framework/remote_session/testpmd_shell.py > b/dts/framework/remote_session/testpmd_shell.py > index 92930d7fbb..5b3a7bb9ab 100644 > --- a/dts/framework/remote_session/testpmd_shell.py > +++ b/dts/framework/remote_session/testpmd_shell.py > @@ -18,8 +18,11 @@ > from pathlib import PurePath > from typing import ClassVar > > +from typing_extensions import Unpack > + > from framework.exception import InteractiveCommandExecutionError > from framework.params.testpmd import SimpleForwardingModes, TestPmdParams > +from framework.params.types import TestPmdParamsDict > from framework.remote_session.dpdk_shell import DPDKShell > from framework.settings import SETTINGS > from framework.testbed_model.cpu import LogicalCoreCount, LogicalCoreList > @@ -76,7 +79,7 @@ def __init__( > ascending_cores: bool = True, > append_prefix_timestamp: bool = True, > start_on_init: bool = True, > - **app_params, > + **app_params: Unpack[TestPmdParamsDict], > ) -> None: > """Overrides :meth:`~.dpdk_shell.DPDKShell.__init__`. Changes > app_params to kwargs.""" > super().__init__( > -- > 2.34.1 >