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
>

Reply via email to