From da812ca9b0d13b2a527035d13b85b38065f7f102 Mon Sep 17 00:00:00 2001 From: cuixucui <350255958@qq.com> Date: Fri, 2 Feb 2024 09:47:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8C=87=E5=AF=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/develop_doc/add_testcase.md | 116 +++++++++++++++++++++++++++++++ docs/develop_doc/get_board.md | 112 ++++++++++++++++++++++++++++- 2 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 docs/develop_doc/add_testcase.md diff --git a/docs/develop_doc/add_testcase.md b/docs/develop_doc/add_testcase.md new file mode 100644 index 0000000..478c0e1 --- /dev/null +++ b/docs/develop_doc/add_testcase.md @@ -0,0 +1,116 @@ +# `oec-hardware` 添加测试用例 +## 添加用例 + +下面以添加nvme用例为例 + +### 添加用例文件夹 +首先确定用例属于那个类别,如果类别已经存在,在该类别下面添加该用例文件夹。由于`nvme`属于`compatibility`类别,所以在`test/compatibility`下面添加`nvme`文件夹。 + ![testcase](../pictures/testcase.png) + +### 添加用例入口文件 +在用例文件夹下面添加和文件夹相同名称的`py`文件,该文件是用例的入口文件, 添加`nvme.py`文件。如果还需要其它功能模块可在nvme文件夹下面直接添加。 + + **`py`文件中重要函数说明** + - 函数`init` ,定义用例属性, -**可选** + ``` + def __init__(self): + Test.__init__(self) //继承Test类的构造函数 + self.requirements = ["nvme-cli"] //测试前需要安装的依赖 + self.args = None //测试对象 + self.device = None //测试设备 + self.filename = "test.file" //生成的测试文件名称 + ``` + + - 函数`test`,测试主流程。-**必选** + ``` + def test(self): + """ + test case + :return: + """ + disk = self.device.get_name() //获取设备名称 + if self.in_use(disk): //检测硬盘是否被使用 + self.logger.error("%s is in use now, skip this test." % disk) + return False + + block_count = getoutput("cat /sys/block/%s/size" % disk) //获取块的数量 + block_size = getoutput("cat /sys/block/%s/queue/logical_block_size" % disk) //获取每个块的大小 + ... //后面的代码省略 + ``` + + - 函数`setup`,测试开始前环境准备,主要用于初始化被测用例相关信息。-**可选** + ``` + def setup(self, args=None): + """ + Initialization before test + :param args: + :return: + """ + self.args = args or argparse.Namespace() //传递的对象 + self.logger = getattr(args, "test_logger", None) //日志属性 + self.command = Command(self.logger) //命令执行属性 + self.device = getattr(args, "device", None) //设备属性 + self.show_driver_info() //显示驱动信息 + self.command.run_cmd("nvme list", ignore_errors=True) //执行nvme list命令 + ``` + + - 函数`teardown`,测试完成后环境清理,主要用于确保无论测试成功失败都能正确恢复环境。-**可选** + ``` + def teardown(self): + """ + Environment recovery + """ + if os.path.exists(self.filename): + os.remove(self.filename) //如果存在测试过程中生成的文件,则删除。 + ``` +### 添加`MakeFile`编译文件 +``` + all: ; + + install: + mkdir -p $(DEST) + cp -a *.py $(DEST) //编译生成的目标文件复制到指定的目录中 + chmod a+x $(DEST)/*.py //设置文件权限 + + clean: //删除生成的目标文件 + rm -rf $(DEST) +``` +`nvme`用例的完整代码可参考`tests/compatible/nvme/nvme.py`文件。 + +## 添加用例特殊功能 + +1、 测试过程需要重启系统,添加self.rebootup属性和函数,可参考watchdog。 +``` + class WatchDogTest(Test): + """ + WatchDog Test + """ + def __init__(self): + Test.__init__(self) + self.pri = 9 //默认值为`0`,如果需要重启值为`9`。 + self.reboot = True //默认为`False`,如果需要重启为`True`。 + self.rebootup = "startup" //值为重启后要运行的函数名称。 +``` + 重启后调用的函数 + ``` + def startup(self, logger): + """ + Initialization before test + :return: + """ + logger.info("Recover from watchdog.") //调用watchdog后,系统重启正常。 + return True + ``` + +2、测试前需要安装rpm依赖,在self.requirement属性列表中列出rpm包名称。 +``` + class NvmeTest(Test): + def __init__(self): + Test.__init__(self) + self.requirements = ["nvme-cli"] //测试前需要安装`nvme-cli`依赖包 + self.args = None + self.device = None + self.filename = "test.file" + self.logpath = "" +``` + diff --git a/docs/develop_doc/get_board.md b/docs/develop_doc/get_board.md index 20fcdea..98b266d 100644 --- a/docs/develop_doc/get_board.md +++ b/docs/develop_doc/get_board.md @@ -29,9 +29,119 @@ | 4 | `get_model()` | `device` |获取设备芯片和模块型号 | | 5 | `NO_CONFIG_DEVICES` | `constants` | 不需要配置信息的板卡 | -板卡配置信息 +## 板卡配置信息 | 序号 | 文件名称 | 文件描述| | --------- | -------- | --------------- | | 1 |`test_config.yaml`|板卡配置信息模板文件 | +## 示例 + +下面以识别`raid`卡为例,介绍如果识别板卡和获取板卡信息。 + +### 生成device.json文件 + +安装`oec-hardware`工具,命令行输入oech进入工具,根据提示输入`ID`、`URL`、`Server`配置项。这时已生成环境硬件文件`/var/oech/device.json`。 + +### 获取识别板卡字段 + +打开`device.json`文件,搜索PCI号`3b:00.0`,可以会搜索多个对象,使用板卡信息比较全面的那个对象,如下面板卡对象就使用第一个对象。下来判断使用那个字段可表示该类板卡,比如要识别`raid`卡,一般`raid`卡`ID_PCI_SUBCLASS_FROM_DATABASE`参数的值包含`raid`字符,但是这个对象中没有包含,下来通过观察是否可通过别的字段来表示该类`raid`卡,判断`ID_PCI_SUBCLASS_FROM_DATABASE`中含有`SCSI`,但是`ID_MODEL_FROM_DATABASE`中不含有`HBA`可表示该类`raid`卡。 +``` + { + "DEVPATH": "/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.0", + "SUBSYSTEM": "pci", + "DRIVER": "smartpqi", + "PCI_CLASS": "10700", + "PCI_ID": "9005:028F", + "PCI_SUBSYS_ID": "9005:0801", + "PCI_SLOT_NAME": "0000:3b:00.0", + "MODALIAS": "pci:v00009005d0000028Fsv00009005sd00000801bc01sc07i00", + "USEC_INITIALIZED": "18417922", + "ID_PCI_CLASS_FROM_DATABASE": "Mass storage controller", + "ID_PCI_SUBCLASS_FROM_DATABASE": "Serial Attached SCSI controller", + "ID_VENDOR_FROM_DATABASE": "Adaptec", + "ID_MODEL_FROM_DATABASE": "Smart Storage PQI SAS (SmartRAID 3152-8i)" + }, + { + "DEVPATH": "/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.0/host14", + "SUBSYSTEM": "scsi", + "DEVTYPE": "scsi_host" + }, + { + "DEVPATH": "/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.0/host14/bsg/sas_host14", + "SUBSYSTEM": "bsg", + "DEVNAME": "/dev/bsg/sas_host14", + "MAJOR": "247", + "MINOR": "0" + }, +``` +### 添加板卡识别方法 +在`hwcompatible/compatibility.py`模块的`sort_tests`方法中添加板卡识别方法,在板卡识别功能段的最后添加板卡的识别方法,下面是`raid`卡的添加方法。 +``` +for device in devices: + .... + if "RAID" in device.get_property("ID_PCI_SUBCLASS_FROM_DATABASE") or \ + ("SCSI" in device.get_property("ID_PCI_SUBCLASS_FROM_DATABASE") and + "HBA" not in device.get_property("ID_MODEL_FROM_DATABASE")): + if "raid" in sort_devices.keys(): + sort_devices["raid"].extend([device]) + else: + sort_devices["raid"] = [device] + continue + ... +``` +### 添加板卡芯片和模块型号获取方法 +在`hwcompatible/device.py`模块的`get_model`方法中添加板卡芯片和模块型号的识别方法,先判断要添加的板卡类型是否已经有识别方法,如果已有不用添加,否则添加。在`/usr/share/oech/lib/config/pci.ids`文件中根据四元组信息先查找到板卡,根据板卡信息特点提取该板卡的芯片和模块型号信息。对FC、gpu、raid等板卡信息因为格式相同,就可以使用一种方法获取该类卡的芯片和模块型号。对于网卡,多家芯片厂商板卡格式不一样,需要根据芯片单独添加识别方法。 + +获取板卡信息和模块型号方法调用 +``` +try: + if name == "fc": + self.get_fc_card() + elif name == "gpu" or name == "vgpu": + self.get_gpu_card() + elif name == "raid": + self.get_raid_card() + ... +``` + +获取板卡信息和模块型号方法实现 +``` + def get_raid_card(self): + """ + get the board model and chip model of raid card + """ + flag = 0 + for ln in self.file.readlines(): + if flag == 0: + if re.match(self.quad[0], ln): + flag += 1 + elif flag == 1: + if re.match("\t" + self.quad[1], ln): + flag += 1 + self.chip = self._search_info(r"\b(SAS\S*)\s*", ln) + if len(self.chip) < 7: + self.chip = self._search_info(r"(\bSAS\S* \S*)\s*", ln) + if not self.chip: + self.chip = ln.replace(ln[0:7], "").strip() + elif flag == 2: + if re.match("\t\t" + self.quad[2] + " " + self.quad[3], ln): + self.board = ln.split(" ")[-1].strip() + break +``` + +### 配置信息添加 +如果用例测试过程中需要提供一些信息才可继续往下测试,就需要在`config/test_config.yaml`文件中添加配置信息。比如raid卡测试过程中需要提供硬盘模块才可继续测试,就需要在配置文件中给出要测试的硬件模块。 + +``` +raid: //raid板卡 + raid1: //第一个raid卡对象 + device: '0000:02:00.0' //raid卡的pci号,可从测试界面获取。 + disk: all //要测试的硬盘模块,all表示所有满足条件的模块都测试,否则测试指定的模块。 + raid2: + device: '0000:0a:00.1' + disk: sdb +``` +**注意** +对于非板卡用例,比如`perf`、`ipmi`、`system`等需要在`NODEVICE`常量中添加用例名称。 +对于板卡用例,不需要添加配置信息,需要在`NO_CONFIG_DEVICES`常量中添加上该板卡用例名称。 -- Gitee From c14bc72dd23ff92e3a323c121ef95e13cf635711 Mon Sep 17 00:00:00 2001 From: cuixucui <350255958@qq.com> Date: Fri, 1 Mar 2024 11:20:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E6=88=AA=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pictures/testcase.png | Bin 0 -> 6599 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/pictures/testcase.png diff --git a/docs/pictures/testcase.png b/docs/pictures/testcase.png new file mode 100644 index 0000000000000000000000000000000000000000..831f55298bfdd01c21ee4ce6d4f0bd0b7db7d85b GIT binary patch literal 6599 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