diff options
author | Luca Vizzarro <luca.vizzarro@arm.com> | 2024-06-19 15:03:05 +0100 |
---|---|---|
committer | Thomas Monjalon <thomas@monjalon.net> | 2024-06-20 05:34:53 +0200 |
commit | 87ba4cdc0dbbb5b74556da6a9175804f2f7d74a5 (patch) | |
tree | 4abf7ce16df80698cb1d21712b8997101f74781a | |
parent | bfad0948df75e95e04cba1804a2749cfc91c56fb (diff) |
dts: use Unpack for type checking and hinting
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.vizzarro@arm.com>
Reviewed-by: Paul Szczepanek <paul.szczepanek@arm.com>
Reviewed-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
Reviewed-by: Jeremy Spewock <jspewock@iol.unh.edu>
Reviewed-by: Nicholas Pratte <npratte@iol.unh.edu>
-rw-r--r-- | dts/framework/params/types.py | 133 | ||||
-rw-r--r-- | dts/framework/remote_session/testpmd_shell.py | 5 |
2 files changed, 136 insertions, 2 deletions
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 a8882a32fd..ec22f72221 100644 --- a/dts/framework/remote_session/testpmd_shell.py +++ b/dts/framework/remote_session/testpmd_shell.py @@ -21,10 +21,11 @@ from enum import Flag, auto from pathlib import PurePath from typing import ClassVar -from typing_extensions import Self +from typing_extensions import Self, Unpack from framework.exception import InteractiveCommandExecutionError from framework.params.testpmd import 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 @@ -604,7 +605,7 @@ class TestPmdShell(DPDKShell): 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__( |