get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 106555,
    "url": "http://patches.dpdk.org/api/patches/106555/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20220126074748.2828-1-junx.dong@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patches.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": "<20220126074748.2828-1-junx.dong@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20220126074748.2828-1-junx.dong@intel.com",
    "date": "2022-01-26T07:47:48",
    "name": "[V3] framework/*: Modified create_eal_parameters API to support flexibility",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "7d1774de15737474a59cb4bee50b1930b2fd2fcc",
    "submitter": {
        "id": 2237,
        "url": "http://patches.dpdk.org/api/people/2237/?format=api",
        "name": "Jun Dong",
        "email": "junx.dong@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dts/patch/20220126074748.2828-1-junx.dong@intel.com/mbox/",
    "series": [
        {
            "id": 21374,
            "url": "http://patches.dpdk.org/api/series/21374/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=21374",
            "date": "2022-01-26T07:47:48",
            "name": "[V3] framework/*: Modified create_eal_parameters API to support flexibility",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/21374/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/106555/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/106555/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 DCCDAA04A7;\n\tWed, 26 Jan 2022 08:47:57 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id AE61C42702;\n\tWed, 26 Jan 2022 08:47:57 +0100 (CET)",
            "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by mails.dpdk.org (Postfix) with ESMTP id 021914069D\n for <dts@dpdk.org>; Wed, 26 Jan 2022 08:47:55 +0100 (CET)",
            "from fmsmga003.fm.intel.com ([10.253.24.29])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 25 Jan 2022 23:47:54 -0800",
            "from shwdenpg197.ccr.corp.intel.com ([10.253.109.35])\n by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 25 Jan 2022 23:47:53 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1643183276; x=1674719276;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=/fBow6yuu4FZtUDpzlop5rnZh6KZVHZf22MXucQKStQ=;\n b=YLB6rs425eFOlpsewneBntkl7HCLvzZ7YFRIg/2rAmsVA3kQejOOAjVL\n ICGdpwm5ZGybdLRrTJX+o1S+0lSPu2MIU3/lItM1VxZZquS+pGZSi61Sf\n t9uQJKIGJkcFVEr5Xskj1OJZ/JR+MAdpcacZ3KBxr5CILs29hjmqj2HOG\n VZx9ooEJPInCpMM0g0c5MfiOEJvPBXrZyG3YH6K1bWuFD71YZ2yTKn88V\n RfOoTEP+FJZQiYRfVFZtKoUg1X7lOHiP8wB+BArhA9nYzMYclni06u1cy\n johx7VhSWnZDpyZbrhKeEUUGbR7dZl3np3erbgB2Hk1T/6dzY3geSMak7 g==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10238\"; a=\"233874449\"",
            "E=Sophos;i=\"5.88,317,1635231600\"; d=\"scan'208\";a=\"233874449\"",
            "E=Sophos;i=\"5.88,317,1635231600\"; d=\"scan'208\";a=\"617889251\""
        ],
        "From": "Jun Dong <junx.dong@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "lijuan.tu@intel.com,\n\tqingx.sun@intel.com,\n\tjunx.dong@intel.com",
        "Subject": "[dts][V3] framework/*: Modified create_eal_parameters API to support\n flexibility",
        "Date": "Wed, 26 Jan 2022 15:47:48 +0800",
        "Message-Id": "<20220126074748.2828-1-junx.dong@intel.com>",
        "X-Mailer": "git-send-email 2.33.1.windows.1",
        "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": "From: DongJunX <junx.dong@intel.com>\n\n- Refactoring API for easy maintenance.\n- Format the output format of the continuous cores list.\n- Append user defined eal parameters.\n\nSigned-off-by: Jun Dong <junx.dong@intel.com>\n---\n framework/dut.py        | 339 ++++++++++++++++++++++++----------------\n framework/pmd_output.py |   6 +-\n 2 files changed, 208 insertions(+), 137 deletions(-)",
    "diff": "diff --git a/framework/dut.py b/framework/dut.py\nindex dc3fc874..90c43b19 100644\n--- a/framework/dut.py\n+++ b/framework/dut.py\n@@ -117,137 +117,209 @@ class Dut(Crb):\n \n     def create_eal_parameters(self, fixed_prefix=False, socket=-1, **config):\n         \"\"\"\n-        generate eal parameters character string\n-        :param config:\n-        :return: eal_str eg:'-c 0xf -a 0000:88:00.0 -a 0000:88:00.1 --file-prefix=dpdk_1112_20190809143420',\n-        if dpdk version < 20.11-rc4, eal_str eg: '-c 0xf -w 0000:88:00.0 --file-prefix=dpdk_1112_20190809143420',\n-        \"\"\"\n-        default_cores = '1S/2C/1T'\n-        blank = ' '\n-        os_type = self.get_os_type()\n-        if config:\n-            # deal with cores\n-            if 'cores' in config:\n-                if type(config['cores']) == list:\n-                    core_list = config['cores']\n-                elif isinstance(config['cores'], str):\n-                    if config['cores'] == '' or config['cores'].lower() == 'default':\n-                        core_list = self.get_core_list(default_cores)\n-                    else:\n-                        core_list = self.get_core_list(config['cores'], socket=socket)\n-            else:\n-                core_list = self.get_core_list(default_cores)\n-\n-            # deal with ports\n-            w_pci_list = []\n-            if 'ports' in config and len(config['ports']) != 0:\n-                allow_option = '-a' if self.dpdk_version > '20.11.0-rc3' or self.dpdk_version == '20.11.0' else '-w'\n-                for port in config['ports']:\n-                    if type(port) == int:\n-                        if 'port_options' in config and port in list(config['port_options'].keys()):\n-                            port_option = config['port_options'][port]\n-                            w_pci_list.append('%s %s,%s' % (allow_option, self.ports_info[port]['pci'], port_option))\n+        generate eal parameters character string;\n+        :param fixed_prefix: use fixed file-prefix or not, when it is true,\n+                             the file-prefix will not be added a timestamp\n+        :param socket: the physical CPU socket index, -1 means no care cpu socket;\n+        :param config: kwargs user defined eal parameters, eg:\n+                sub param cores: set the core info, eg:\n+                        cores=[0,1,2,3],\n+                        cores='default',\n+                        cores='1S/4C/1T',\n+                        cores='all';\n+                sub param ports: set PCI allow list, eg:\n+                        ports=['0000:1a:00.0', '0000:1a:00.1'],\n+                        ports=[0, 1];\n+                sub param port_options: set options of port, eg:\n+                        port_options={'0000:1a:00.0': \"proto_xtr=vlan\"},\n+                        port_options={0: \"cap=dcf\"};\n+                sub param prefix: set file prefix string, eg:\n+                        prefix='vf';\n+                sub param no_pci: switch of disable PCI bus eg:\n+                        no_pci=True;\n+                sub param b_ports: skip probing a PCI device to prevent EAL from using it, eg:\n+                        b_ports=['0000:1a:00.0'],\n+                        b_ports=[0];\n+                sub param vdevs: virtual device list, eg:\n+                        vdevs=['net_ring0', 'net_ring1'];\n+                sub param other_eal_param: user defined DPDK eal parameters, eg:\n+                        other_eal_param='--single-file-segments';\n+        :return: eal param string, eg:\n+                '-c 0xf -a 0000:88:00.0 --file-prefix=dpdk_1112_20190809143420';\n+        if DPDK version < 20.11-rc4, eal_str eg:\n+                '-c 0xf -w 0000:88:00.0 --file-prefix=dpdk_1112_20190809143420';\n+        \"\"\"\n+\n+        class _EalParameter(object):\n+            def __init__(self, _dut, _fixed_prefix, _socket, _config=None):\n+                self.BLANK = ' '\n+                self.config = _config if _config is not None else dict()\n+                self.os_type = _dut.get_os_type()\n+                self.fixed_prefix = _fixed_prefix\n+                self.socket = _socket\n+                self.dut = _dut\n+\n+            def _make_cores_param(self):\n+                is_use_default_cores = 'cores' not in self.config \\\n+                                       or self.config['cores'] == '' \\\n+                                       or isinstance(self.config['cores'], str) \\\n+                                       and self.config['cores'].lower() == 'default'\n+                if is_use_default_cores:\n+                    default_cores = '1S/2C/1T'\n+                    core_list = self.dut.get_core_list(default_cores)\n+                else:\n+                    core_list = self._get_cores_from_config()\n+\n+                def _get_consecutive_cores_range(_cores: list):\n+                    _formated_core_list = []\n+                    _tmp_cores_list = list(sorted(map(int, _cores)))\n+                    _segment = _tmp_cores_list[:1]\n+                    for _core_num in _tmp_cores_list[1:]:\n+                        if _core_num - _segment[-1] == 1:\n+                            _segment.append(_core_num)\n                         else:\n-                            w_pci_list.append('%s %s' % (allow_option, self.ports_info[port]['pci']))\n-                    else:\n-                        if 'port_options' in config and port in list(config['port_options'].keys()):\n-                            port_option = config['port_options'][port]\n-                            w_pci_list.append('%s %s,%s' % (allow_option, port, port_option))\n+                            _formated_core_list.append(\n+                                f'{_segment[0]}-{_segment[-1]}' if len(_segment) > 1 else f'{_segment[0]}')\n+                            _index = _tmp_cores_list.index(_core_num)\n+                            _formated_core_list.extend(_get_consecutive_cores_range(_tmp_cores_list[_index:]))\n+                            _segment.clear()\n+                            break\n+                    if len(_segment) > 0:\n+                        _formated_core_list.append(\n+                            f'{_segment[0]}-{_segment[-1]}' if len(_segment) > 1 else f'{_segment[0]}')\n+                    return _formated_core_list\n+\n+                return f'-l {\", \".join(_get_consecutive_cores_range(core_list))}'\n+\n+            def _make_memory_channels(self):\n+                param_template = '-n {}'\n+                return param_template.format(self.dut.get_memory_channels())\n+\n+            def _make_ports_param(self):\n+                if 'ports' in self.config and len(self.config['ports']) != 0:\n+                    return self._get_ports_and_wraped_port_with_port_options()\n+                else:\n+                    return self._make_default_ports_param()\n+\n+            def _make_default_ports_param(self):\n+                pci_list = []\n+                allow_option = self._make_allow_option()\n+                if len(self.dut.ports_info) != 0:\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+\n+            def _make_b_ports_param(self):\n+                b_pci_list = []\n+                if 'b_ports' in self.config and len(self.config['b_ports']) != 0:\n+                    for port in self.config['b_ports']:\n+                        if type(port) == int:\n+                            b_pci_list.append('-b %s' % self.dut.ports_info[port]['pci'])\n                         else:\n-                            w_pci_list.append('%s %s' % (allow_option, port))\n-            w_pci_str = ' '.join(w_pci_list)\n-\n-            # deal with block ports\n-            b_pci_list = []\n-            if 'b_ports' in config and len(config['b_ports']) != 0:\n-                for port in config['b_ports']:\n-                    if type(port) == int:\n-                        b_pci_list.append('-b %s' % self.ports_info[port]['pci'])\n-                    else:\n-                        b_pci_list = ['-b %s' % pci for pci in config['b_ports']]\n-            b_ports_str = ' '.join(b_pci_list)\n+                            b_pci_list = ['-b %s' % pci for pci in self.config['b_ports']]\n+                return ' '.join(b_pci_list)\n \n-            # deal with no-pci\n-            if 'no_pci' in config:\n-                if config['no_pci'] == True:\n-                    no_pci = '--no-pci'\n+            def _make_no_pci_param(self):\n+                if 'no_pci' in self.config and self.config['no_pci'] is True:\n+                    return '--no-pci'\n                 else:\n-                    no_pci = ''\n-            else:\n-                no_pci = ''\n+                    return ''\n \n-            # deal with file prefix\n-            if 'prefix' in config and config['prefix'] != '':\n-                if fixed_prefix == True:\n-                    file_prefix = config['prefix']\n+            def _make_prefix_param(self):\n+                is_prefix_param_available = 'prefix' in self.config and self.config['prefix'] != ''\n+                if is_prefix_param_available:\n+                    if self.fixed_prefix is True:\n+                        fixed_file_prefix = self.config['prefix']\n+                    else:\n+                        fixed_file_prefix = self.config['prefix'] + '_' + self.dut.prefix_subfix\n                 else:\n-                    file_prefix = config['prefix'] + '_' + self.prefix_subfix\n-            else:\n-                file_prefix = 'dpdk' + '_' + self.prefix_subfix\n-            if file_prefix not in self.prefix_list:\n-                self.prefix_list.append(file_prefix)\n+                    fixed_file_prefix = 'dpdk' + '_' + self.dut.prefix_subfix\n+                fixed_file_prefix = self._do_os_handle_with_prefix_param(fixed_file_prefix)\n+                fixed_file_prefix = '--file-prefix=' + fixed_file_prefix\n+                return fixed_file_prefix\n+\n+            def _make_vdevs_param(self):\n+                if 'vdevs' in self.config and len(self.config['vdevs']) != 0:\n+                    _vdevs = ['--vdev ' + vdev for vdev in self.config['vdevs']]\n+                    return ' '.join(_vdevs)\n+                else:\n+                    return ''\n+\n+            def _make_share_library_path_param(self):\n+                use_shared_lib = settings.load_global_setting(settings.HOST_SHARED_LIB_SETTING)\n+                shared_lib_path = settings.load_global_setting(settings.HOST_SHARED_LIB_PATH)\n+                if use_shared_lib == 'true' and shared_lib_path and 'Virt' not in str(self.dut):\n+                    return ' -d {} '.format(shared_lib_path)\n+                return ''\n+\n+            def _make_default_force_max_simd_bitwidth_param(self):\n+                rx_mode = settings.load_global_setting(settings.DPDK_RXMODE_SETTING)\n+                build_type = settings.load_global_setting(settings.HOST_BUILD_TYPE_SETTING)\n+                param_template = ' --force-max-simd-bitwidth=%s '\n+                bitwith_dict = {'novector': '64', 'sse': '128', 'avx2': '256', 'avx512': '512', 'nolimit': '0'}\n+                if build_type == 'meson' and rx_mode in bitwith_dict and \\\n+                        'force-max-simd-bitwidth' not in self.config.get('other_eal_param', ''):\n+                    return param_template % bitwith_dict.get(rx_mode)\n+                else:\n+                    return ''\n+\n+            def _get_cores_from_config(self):\n+                if type(self.config['cores']) == list:\n+                    return self.config['cores']\n+                elif isinstance(self.config['cores'], str):\n+                    return self.dut.get_core_list(self.config['cores'], socket=self.socket)\n+\n+            def _get_ports_and_wraped_port_with_port_options(self):\n+                w_pci_list = []\n+                for port in self.config['ports']:\n+                    w_pci_list.append(self._add_port_options_to(port))\n+                return ' '.join(w_pci_list)\n+\n+            def _add_port_options_to(self, port):\n+                allow_option = self._make_allow_option()\n+                port_mac_addr = self.dut.ports_info[port]['pci'] if type(port) == int else port\n+                port_param = '%s %s' % (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+                return port_param\n+\n+            def _get_port_options_from_config(self, port):\n+                if 'port_options' in self.config and port in list(self.config['port_options'].keys()):\n+                    return self.config['port_options'][port]\n+                else:\n+                    return ''\n \n-            # deal with vdev\n-            if 'vdevs' in config and len(config['vdevs']) != 0:\n-                vdev = '--vdev ' + ' --vdev '.join(config['vdevs'])\n-            else:\n-                vdev = ''\n-\n-            if os_type == 'freebsd':\n-                eal_str = '-l ' + ','.join(map(str, core_list)) \\\n-                          + blank + '-n %d' % self.get_memory_channels() \\\n-                          + blank + w_pci_str \\\n-                          + blank + b_ports_str \\\n-                          + blank + no_pci \\\n-                          + blank + vdev\n-                self.prefix_list = []\n-            else:\n-                eal_str = '-l ' + ','.join(map(str, core_list)) \\\n-                          + blank + '-n %d' % self.get_memory_channels() \\\n-                          + blank + w_pci_str \\\n-                          + blank + b_ports_str \\\n-                          + blank + '--file-prefix=' + file_prefix \\\n-                          + blank + no_pci \\\n-                          + blank + vdev\n-        else:\n-            allow_option = '-a' if self.dpdk_version > '20.11.0-rc3' or self.dpdk_version == '20.11.0' else '-w'\n-            # get pci from ports_info\n-            pci_list = []\n-            if len(self.ports_info) != 0:\n-                for port_info in self.ports_info:\n-                    pci_list.append('%s %s' % (allow_option, port_info['pci']))\n-            self.logger.info(pci_list)\n-            pci_str = ' '.join(pci_list)\n-            # default cores '1S/2C/1T'\n-            core_list = self.get_core_list(default_cores)\n-            file_prefix = 'dpdk' + '_' + self.prefix_subfix\n-            self.prefix_list.append(file_prefix)\n-            if os_type == 'freebsd':\n-                eal_str = '-l ' + ','.join(map(str, core_list)) \\\n-                          + blank + '-n %d' % self.get_memory_channels() \\\n-                          + blank + pci_str\n-                self.prefix_list = []\n-            else:\n-                eal_str = '-l ' + ','.join(map(str, core_list)) \\\n-                          + blank + '-n %d' % self.get_memory_channels() \\\n-                          + blank + pci_str \\\n-                          + blank + '--file-prefix=' + file_prefix\n-        use_shared_lib = settings.load_global_setting(settings.HOST_SHARED_LIB_SETTING)\n-        shared_lib_path = settings.load_global_setting(settings.HOST_SHARED_LIB_PATH)\n-        if use_shared_lib == 'true' and shared_lib_path and 'Virt' not in str(self):\n-            eal_str = eal_str + ' -d {} '.format(shared_lib_path)\n-        rx_mode = settings.load_global_setting(settings.DPDK_RXMODE_SETTING)\n-        build_type = settings.load_global_setting(settings.HOST_BUILD_TYPE_SETTING)\n-        if build_type == 'meson' and ('other_eal_param' not in config or\n-                                      'force-max-simd-bitwidth' not in config['other_eal_param']):\n-            if rx_mode == 'novector':\n-                eal_str = eal_str + ' --force-max-simd-bitwidth=64 '\n-            elif rx_mode == 'sse':\n-                eal_str = eal_str + ' --force-max-simd-bitwidth=128 '\n-            elif rx_mode == 'avx2':\n-                eal_str = eal_str + ' --force-max-simd-bitwidth=256 '\n-            elif rx_mode == 'avx512':\n-                eal_str = eal_str + ' --force-max-simd-bitwidth=512 '\n+            def _make_allow_option(self):\n+                is_new_dpdk_version = self.dut.dpdk_version > '20.11.0-rc3' or self.dut.dpdk_version == '20.11.0'\n+                return '-a' if is_new_dpdk_version else '-w'\n+\n+            def _do_os_handle_with_prefix_param(self, file_prefix):\n+                if self.dut.get_os_type() == 'freebsd':\n+                    self.dut.prefix_list = []\n+                    file_prefix = ''\n+                else:\n+                    self.dut.prefix_list.append(file_prefix)\n+                return file_prefix\n+\n+            def make_eal_param(self):\n+                _eal_str = self.BLANK.join([self._make_cores_param(),\n+                                            self._make_memory_channels(),\n+                                            self._make_ports_param(),\n+                                            self._make_b_ports_param(),\n+                                            self._make_prefix_param(),\n+                                            self._make_no_pci_param(),\n+                                            self._make_vdevs_param(),\n+                                            self._make_share_library_path_param(),\n+                                            self._make_default_force_max_simd_bitwidth_param(),\n+                                            # append user defined eal parameters\n+                                            self.config.get('other_eal_param', '')\n+                                            ])\n+                return _eal_str\n+\n+        eal_parameter_creator = _EalParameter(self, fixed_prefix, socket, config)\n+        eal_str = eal_parameter_creator.make_eal_param()\n \n         return eal_str\n \n@@ -556,7 +628,6 @@ class Dut(Crb):\n             total_numa_nodes = len(numa_nodes)\n             self.logger.info(numa_nodes)\n \n-\n         force_socket = False\n \n         if int(hugepages_size) < (1024 * 1024):\n@@ -578,7 +649,7 @@ class Dut(Crb):\n                     arch_huge_pages = hugepages if hugepages > 0 else 2048\n \n             if total_huge_pages != arch_huge_pages:\n-                if total_numa_nodes == -1 :\n+                if total_numa_nodes == -1:\n                     self.set_huge_pages(arch_huge_pages)\n                 else:\n                     # before all hugepage average distribution  by all socket,\n@@ -749,7 +820,7 @@ class Dut(Crb):\n             for portid in range(len(self.ports_info)):\n                 if self.ports_info[portid]['source'] == 'cfg':\n                     if (socket is None or\n-                        self.ports_info[portid]['numa'] == -1 or\n+                            self.ports_info[portid]['numa'] == -1 or\n                             socket == self.ports_info[portid]['numa']):\n                         ports.append(portid)\n             return ports\n@@ -760,7 +831,7 @@ class Dut(Crb):\n                 if port_info['type'] == NICS[nic_type]:\n                     # match numa or none numa awareness\n                     if (socket is None or\n-                        port_info['numa'] == -1 or\n+                            port_info['numa'] == -1 or\n                             socket == port_info['numa']):\n                         # port has link,\n                         if self.tester.get_local_port(portid) != -1:\n@@ -913,7 +984,7 @@ class Dut(Crb):\n                 ipv6 = \"Not connected\"\n \n             out = self.send_expect(\"ip -family inet address show dev %s | awk '/inet/ { print $2 }'\"\n-                    % intf, \"# \")\n+                                   % intf, \"# \")\n             ipv4 = out.split('/')[0]\n \n             port_info['ipv6'] = ipv6\n@@ -992,7 +1063,7 @@ class Dut(Crb):\n             port_info['port'] = port\n \n             self.logger.info(\"DUT cached: [%s %s] %s\" % (port_info['pci'],\n-                                port_info['type'], port_info['intf']))\n+                                                         port_info['type'], port_info['intf']))\n \n     def scan_ports_uncached(self):\n         \"\"\"\n@@ -1056,7 +1127,7 @@ class Dut(Crb):\n         self.ports_info = []\n \n         skipped = RED('Skipped: Unknown/not selected')\n-        \n+\n         for (pci_bus, pci_id) in self.pci_devices_info:\n \n             if not settings.accepted_nic(pci_id):\n@@ -1068,7 +1139,7 @@ class Dut(Crb):\n             bus_id = addr_array[1]\n             devfun_id = addr_array[2]\n             port = GetNicObj(self, domain_id, bus_id, devfun_id)\n-            port.pci_id= pci_id\n+            port.pci_id = pci_id\n             port.name = settings.get_nic_name(pci_id)\n             port.default_driver = settings.get_nic_driver(pci_id)\n             intf = port.get_interface_name()\n@@ -1095,7 +1166,7 @@ class Dut(Crb):\n \n             # store the port info to port mapping\n             self.ports_info.append({'port': port, 'pci': pci_str, 'type': pci_id, 'intf':\n-                                    intf, 'mac': macaddr, 'ipv6': ipv6, 'numa': -1})\n+                intf, 'mac': macaddr, 'ipv6': ipv6, 'numa': -1})\n \n     def setup_virtenv(self, virttype):\n         \"\"\"\n@@ -1145,7 +1216,7 @@ class Dut(Crb):\n         vflist = []\n         port_driver = port.get_nic_driver()\n         if 'sriov_vfs_pci' in self.ports_info[port_id] and \\\n-           self.ports_info[port_id]['sriov_vfs_pci']:\n+                self.ports_info[port_id]['sriov_vfs_pci']:\n             vflist = self.ports_info[port_id]['sriov_vfs_pci']\n         else:\n             if not port.get_sriov_vfs_pci():\ndiff --git a/framework/pmd_output.py b/framework/pmd_output.py\nindex 113e85f6..da2b0de3 100644\n--- a/framework/pmd_output.py\n+++ b/framework/pmd_output.py\n@@ -139,17 +139,17 @@ class PmdOutput():\n         config['cores'] = cores\n         if ' -w ' not in eal_param and ' -a ' not in eal_param and ' -b ' not in eal_param \\\n             and 'ports' not in config and 'b_ports' not in config and ' --no-pci ' not in eal_param \\\n-            and ( 'no_pci' not in config or ('no_pci' in config and config['no_pci'] != True)):\n+            and ('no_pci' not in config or ('no_pci' in config and config['no_pci'] != True)):\n             config['ports'] = [self.dut.ports_info[i]['pci'] for i in range(len(self.dut.ports_info))]\n         part_eal_param = self.dut.create_eal_parameters(fixed_prefix=fixed_prefix, socket=socket, **config)\n-        all_eal_param = part_eal_param + ' ' + eal_param\n+        all_eal_param = part_eal_param\n \n         app_name = self.dut.apps_name['test-pmd']\n         command = app_name + \" %s -- -i %s\" % (all_eal_param, param)\n         command = command.replace('  ', ' ')\n         if self.session != self.dut:\n             self.session.send_expect(\"cd %s\" % self.dut.base_dir, \"# \")\n-        timeout = config.get('timeout',120)\n+        timeout = config.get('timeout', 120)\n         out = self.session.send_expect(command, expected, timeout)\n         self.command = command\n         # wait 10s to ensure links getting up before test start.\n",
    "prefixes": [
        "V3"
    ]
}