From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 81710440EC;
	Tue, 28 May 2024 17:50:29 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 6BC24406B7;
	Tue, 28 May 2024 17:50:29 +0200 (CEST)
Received: from mail-lj1-f175.google.com (mail-lj1-f175.google.com
 [209.85.208.175])
 by mails.dpdk.org (Postfix) with ESMTP id B498E402E4
 for <dev@dpdk.org>; Tue, 28 May 2024 17:50:27 +0200 (CEST)
Received: by mail-lj1-f175.google.com with SMTP id
 38308e7fff4ca-2e98a5b955aso840931fa.1
 for <dev@dpdk.org>; Tue, 28 May 2024 08:50:27 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=iol.unh.edu; s=unh-iol; t=1716911427; x=1717516227; darn=dpdk.org;
 h=content-transfer-encoding:cc:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:from:to:cc:subject:date
 :message-id:reply-to;
 bh=6OiVi8KdSSP83Q0pVjgN5rMUKI8Ie0DbchGBkvnSAcs=;
 b=YoqaK6YqbE/Mo1dLpKG89JXHL8M54mYzEjNrEXDIhZSkByw4B7WfjCPIhJ9Uz1o0Vp
 xyGCy+d29Lsfku0XyqpC9lMnjHpZKIl+QajOTehAUhi5SD34xJQKKSzMfsuabpDuLObj
 xfUyBu6/BMAAoikEY6+7fbDwC6EFkvNDAmfZ4=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1716911427; x=1717516227;
 h=content-transfer-encoding:cc:to:subject:message-id:date:from
 :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc
 :subject:date:message-id:reply-to;
 bh=6OiVi8KdSSP83Q0pVjgN5rMUKI8Ie0DbchGBkvnSAcs=;
 b=iXh5LMdgaDpAEqfJJvcG44LsfTdwe5nAcAomFjmdOK/KgYy1jYF5Rxd9XS8zNYtF2V
 SC2TtS1yh+b+U1tdlAk/dKA4lcjRvIGeiJYlQCp0kHGu8Qs5bPq1Z86ufK0jrtVhXkkw
 dZrIIgOAsAVFa3uyJvwLu1iC9evBSsCTe1itvH1ViXK0zuuOBwQSaqXDrW2G82dDnM/u
 FGxZ9SdiLaFfzDTKvn7IysriNdwxz9HbvUH61mHQouI+canzsubSzlTD9MbKTGKC0tWD
 383E6wHW+ns1V6z0G660AE5QbTzk7m+U/X4SwVtnFw1fGH8Z3yrgUQmb0cXC9gE8hpap
 05wA==
X-Gm-Message-State: AOJu0YzHqxrIths9Tg0gGuqVRjjuc71n2BHCJtzWK/cUL1imClj9KQPS
 myf0ML2ViBWsM2kOqmIoh6wj3FjeVSa8ZMV5OhkVQ+Cq3M3fKp6ctqTjxTiLQmFdlS77RL9MJjA
 RMrkiO+JzDhk61lgBD60/RB58hjLkU6WHhnijIw==
X-Google-Smtp-Source: AGHT+IEUg9C+6NXjKW8+B7D9meSCWbWFYjxXQf49qxvoU9h8qjccErZ+NVQWQk5FjHP8zA6sgCKhdfuVTSa2fId72aw=
X-Received: by 2002:a2e:700d:0:b0:2e9:8417:bd83 with SMTP id
 38308e7fff4ca-2e98417c2f6mr20415141fa.2.1716911427206; Tue, 28 May 2024
 08:50:27 -0700 (PDT)
MIME-Version: 1.0
References: <20240326190422.577028-1-luca.vizzarro@arm.com>
 <20240509112057.1167947-1-luca.vizzarro@arm.com>
 <20240509112057.1167947-9-luca.vizzarro@arm.com>
In-Reply-To: <20240509112057.1167947-9-luca.vizzarro@arm.com>
From: Nicholas Pratte <npratte@iol.unh.edu>
Date: Tue, 28 May 2024 11:50:16 -0400
Message-ID: <CAKXZ7ehqr82FzEc2OhKvYZQnuhCwjhmqRLaC+rOsMk3PB2jAHA@mail.gmail.com>
Subject: Re: [PATCH v2 8/8] dts: use Unpack for type checking and hinting
To: Luca Vizzarro <luca.vizzarro@arm.com>
Cc: dev@dpdk.org, =?UTF-8?Q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>, 
 Jeremy Spewock <jspewock@iol.unh.edu>,
 Paul Szczepanek <paul.szczepanek@arm.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

Tested-by: Nicholas Pratte <npratte@iol.unh.edu>
Reviewed-by: Nicholas Pratte <npratte@iol.unh.edu>

On Thu, May 9, 2024 at 7:21=E2=80=AFAM Luca Vizzarro <luca.vizzarro@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.vizzarro@arm.com>
> Reviewed-by: Paul Szczepanek <paul.szczepanek@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.p=
y
> 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 t=
yping and hinting.
> +
> +TypedDicts can be used in conjunction with Unpack and kwargs for type hi=
nting on function calls.
> +
> +Example:
> +    ..code:: python
> +        def create_testpmd(**kwargs: Unpack[TestPmdParamsDict]):
> +            params =3D 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=3DFalse):
> +    """: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=3DFalse):
> +    """: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 | AnonMempoolAl=
locationMode | None
> +    record_core_cycles: Switch
> +    record_burst_status: Switch
> diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framewor=
k/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, TestPmdParam=
s
> +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, LogicalCoreLis=
t
> @@ -76,7 +79,7 @@ def __init__(
>          ascending_cores: bool =3D True,
>          append_prefix_timestamp: bool =3D True,
>          start_on_init: bool =3D True,
> -        **app_params,
> +        **app_params: Unpack[TestPmdParamsDict],
>      ) -> None:
>          """Overrides :meth:`~.dpdk_shell.DPDKShell.__init__`. Changes ap=
p_params to kwargs."""
>          super().__init__(
> --
> 2.34.1
>