get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 129550,
    "url": "http://patchwork.dpdk.org/api/patches/129550/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dts/patch/20230716090753.1590148-7-jin.ling@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": "<20230716090753.1590148-7-jin.ling@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230716090753.1590148-7-jin.ling@intel.com",
    "date": "2023-07-16T09:07:50",
    "name": "[V1,06/10] framework/dut: add new functions to set up test mev env",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "a00255012af1203b425b64ecda3c6cdc47e66b4b",
    "submitter": {
        "id": 2652,
        "url": "http://patchwork.dpdk.org/api/people/2652/?format=api",
        "name": "Jin Ling",
        "email": "jin.ling@intel.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.dpdk.org/project/dts/patch/20230716090753.1590148-7-jin.ling@intel.com/mbox/",
    "series": [
        {
            "id": 28944,
            "url": "http://patchwork.dpdk.org/api/series/28944/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dts/list/?series=28944",
            "date": "2023-07-16T09:07:44",
            "name": "add functions to test MEV",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/28944/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/129550/comments/",
    "check": "pending",
    "checks": "http://patchwork.dpdk.org/api/patches/129550/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 8430B42E8A;\n\tSun, 16 Jul 2023 11:08:18 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7DA6640DFD;\n\tSun, 16 Jul 2023 11:08:18 +0200 (CEST)",
            "from mga18.intel.com (mga18.intel.com [134.134.136.126])\n by mails.dpdk.org (Postfix) with ESMTP id D85374013F\n for <dts@dpdk.org>; Sun, 16 Jul 2023 11:08:16 +0200 (CEST)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 16 Jul 2023 02:08:16 -0700",
            "from dpdk-lingjin.sh.intel.com ([10.67.114.163])\n by fmsmga008.fm.intel.com with ESMTP; 16 Jul 2023 02:08:15 -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=1689498497; x=1721034497;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=VyyktF3SvfD4f/ioxgW/ngbaNOgrFd0O9u0mYkPeYqw=;\n b=XYugOGA9GMVX9dLAHacpNahcIPtks7B/AQH/DYwKqFeaJyHPdw6gHce+\n 4vKZVVhlyPA+VW5S/wyk9xE6OvEwrzMCp8dCuIjLLRMT/cD77UGtuHETe\n ms+sRWHkqSoWgYZpLPzbOdnYcCfNiR/V/ppHRZ1hcj5aYvkh3NX1ire5/\n JPzEwzI543E9GtmJ7mycNweohjZvemlX7SGbIvgKwZS7GK0LvZB0jdurk\n pasiu+jDOhBiAxCLGFrEI8OEPSGNs19Vav8GpJ/HA/IbL5Dt8QlMJVA0e\n 8uJrgkn0L12NhdVOo1uVJBwIzMr+hBw+sW8O7PVYyfbT88+bfjVeCqF5P A==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10772\"; a=\"350610641\"",
            "E=Sophos;i=\"6.01,210,1684825200\"; d=\"scan'208\";a=\"350610641\"",
            "E=McAfee;i=\"6600,9927,10772\"; a=\"788303687\"",
            "E=Sophos;i=\"6.01,210,1684825200\"; d=\"scan'208\";a=\"788303687\""
        ],
        "X-ExtLoop1": "1",
        "From": "Jin Ling <jin.ling@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Jin Ling <jin.ling@intel.com>",
        "Subject": "[DTS][PATCH V1 06/10] framework/dut: add new functions to set up test\n mev env",
        "Date": "Sun, 16 Jul 2023 17:07:50 +0800",
        "Message-Id": "<20230716090753.1590148-7-jin.ling@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20230716090753.1590148-1-jin.ling@intel.com>",
        "References": "<20230716090753.1590148-1-jin.ling@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": "will set up the test env of mev when creating a dut according the global var 'test_mev'.\n\nSigned-off-by: Jin Ling <jin.ling@intel.com>\n---\n framework/dut.py | 121 +++++++++++++++++++++++++++++++++++++++++++----\n 1 file changed, 113 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/framework/dut.py b/framework/dut.py\nindex 0adb2786..8a7884f0 100644\n--- a/framework/dut.py\n+++ b/framework/dut.py\n@@ -6,6 +6,7 @@ import os\n import re\n import threading\n import time\n+import copy\n from typing import Dict, List, Optional, Union\n from uuid import uuid4\n \n@@ -15,11 +16,13 @@ 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 .settings import LOG_NAME_SEP, NICS,DPDK_TEST_MEV_SETTING,\\\n+    DPDK_QUEUE_MODEL_SETTING,DPDK_VPORT_SETTING,DPDK_RX_VPORT_SETTING\n from .ssh_connection import SSHConnection\n from .test_result import ResultTable\n from .utils import RED, remove_old_rsa_key\n from .virt_resource import VirtResource\n+from .logger import getLogger\n \n \n class Dut(Crb):\n@@ -62,7 +65,10 @@ class Dut(Crb):\n         self.apps_name = {}\n         self.dpdk_version = \"\"\n         self.nic = None\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+        if self.test_mev==\"true\":\n+            self.set_up_mev_test_env()\n     def filter_cores_from_crb_cfg(self):\n         # get core list from crbs.cfg\n         core_list = []\n@@ -327,11 +333,13 @@ class Dut(Crb):\n         self.load_portconf()\n         self.mount_procfs()\n         # auto detect network topology\n-        self.map_available_ports()\n+        # self.map_available_ports()\n         # disable tester port ipv6\n         self.disable_tester_ipv6()\n         self.get_nic_configurations()\n-\n+        self.get_mev_nic_configurations()\n+        # auto detect network topology\n+        self.map_available_ports()\n         # print latest ports_info\n         for port_info in self.ports_info:\n             self.logger.info(port_info)\n@@ -354,6 +362,24 @@ 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+        if self.test_mev==\"true\":\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 = [int(self.vport),]\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(\"0\",str(i+1),2)\n+                    self.ports_info.append(dut_port_info)\n+                    self.tester.ports_info.append(tester_port_info)\n+                    # self.port_info[i+1][\"pci\"] = \"\"\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@@ -1379,9 +1405,65 @@ class Dut(Crb):\n         Recover all resource before crb exit\n         \"\"\"\n         self.enable_tester_ipv6()\n+        try:\n+            self.bak_session.send_expect(\"pkill minicom\",\"#\")\n+        except:\n+            pass\n+        self.close()\n         self.close()\n         self.logger.logger_exit()\n-\n+    \n+    def create_imc_test_session(self):\n+        self.imc_test_session = SSHConnection(host=self.crb[\"section\"],session_name=\"imc\",username=\"root\",password=\"tester\")\n+        self.imc_test_session.init_log(getLogger(\"dut_imc_session\"))\n+        self.imc_test_session.send_expect(\"export TERM=linux-c-nc\",\"#\")\n+        out = self.imc_test_session.send_command(f\"sudo minicom -D {self.crb['IMC PORT']} -b {self.crb['IMC BAUDRATE']} -w\")\n+        while \"root@mev-imc\" not in out:\n+            if \"locked\" in out:\n+                self.bak_session.send_command(\"ps -ef | grep 'minicom -D %s' | grep -v grep | awk '{print $2}' | xargs kill -9\"%(self.crb['IMC PORT']))\n+                out = self.imc_test_session.send_command(f\"sudo minicom -D {self.crb['IMC PORT']} -b {self.crb['IMC BAUDRATE']}\")\n+            elif \"login\" in out:\n+                out = self.imc_test_session.send_command(\"root\")\n+            else:\n+                out = self.imc_test_session.send_command(\"\\n\")\n+        self.logger.info(\"create imc test session successfully\")\n+\n+    def create_acc_test_session(self):\n+        self.acc_test_session = SSHConnection(host=self.crb[\"section\"],session_name=\"acc\",username=\"root\",password=\"tester\")\n+        self.acc_test_session.init_log(getLogger(\"dut_acc_session\"))\n+        self.acc_test_session.send_expect(\"export TERM=linux-c-nc\",\"#\")\n+        out = self.acc_test_session.send_command(f\"sudo minicom -D {self.crb['ACC PORT']} -b {self.crb['ACC BAUDRATE']}\")\n+        # out = self.send_command(f\"ssh 192.168.0.2\")\n+        while \"root@mev-acc\" not in out:\n+            if \"locked\" in out:\n+                self.bak_session.send_command(\"ps -ef | grep 'minicom -D %s' | grep -v grep | awk '{print $2}' | xargs kill -9\"%(self.crb['ACC PORT']))\n+                out = self.acc_test_session.send_command(f\"sudo minicom -D {self.crb['ACC PORT']} -b {self.crb['ACC BAUDRATE']}\")\n+            elif \"login\" in out:\n+                out = self.acc_test_session.send_command(\"root\")\n+            else:\n+                out = self.acc_test_session.send_command(\"\\n\")\n+        self.acc_test_session.logger.info(\"login acc successfully\")\n+    def mev_config_rx_port(self, out):\n+        rx_vport = settings.load_global_setting(DPDK_RX_VPORT_SETTING).lower()\n+        try:\n+            # self.ports_info[int(rx_vport)]['mac'] = re.findall(f'Port {rx_vport}: (.{17})\\\\r',out)[0]\n+            mac = re.findall(\"Port %s: (.{17})\\\\r\"%(rx_vport),out)[0]\n+        except:\n+            # self.ports_info[int(rx_vport)]['mac'] = re.findall('Address:(.{17})',out)[0]\n+            mac = re.findall('Address:(.{17})',out)[0]\n+        output = self.imc_test_session.send_command(\"cli_client --query --config --verbose\")\n+        vsi_id = re.findall(\"vsi_id: 0x(\\w+).*is_created: yes.*mac addr: %s\"%(mac.lower()),output)\n+        self.imc_test_session.send_command(\"devmem 0x202920C100 64 0x80%s\"%(vsi_id[0]))\n+\n+    def  set_up_mev_test_env(self):\n+        if self.test_mev == \"true\":\n+            self.bak_session = SSHConnection(host=self.crb[\"section\"],session_name=\"bak\",username=\"root\",password=\"tester\")\n+            self.bak_session.init_log(getLogger(\"dut_bak\"))\n+            self.create_imc_test_session()\n+            if self.crb[\"ACC PORT\"] != \"\" and  self.crb[\"ACC BAUDRATE\"] != \"\" and  self.crb[\"IP\"] == self.crb[\"section\"]:\n+                self.create_acc_test_session()\n+                self.session = self.acc_test_session\n+                self.alt_session = self.acc_test_session\n \n class _EalParameter(object):\n     def __init__(\n@@ -1428,6 +1510,7 @@ 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.os_type = dut.get_os_type()\n         self.fixed_prefix = fixed_prefix\n         self.socket = socket\n@@ -1561,7 +1644,12 @@ 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+        # return \" \".join(pci_list)\n+        if self.test_mev ==\"true\":\n+            mev_port_options = self._get_mev_port_options()\n+            return f\"'' '.join(pci_list),{mev_port_options}\"\n+        else:\n+            return \" \".join(pci_list)\n \n     def _make_b_ports_param(self) -> str:\n         b_pci_list = []\n@@ -1638,8 +1726,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 port_option:\n-            port_param = f\"{port_param},{port_option}\"\n+        # if port_option:\n+        #     port_param = f\"{port_param},{port_option}\"\n+        mev_port_options = self._get_mev_port_options()\n+        if port_option or mev_port_options:\n+            port_param = f\"{port_param},{mev_port_options},{port_option}\"\n         return port_param\n \n     def _get_port_options_from_config(self, port: Union[str, int]) -> str:\n@@ -1680,3 +1771,17 @@ class _EalParameter(object):\n             ]\n         )\n         return _eal_str\n+\n+\n+    def _get_mev_port_options(self):\n+        if self.test_mev == \"true\":\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+            out = port_options_dict[self.queue_model]\n+            return out\n+        else:\n+            return \"\"\n",
    "prefixes": [
        "V1",
        "06/10"
    ]
}