From patchwork Wed May 1 16:16:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jeremy Spewock X-Patchwork-Id: 139771 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id DEBE743F5D; Wed, 1 May 2024 18:17:33 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2ABCD402E4; Wed, 1 May 2024 18:17:30 +0200 (CEST) Received: from mail-qk1-f227.google.com (mail-qk1-f227.google.com [209.85.222.227]) by mails.dpdk.org (Postfix) with ESMTP id 2ACC8402E1 for ; Wed, 1 May 2024 18:17:29 +0200 (CEST) Received: by mail-qk1-f227.google.com with SMTP id af79cd13be357-78f03917484so477818785a.3 for ; Wed, 01 May 2024 09:17:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; t=1714580248; x=1715185048; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=W43tcSoEIDmhOS6XRsVDQlQAWz7Lh27HnfQeI3st7ic=; b=ddRoPKX+A5+KtxRA3jZYx37aq/OxbiMEKjnzpA9Mg5DaJQ/cwAyK5F+tQztgwmLVx9 A8n77bx5Ao7IzFnLFlhP4/GOTga8dKTLJOayX6PLWsCD5u/8LkUvBg0reIZgh2jNfiQ6 54LAE3wggHxicMJ9XqxY5ls5K2r0/vw/LUWc0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714580248; x=1715185048; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=W43tcSoEIDmhOS6XRsVDQlQAWz7Lh27HnfQeI3st7ic=; b=IeG8U8SLvedog7i79px9K58NWTwcttClb4izbTuFSNZ2wpYXk8XsG5blJe/+K5svxc dUggd9o6jqCNyiniZfJPAeWhD2sGh0B1qp47nDRjbmh8/svFGrHshBHw0lwVtZbgs1ks 04CIfX7rObyS4j4eOLtP1wy+6yn69Aok22uNaX3G8/bIClwlb46M9vsRlRTPdVzHgxb8 qE++sbuNHVUj1rSwjg5sb1RN8flvX0vGThPMfxeDaCtzj5St7lMkqQWwAuotRh85Ijdp 3W0DY0c5Gg4POC554taVKhfomObmEZSIQkAzT7Rnh27QfPN0rduA8FPjZVFY4AFOlKis hmKw== X-Gm-Message-State: AOJu0YyTcGttmg+S9YrgeUr0e9vLXeFLarCgD7ZQpDE7zMkb7fidUhT+ eM0CRDTkkDYxXwwI6ORblk2eUCJgFipwK41jMiygdUKlqYlyccBZgAM5QjHHqRSS1tBpfOoJlU3 D74lvceK54ioqhfzPFFkX88QX0gR4GGKB X-Google-Smtp-Source: AGHT+IFlyGp9mw1I3iIxx44ym18Y8NqO1ZSgQaXWVIK42a9rOjw+GzOJe2tj/QY5zbxAqtAkef6NUPh1fa/b X-Received: by 2002:a05:6214:ca3:b0:6a0:9770:39c2 with SMTP id s3-20020a0562140ca300b006a0977039c2mr2546732qvs.54.1714580248495; Wed, 01 May 2024 09:17:28 -0700 (PDT) Received: from postal.iol.unh.edu (postal.iol.unh.edu. [132.177.123.84]) by smtp-relay.gmail.com with ESMTPS id r5-20020a0cf605000000b006a0f7e9e0a5sm74321qvm.23.2024.05.01.09.17.28 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 May 2024 09:17:28 -0700 (PDT) X-Relaying-Domain: iol.unh.edu Received: from iol.unh.edu (unknown [IPv6:2606:4100:3880:1271:90f9:1b64:f6e6:867f]) by postal.iol.unh.edu (Postfix) with ESMTP id 0D3936052514; Wed, 1 May 2024 12:17:28 -0400 (EDT) From: jspewock@iol.unh.edu To: Luca.Vizzarro@arm.com, wathsala.vithanage@arm.com, yoan.picchi@foss.arm.com, juraj.linkes@pantheon.tech, paul.szczepanek@arm.com, probb@iol.unh.edu, thomas@monjalon.net, Honnappa.Nagarahalli@arm.com Cc: dev@dpdk.org, Jeremy Spewock Subject: [PATCH v2 2/3] dts: Add missing docstring from XML-RPC server Date: Wed, 1 May 2024 12:16:22 -0400 Message-ID: <20240501161623.26672-3-jspewock@iol.unh.edu> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240501161623.26672-1-jspewock@iol.unh.edu> References: <20240312172558.11844-1-jspewock@iol.unh.edu> <20240501161623.26672-1-jspewock@iol.unh.edu> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Jeremy Spewock When this XML-RPC server implementation was added, the docstring had to be shortened in order to reduce the chances of this race condition being encountered. Now that this race condition issue is resolved, the full docstring can be restored. Signed-off-by: Jeremy Spewock Reviewed-by: Luca Vizzarro Reviewed-by: Juraj Linkeš --- .../testbed_model/traffic_generator/scapy.py | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/dts/framework/testbed_model/traffic_generator/scapy.py b/dts/framework/testbed_model/traffic_generator/scapy.py index df3069d516..d0e0a7c64e 100644 --- a/dts/framework/testbed_model/traffic_generator/scapy.py +++ b/dts/framework/testbed_model/traffic_generator/scapy.py @@ -128,9 +128,53 @@ def scapy_send_packets(xmlrpc_packets: list[xmlrpc.client.Binary], send_iface: s class QuittableXMLRPCServer(SimpleXMLRPCServer): - """Basic XML-RPC server. + r"""Basic XML-RPC server. The server may be augmented by functions serializable by the :mod:`marshal` module. + + Example: + :: + + def hello_world(): + # to be sent to the XML-RPC server + print("Hello World!") + + # start the XML-RPC server on the remote node + # the example assumes you're already connect to a tg_node + # this is done by starting a Python shell on the remote node + from framework.remote_session import PythonShell + session = tg_node.create_interactive_shell(PythonShell, timeout=5, privileged=True) + + # then importing the modules needed to run the server + # and the modules for any functions later added to the server + session.send_command("import xmlrpc") + session.send_command("from xmlrpc.server import SimpleXMLRPCServer") + + # sending the source code of this class to the Python shell + from xmlrpc.server import SimpleXMLRPCServer + src = inspect.getsource(QuittableXMLRPCServer) + src = "\n".join([l for l in src.splitlines() if not l.isspace() and l != ""]) + spacing = "\n" * 4 + session.send_command(spacing + src + spacing) + + # then starting the server with: + command = "s = QuittableXMLRPCServer(('0.0.0.0', {listen_port}));s.serve_forever()" + session.send_command(command, "XMLRPC OK") + + # now the server is running on the remote node and we can add functions to it + # first connect to the server from the execution node + import xmlrpc.client + server_url = f"http://{tg_node.config.hostname}:8000" + rpc_server_proxy = xmlrpc.client.ServerProxy(server_url) + + # get the function bytes to send + import marshal + function_bytes = marshal.dumps(hello_world.__code__) + rpc_server_proxy.add_rpc_function(hello_world.__name__, function_bytes) + + # now we can execute the function on the server + xmlrpc_binary_recv: xmlrpc.client.Binary = rpc_server_proxy.hello_world() + print(str(xmlrpc_binary_recv)) """ def __init__(self, *args, **kwargs):