get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/103226/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 103226,
    "url": "http://patchwork.dpdk.org/api/patches/103226/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dts/patch/20211029085706.1393-1-junx.dong@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patchwork.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20211029085706.1393-1-junx.dong@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20211029085706.1393-1-junx.dong@intel.com",
    "date": "2021-10-29T08:57:06",
    "name": "[V1] framework/*: add scapy modules to packet module",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "03a9098c7ecc9a84ddfa6a73820547800da0ebe2",
    "submitter": {
        "id": 2237,
        "url": "http://patchwork.dpdk.org/api/people/2237/?format=api",
        "name": "Jun Dong",
        "email": "junx.dong@intel.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.dpdk.org/project/dts/patch/20211029085706.1393-1-junx.dong@intel.com/mbox/",
    "series": [
        {
            "id": 20122,
            "url": "http://patchwork.dpdk.org/api/series/20122/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dts/list/?series=20122",
            "date": "2021-10-29T08:57:06",
            "name": "[V1] framework/*: add scapy modules to packet module",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/20122/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/103226/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/103226/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id BF792A0032;\n\tFri, 29 Oct 2021 10:57:19 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id AD064410E0;\n\tFri, 29 Oct 2021 10:57:19 +0200 (CEST)",
            "from mga06.intel.com (mga06.intel.com [134.134.136.31])\n by mails.dpdk.org (Postfix) with ESMTP id 1313740688\n for <dts@dpdk.org>; Fri, 29 Oct 2021 10:57:17 +0200 (CEST)",
            "from fmsmga005.fm.intel.com ([10.253.24.32])\n by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 29 Oct 2021 01:57:17 -0700",
            "from shwdenpg197.ccr.corp.intel.com ([10.253.106.73])\n by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 29 Oct 2021 01:57:12 -0700"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10151\"; a=\"291460164\"",
            "E=Sophos;i=\"5.87,192,1631602800\"; d=\"scan'208\";a=\"291460164\"",
            "E=Sophos;i=\"5.87,192,1631602800\"; d=\"scan'208\";a=\"726110136\""
        ],
        "From": "DongJunX <junx.dong@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "\"Dong,JunX\" <junx.dong@intel.com>, Dong@dpdk.org",
        "Date": "Fri, 29 Oct 2021 16:57:06 +0800",
        "Message-Id": "<20211029085706.1393-1-junx.dong@intel.com>",
        "X-Mailer": "git-send-email 2.33.1.windows.1",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dts] [PATCH V1] framework/*: add scapy modules to packet module",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org",
        "Sender": "\"dts\" <dts-bounces@dpdk.org>"
    },
    "content": "From: \"Dong,JunX\" <junx.dong@intel.com>\n\nscapy required modules contain itself contained modules and dts self \ncontained module, dts self contained module that be in dep dir must \ncopy from platform to tester, so can delay import the modules after \ntester copied it\n\nSigned-off-by: Dong,JunX <junx.dong@intel.com>\n---\n framework/packet.py | 32 +++++++++++++++-----------------\n framework/tester.py |  5 +++++\n 2 files changed, 20 insertions(+), 17 deletions(-)",
    "diff": "diff --git a/framework/packet.py b/framework/packet.py\nindex e6fd74a0..eb9d21df 100644\n--- a/framework/packet.py\n+++ b/framework/packet.py\n@@ -35,9 +35,7 @@ Base on scapy(python program for packet manipulation)\n \n from importlib import import_module\n from socket import AF_INET6\n-\n from scapy.all import *\n-\n from .utils import convert_int2ip, convert_ip2int\n \n # load extension layers\n@@ -50,20 +48,24 @@ if not os.path.exists(TMP_PATH):\n \n scapy_modules_required = {'scapy.contrib.gtp': ['GTP_U_Header', 'GTPPDUSessionContainer'],\n                           'scapy.contrib.lldp': ['LLDPDU', 'LLDPDUManagementAddress'],\n-                          'dep.scapy_modules.Dot1BR': ['Dot1BR'],\n+                          'Dot1BR': ['Dot1BR'],\n                           'scapy.contrib.pfcp': ['PFCP'],\n                           'scapy.contrib.nsh': ['NSH'],\n                           'scapy.contrib.igmp': ['IGMP'],\n                           'scapy.contrib.mpls': ['MPLS'],\n                           }\n \n-for m in scapy_modules_required:\n-    try:\n-        module = import_module(m)\n-        for clazz in scapy_modules_required[m]:\n-            locals().update({clazz: getattr(module, clazz)})\n-    except Exception as e:\n-        print(e)\n+\n+def bind_scapy_modules(_module_path):\n+    sys.path.append(_module_path)\n+    for _module in scapy_modules_required:\n+        try:\n+            module = import_module(_module)\n+            for clazz in scapy_modules_required[_module]:\n+                setattr(sys.modules[__name__], clazz, getattr(module, clazz))\n+        except Exception as e:\n+            print(e)\n+\n \n def get_scapy_module_impcmd():\n     cmd_li = list()\n@@ -71,11 +73,10 @@ def get_scapy_module_impcmd():\n         cmd_li.append(f'from {m} import {\",\".join(scapy_modules_required[m])}')\n     return ';'.join(cmd_li)\n \n-SCAPY_IMP_CMD = get_scapy_module_impcmd()\n \n+SCAPY_IMP_CMD = get_scapy_module_impcmd()\n # packet generator type should be configured later\n PACKETGEN = \"scapy\"\n-\n LayersTypes = {\n     \"L2\": ['ether', 'vlan', 'etag', '1588', 'arp', 'lldp', 'mpls', 'nsh'],\n     # ipv4_ext_unknown, ipv6_ext_unknown\n@@ -96,17 +97,15 @@ LayersTypes = {\n     \"INNER L4\": ['inner_tcp', 'inner_udp', 'inner_frag', 'inner_sctp', 'inner_icmp', 'inner_nofrag'],\n     \"PAYLOAD\": ['raw']\n }\n-\n # Saved background sniff process id\n SNIFF_PIDS = {}\n-\n # Saved packet generator process id\n # used in pktgen or tgen\n PKTGEN_PIDS = {}\n-\n # default filter for LLDP packet\n LLDP_FILTER = {'layer': 'ether', 'config': {'type': 'not lldp'}}\n \n+\n def write_raw_pkt(pkt_str, file_name):\n     tmp = eval(pkt_str)\n     tmp = bytearray(bytes(tmp))\n@@ -114,6 +113,7 @@ def write_raw_pkt(pkt_str, file_name):\n         w.write(tmp)\n         w.close()\n \n+\n class scapy(object):\n     SCAPY_LAYERS = {\n         'ether': Ether(dst=\"ff:ff:ff:ff:ff:ff\"),\n@@ -1117,8 +1117,6 @@ def strip_pktload(pkt=None, layer=\"L2\", p_index=0):\n     return load\n \n \n-###############################################################################\n-###############################################################################\n if __name__ == \"__main__\":\n     pkt = Packet('Ether(type=0x894f)/NSH(Len=0x6,NextProto=0x0,NSP=0x000002,NSI=0xff)')\n     sendp(pkt, iface='lo')\ndiff --git a/framework/tester.py b/framework/tester.py\nindex 9dba4e4d..acb7d82a 100644\n--- a/framework/tester.py\n+++ b/framework/tester.py\n@@ -52,6 +52,7 @@ from .packet import (\n     start_tcpdump,\n     stop_and_load_tcpdump_packets,\n     strip_pktload,\n+    bind_scapy_modules\n )\n from .pktgen import getPacketGenerator\n from .settings import (\n@@ -120,6 +121,10 @@ class Tester(Crb):\n         out = session.session.send_expect(SCAPY_IMP_CMD, '>>> ')\n         if 'ImportError' in out:\n             session.logger.warning(f'entering import error: {out}')\n+\n+        # bind scapy modules to packet module\n+        bind_scapy_modules(self.tmp_scapy_module_dir)\n+\n         return session\n \n     def check_scapy_version(self):\n",
    "prefixes": [
        "V1"
    ]
}