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