get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 130738,
    "url": "http://patchwork.dpdk.org/api/patches/130738/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dts/patch/20230825152825.2831565-6-songx.jiale@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": "<20230825152825.2831565-6-songx.jiale@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230825152825.2831565-6-songx.jiale@intel.com",
    "date": "2023-08-25T15:28:21",
    "name": "[V2,5/9] framework/dut: add and modify methods to adapt to MEV testing",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "7e3b00e791214656d059a396213b3d63d9b58e42",
    "submitter": {
        "id": 2352,
        "url": "http://patchwork.dpdk.org/api/people/2352/?format=api",
        "name": "Jiale, SongX",
        "email": "songx.jiale@intel.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.dpdk.org/project/dts/patch/20230825152825.2831565-6-songx.jiale@intel.com/mbox/",
    "series": [
        {
            "id": 29337,
            "url": "http://patchwork.dpdk.org/api/series/29337/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dts/list/?series=29337",
            "date": "2023-08-25T15:28:16",
            "name": "add functions to test MEV",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/29337/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/130738/comments/",
    "check": "pending",
    "checks": "http://patchwork.dpdk.org/api/patches/130738/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 71EB0430FD;\n\tFri, 25 Aug 2023 09:20:02 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6C75843248;\n\tFri, 25 Aug 2023 09:20:02 +0200 (CEST)",
            "from mgamail.intel.com (mgamail.intel.com [192.55.52.88])\n by mails.dpdk.org (Postfix) with ESMTP id 2226042D13\n for <dts@dpdk.org>; Fri, 25 Aug 2023 09:19:59 +0200 (CEST)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 25 Aug 2023 00:19:59 -0700",
            "from unknown (HELO localhost.localdomain) ([10.239.252.96])\n by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 25 Aug 2023 00:19:56 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1692948000; x=1724484000;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=VusDqTk4TmL13u/G7CbCyV6LPZfZnW2oKaXLfE0lBDc=;\n b=XVShHlaUh1e7+SH3tCuOsbt38wjL2DV4n4uy7ViXf90RfWBhSaHPtkjV\n tvXwdxLRtVMkc6fI9wNxzvd2oMNtewmFKDm7ZYGoH3V2+MdstUi8TYGNM\n bKl4lOReRinLrlc2qRLNOXjp/MGoJj6u63KG2Cmo1+3o6JerSSW2uqxOL\n oYKtxIewDyYpxmwtes32vFHI9rjM1JxLYRl9ng2EheD1PQDs4IFzID7Nf\n D0TwWPZGNBRSdqMcG5c0CJdANBY4qbwr5P81XbLazPFHzcMUm07mPtp6c\n 6JJ4heT/AtPACMR8GvHYzv+Eg27y74EZrumYm1V9CJN7vPo9Rfydd8wmU Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10812\"; a=\"405654466\"",
            "E=Sophos;i=\"6.02,195,1688454000\"; d=\"scan'208\";a=\"405654466\"",
            "E=McAfee;i=\"6600,9927,10812\"; a=\"802869649\"",
            "E=Sophos;i=\"6.02,195,1688454000\"; d=\"scan'208\";a=\"802869649\""
        ],
        "X-ExtLoop1": "1",
        "From": "Jiale Song <songx.jiale@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Jiale Song <songx.jiale@intel.com>",
        "Subject": "[dts] [PATCH V2 5/9] framework/dut: add and modify methods to adapt\n to MEV testing",
        "Date": "Fri, 25 Aug 2023 15:28:21 +0000",
        "Message-Id": "<20230825152825.2831565-6-songx.jiale@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20230825152825.2831565-1-songx.jiale@intel.com>",
        "References": "<20230825152825.2831565-1-songx.jiale@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "add and modify methods to adapt to MEV testing.\n\nSigned-off-by: Jiale Song <songx.jiale@intel.com>\n---\n framework/dut.py | 174 ++++++++++++++++++++++++++++++++++++++++++++---\n 1 file changed, 165 insertions(+), 9 deletions(-)",
    "diff": "diff --git a/framework/dut.py b/framework/dut.py\nindex 0adb2786..d2a9cda5 100644\n--- a/framework/dut.py\n+++ b/framework/dut.py\n@@ -2,6 +2,7 @@\n # Copyright(c) 2010-2014 Intel Corporation\n #\n \n+import copy\n import os\n import re\n import threading\n@@ -15,7 +16,16 @@ from nics.net_device import GetNicObj\n from .config import AppNameConf, PortConf\n from .crb import Crb\n from .exception import ParameterInvalidException\n-from .settings import LOG_NAME_SEP, NICS\n+from .logger import getLogger\n+from .settings import (\n+    DPDK_QUEUE_MODEL_SETTING,\n+    DPDK_RX_VPORT_SETTING,\n+    DPDK_TEST_ACC_SETTING,\n+    DPDK_TEST_MEV_SETTING,\n+    DPDK_VPORT_SETTING,\n+    LOG_NAME_SEP,\n+    NICS,\n+)\n from .ssh_connection import SSHConnection\n from .test_result import ResultTable\n from .utils import RED, remove_old_rsa_key\n@@ -62,6 +72,11 @@ class Dut(Crb):\n         self.apps_name = {}\n         self.dpdk_version = \"\"\n         self.nic = None\n+        self.test_mev = settings.load_global_setting(DPDK_TEST_MEV_SETTING).lower()\n+        self.test_acc = settings.load_global_setting(DPDK_TEST_ACC_SETTING).lower()\n+        if self.test_mev == \"true\":\n+            self.imc_session = None\n+            self.set_up_mev_test_env(alt_session)\n \n     def filter_cores_from_crb_cfg(self):\n         # get core list from crbs.cfg\n@@ -188,20 +203,18 @@ class Dut(Crb):\n \n         return file_prefix\n \n-    def init_host_session(self, vm_name):\n+    def init_host_session(self, name):\n         \"\"\"\n         Create session for each VM, session will be handled by VM instance\n         \"\"\"\n         self.host_session = SSHConnection(\n             self.get_ip_address(),\n-            vm_name + \"_host\",\n+            name + \"_host\",\n             self.get_username(),\n             self.get_password(),\n         )\n         self.host_session.init_log(self.logger)\n-        self.logger.info(\n-            \"[%s] create new session for VM\" % (threading.current_thread().name)\n-        )\n+        self.logger.info(\"create new session for %s\" % (name))\n \n     def new_session(self, suite=\"\"):\n         \"\"\"\n@@ -274,6 +287,18 @@ class Dut(Crb):\n         \"\"\"\n         self.send_expect(\"mount -t procfs proc /proc\", \"# \")\n \n+    def get_imc_ip_address(self):\n+        \"\"\"\n+        Get MEV imc ip address.\n+        \"\"\"\n+        return self.crb[\"IMC IP\"]\n+\n+    def get_acc_ip_address(self):\n+        \"\"\"\n+        Get MEV acc ip address.\n+        \"\"\"\n+        return self.crb[\"ACC IP\"]\n+\n     def get_ip_address(self):\n         \"\"\"\n         Get DUT's ip address.\n@@ -331,7 +356,6 @@ class Dut(Crb):\n         # disable tester port ipv6\n         self.disable_tester_ipv6()\n         self.get_nic_configurations()\n-\n         # print latest ports_info\n         for port_info in self.ports_info:\n             self.logger.info(port_info)\n@@ -354,6 +378,26 @@ class Dut(Crb):\n             if self.nic.default_driver == \"ice\":\n                 self.get_nic_pkg(retry_times)\n \n+    def get_mev_nic_configurations(self):\n+        self.vport = settings.load_global_setting(DPDK_VPORT_SETTING).lower()\n+        try:\n+            vport = self.vport.split(\"-\")\n+            vport = list(range(int(vport[0]), int(vport[1]) + 1))\n+        except:\n+            vport = [\n+                int(self.vport),\n+            ]\n+\n+        if len(vport) > 1:\n+            for i in range(len(vport) - 1):\n+                dut_port_info = copy.copy(self.ports_info[0])\n+                tester_port_info = copy.copy(self.tester.ports_info[0])\n+                dut_port_info[\"mac\"] = self.ports_info[0][\"mac\"].replace(\n+                    \"0\", str(i + 1), 2\n+                )\n+                self.ports_info.append(dut_port_info)\n+                self.tester.ports_info.append(tester_port_info)\n+\n     def get_nic_pkg(self, retry_times=3):\n         self.nic.pkg = self.nic.get_nic_pkg()\n         while not self.nic.pkg.get(\"type\") and retry_times > 0:\n@@ -1363,6 +1407,8 @@ class Dut(Crb):\n             self.alt_session = None\n         if self.host_init_flag:\n             self.host_session.close()\n+        if self.imc_session:\n+            self.imc_session.close()\n \n     def virt_exit(self):\n         \"\"\"\n@@ -1382,6 +1428,98 @@ class Dut(Crb):\n         self.close()\n         self.logger.logger_exit()\n \n+    def create_imc_session(self):\n+        self.logger.info(\"create new session for %s\" % (\"dut_imc\"))\n+        self.imc_session = SSHConnection(\n+            host=self.get_imc_ip_address(),\n+            session_name=\"dut_imc\",\n+            username=self.get_username(),\n+            password=self.get_password(),\n+        )\n+        self.imc_session.init_log(getLogger(\"dut_imc\"))\n+\n+    def create_acc_session(self, alt_session=True):\n+        self.logger.info(\"create new session for %s\" % (\"dut_acc\"))\n+        self.acc_session = SSHConnection(\n+            host=self.get_acc_ip_address(),\n+            session_name=\"dut_acc\",\n+            username=self.get_username(),\n+            password=self.get_password(),\n+        )\n+        self.acc_session.init_log(getLogger(\"dut_acc\"))\n+        if alt_session:\n+            self.acc_alt_session = SSHConnection(\n+                host=self.get_acc_ip_address(),\n+                session_name=\"dut_acc\",\n+                username=self.get_username(),\n+                password=self.get_password(),\n+            )\n+\n+    def create_session(self, name=\"\"):\n+        \"\"\"\n+        Create new session for additional usage. This session will not enable log.\n+        \"\"\"\n+        if self.test_acc:\n+            logger = getLogger(name)\n+            session = SSHConnection(\n+                self.get_acc_ip_address(),\n+                name,\n+                self.get_username(),\n+                self.get_password(),\n+                dut_id=self.dut_id,\n+            )\n+            session.init_log(logger)\n+        else:\n+            logger = getLogger(name)\n+            session = SSHConnection(\n+                self.get_ip_address(),\n+                name,\n+                self.get_username(),\n+                self.get_password(),\n+                dut_id=self.dut_id,\n+            )\n+            session.init_log(logger)\n+        self.sessions.append(session)\n+        return session\n+\n+    def mev_config_rx_port(self, out):\n+        rx_vport = settings.load_global_setting(DPDK_RX_VPORT_SETTING).lower()\n+        # matching rx vport mac addresses\n+        regex = re.compile(\n+            \"Port\\s+%s.*\\s*.*:\\s*(([0-9A-F]{2}:){5}[0-9A-F]{2})\" % rx_vport\n+        )\n+        match_mac = regex.search(out)\n+        if match_mac:\n+            mac = match_mac.group(1)\n+        else:\n+            raise ParameterInvalidException(\n+                \"Unable to match the mac address of the rx vport!!!\"\n+            )\n+        output = self.imc_session.send_expect(\n+            \"cli_client --query --config --verbose\", \"# \"\n+        )\n+        match_vsi_id = re.search(\n+            \"vsi_id:\\s+0x(\\w+).*is_created:\\s+yes.*mac\\s+addr:\\s+%s\" % (mac.lower()),\n+            output,\n+        )\n+        if match_vsi_id:\n+            self.imc_session.send_expect(\n+                \"devmem 0x202920C100 64 0x80%s\" % (match_vsi_id.group(1)), \"# \"\n+            )\n+        else:\n+            raise ParameterInvalidException(\n+                \"Unable to match the vsi id of the rx vport!!!\"\n+            )\n+\n+    def set_up_mev_test_env(self, alt_session=True):\n+        if self.test_acc == \"true\":\n+            self.close()\n+            self.create_acc_session(alt_session)\n+            self.session = self.acc_session\n+            self.alt_session = self.acc_alt_session\n+        self.init_host_session(\"mev_host\")\n+        self.create_imc_session()\n+\n \n class _EalParameter(object):\n     def __init__(\n@@ -1428,6 +1566,8 @@ class _EalParameter(object):\n         param other_eal_param: user defined DPDK eal parameters, eg:\n                         other_eal_param='--single-file-segments';\n         \"\"\"\n+        self.test_mev = settings.load_global_setting(DPDK_TEST_MEV_SETTING).lower()\n+        self.test_acc = settings.load_global_setting(DPDK_TEST_ACC_SETTING).lower()\n         self.os_type = dut.get_os_type()\n         self.fixed_prefix = fixed_prefix\n         self.socket = socket\n@@ -1561,7 +1701,11 @@ class _EalParameter(object):\n             for port_info in self.dut.ports_info:\n                 pci_list.append(\"%s %s\" % (allow_option, port_info[\"pci\"]))\n         self.dut.logger.info(pci_list)\n-        return \" \".join(pci_list)\n+        port_param = \" \".join(pci_list)\n+        if self.test_mev == \"true\":\n+            mev_port_options = self._get_mev_port_options()\n+            return port_param + f\",{mev_port_options}\"\n+        return port_param\n \n     def _make_b_ports_param(self) -> str:\n         b_pci_list = []\n@@ -1638,8 +1782,11 @@ class _EalParameter(object):\n         port_mac_addr = self.dut.ports_info[port][\"pci\"] if type(port) == int else port\n         port_param = f\"{allow_option} {port_mac_addr}\"\n         port_option = self._get_port_options_from_config(port)\n+        if self.test_mev == \"true\":\n+            mev_port_options = self._get_mev_port_options()\n+            port_param = port_param + f\",{mev_port_options}\"\n         if port_option:\n-            port_param = f\"{port_param},{port_option}\"\n+            port_param = port_param + f\",{port_option}\"\n         return port_param\n \n     def _get_port_options_from_config(self, port: Union[str, int]) -> str:\n@@ -1680,3 +1827,12 @@ class _EalParameter(object):\n             ]\n         )\n         return _eal_str\n+\n+    def _get_mev_port_options(self):\n+        self.queue_model = settings.load_global_setting(DPDK_QUEUE_MODEL_SETTING)\n+        self.vport = settings.load_global_setting(DPDK_VPORT_SETTING)\n+        port_options_dict = {\n+            \"splitq\": f\"vport={self.vport}\",\n+            \"singleq\": f\"vport={self.vport},rx_single=1,tx_single=1\",\n+        }\n+        return port_options_dict[self.queue_model]\n",
    "prefixes": [
        "V2",
        "5/9"
    ]
}