diff --git a/oec-hardware-1.1.5-2-fix-bug.patch b/oec-hardware-1.1.5-2-fix-bug.patch new file mode 100644 index 0000000000000000000000000000000000000000..db67c815b424e899a35f4a8bfc9fe1d1c2f31ea5 --- /dev/null +++ b/oec-hardware-1.1.5-2-fix-bug.patch @@ -0,0 +1,1598 @@ +diff -Naur rpm/config/pci.ids oech/config/pci.ids +--- rpm/config/pci.ids 2023-10-24 22:25:50.000000000 +0800 ++++ oech/config/pci.ids 2024-04-16 18:08:37.752536721 +0800 +@@ -23904,6 +23904,8 @@ + 1af5 Netezza Corp. + 1afa J & W Electronics Co., Ltd. + 1b00 Montage Technology Co., Ltd. ++ d011 TSSE ++ d021 TSSE [VF] + 1b03 Magnum Semiconductor, Inc, + 6100 DXT/DXTPro Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder + 7000 D7 Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder +diff -Naur rpm/hwcompatible/cert_info.py oech/hwcompatible/cert_info.py +--- rpm/hwcompatible/cert_info.py 2024-04-16 18:17:05.010569180 +0800 ++++ oech/hwcompatible/cert_info.py 2024-04-16 18:08:37.756536769 +0800 +@@ -24,7 +24,8 @@ + self.cert_devices = [] + self.cert_quads = [] + self.infos = ["vendorID", "deviceID", "svID", "ssID", "architecture", "os", "driverName", "version", +- "type", "date", "sha256", "driverSize", "chipVendor", "boardModel", "chipModel", "downloadLink"] ++ "type", "date", "sha256", "driverSize", "chipVendor", "boardModel", "chipModel", "item", ++ "downloadLink"] + self.logger = logger + self.command = command + +@@ -64,6 +65,8 @@ + oec_json["boardModel"] = device.board + oec_json["chipModel"] = device.chip + oec_json["type"] = device_name.upper() ++ if oec_json["type"] == "ETHERNET": ++ oec_json["type"] = "NIC" + arch = self.command.run_cmd("uname -m", log_print=False) + oec_json["architecture"] = arch[0].strip("\n") + os_cmd = self.command.run_cmd( +@@ -80,6 +83,7 @@ + driver_size = self.command.run_cmd( + "ls -lh %s | awk '{print $5}'" % filename[0].strip("\n"), log_print=False) + oec_json["driverSize"] = driver_size[0].strip("\n") ++ oec_json["item"] = "" + oec_json["downloadLink"] = "inbox" + + self.cert_quads.append(device.quad) +diff -Naur rpm/hwcompatible/compatibility.py oech/hwcompatible/compatibility.py +--- rpm/hwcompatible/compatibility.py 2024-04-16 18:17:05.010569180 +0800 ++++ oech/hwcompatible/compatibility.py 2024-04-16 18:08:37.756536769 +0800 +@@ -147,7 +147,7 @@ + if not self.test_factory: + if self.category == "virtualization": + factory_doc = FactoryDocument(CertEnv.virtfactoryfile, self.logger) +- elif self.category == "compatible": ++ elif self.category == "compatible" or not self.category: + factory_doc = FactoryDocument(CertEnv.factoryfile, self.logger) + self.test_factory = factory_doc.get_factory() + +@@ -350,6 +350,12 @@ + sort_devices["fc"] = [device] + continue + driver = device.get_property("DRIVER") ++ if driver == "tsse": ++ if "keycard" in sort_devices.keys(): ++ sort_devices["keycard"].extend([device]) ++ else: ++ sort_devices["keycard"] = [device] ++ continue + if any([d in driver for d in GPU_DRIVER]): + if "gpu" in sort_devices.keys(): + sort_devices["gpu"].extend([device]) +diff -Naur rpm/hwcompatible/device.py oech/hwcompatible/device.py +--- rpm/hwcompatible/device.py 2023-10-24 22:25:50.000000000 +0800 ++++ oech/hwcompatible/device.py 2024-04-16 18:08:37.756536769 +0800 +@@ -209,11 +209,11 @@ + if re.match("\t" + self.quad[1], ln): + flag += 1 + if self.quad[0] == "8086": +- self.chip = self._search_info(r'\[(.*)\]', ln) ++ self.chip = self._search_info(r'\[(.*)\]', ln).strip() + elif self.quad[0] == "19e5": +- self.chip = re.sub(ln[0:7], "", ln).split(" ")[0] ++ self.chip = re.sub(ln[0:7], "", ln).split(" ")[0].strip() + else: +- self.chip = ln.split(" ")[-1] ++ self.chip = ln.split(" ")[-1].strip() + elif flag == 2: + if re.match("\t\t" + self.quad[2] + " " + self.quad[3], ln): + flag += 1 +diff -Naur rpm/README.en.md oech/README.en.md +--- rpm/README.en.md 1970-01-01 08:00:00.000000000 +0800 ++++ oech/README.en.md 2024-04-16 18:08:37.744536626 +0800 +@@ -0,0 +1,526 @@ ++ ++ ++- [Overview](#Overview) ++ - [tool describes](#tool describes) ++ - [Compatibility Conclusion Inheritance Description](#Compatibility Conclusion Inheritance Description) ++ - [Overall compatibility Conclusion Inheritance strategy](#Overall compatibility Conclusion Inheritance strategy) ++ - [Board Compatibility Conclusion Inheritance Strategy](#Board Compatibility Conclusion Inheritance Strategy) ++ - [version release](#version release) ++ - [Version Maintenance Statement](#Version Maintenance Statement) ++ - [tool uses](#tool uses) ++ - [use process](#use process) ++ - [User Usage Process](#User Usage Process) ++ - [operating environment](#operating environment) ++ - [environmental requirements](#environmental requirements) ++ - [Operating environment networking](#Operating environment networking) ++- [tool mounting](#tool mounting) ++ - [prerequisite](#prerequisite) ++ - [Get the installation package](#Get the installation package) ++ - [installation process](#installation process) ++ - [Client](#Client) ++ - [Server](#Server) ++- [use guidance](#use guidance) ++ - [prerequisite](#prerequisite-1) ++ - [using step](#using step) ++- [result acquisition](#result acquisition) ++ - [view results](#view results) ++ - [results show](#results show) ++ - [Review of test results](#Review of test results) ++- [Test item introduction](#Test item introduction) ++ - [Existing test items](#Existing test items) ++- [Community Developer Involvement Presentations](#Community Developer Involvement Presentations) ++ - [environment deployment](#environment deployment) ++ - [New test item](#New test item) ++- [FAQ](#FAQ) ++ ++ ++ ++# Overview ++ ++## tool describes ++ ++oec-hardware tool is a hardware compatibility test tool provided by openEuler community. oec-hardware provides compatibility verification test of server whole machine, board and openEuler. Verification is limited to basic function verification, excluding performance test and other tests. ++ ++Hardware manufacturers can use oec-hardware when they need to verify the compatibility of hardware products with openEuler. The community provides a hardware compatibility test process, and hardware manufacturers can refer to the community compatibility adaptation process to adapt to openEuler. ++ ++For hardware products tested by oec-hardware tools, openEuler will publish compatibility lists on the community website, and hardware manufacturers will publish corresponding compatibility information on the manufacturer's website. ++ ++# Compatibility Conclusion Inheritance Description ++ ++## Overall compatibility Conclusion Inheritance strategy ++ ++If the verification adapter has the same motherboard and CPU generation, the compatibility conclusion can be inherited. ++ ++## Board Compatibility Conclusion Inheritance Strategy ++ ++The card type is generally confirmed by quadruples. ++ ++``` ++Quadruple tuple information: ++ - vendorID: Chip manufacturer ID ++ - deviceID: Chip model ID ++ - svID: Board manufacturer ID ++ - ssID: Board model ID ++ ++Ways to view the quadruple tuple: ++ - View it through iBMC ++ - Run the command "lspci -nvv" in the system ++``` ++ ++The board compatibility conclusion inherits the following three points: ++ ++1. vendorID and deviceID are different ++ ++ Unable to inherit compatibility conclusions. ++ ++2. vendorID and deviceID, svID are different ++ ++ The chip model is the same but the board manufacturer is different, and the compatibility conclusion cannot be inherited. ++ ++3. Same vendorID, deviceID, svID ++ ++ Different boards made of the same chip can inherit the compatibility conclusion on behalf of the same board manufacturer. ++ ++4. Same vendorID, deviceID, svID, ssID ++ ++ Represents the same board manufacturer, the same series of boards made of the same chip, the same quadruple information, and can inherit the compatibility conclusion. The manufacturer evaluates this series of boards by himself, and can write representative board names. ++ ++The board manufacturer refers to the compatibility list of the community and the board being adapted. If the compatibility conclusion can be inherited, it needs to be explained in the corresponding adaptation issue. The compatibility sig group will conduct manual review, and the corresponding compatibility list will be issued after the review is passed. ++ ++# version release ++ ++Detailed release strategy and release plan see `docs/design_docs/oech_rpm_version_design.md` ++ ++## Version Maintenance Statement ++ ++oec-hardware-version 1.1.1 will no longer be updated and maintained. Please obtain the latest version of oec-hardware for installation and use. ++ ++# tool uses ++ ++## use process ++ ++### User Usage Process ++ ++![user-flow](docs/pictures/user-flow.png) ++ ++## operating environment ++ ++### environmental requirements ++ ++#### Environmental requirements for complete machine test ++ ++| Project | Requirements | ++| ------------------ | ------------------------------------------------------------ | ++| Number of machines | Two complete machines are required, and the service network interface is interconnected. | ++| Hardware | At least one RAID card and one NIC (including integrated motherboard hardware) | ++| Memory内存 | Recommended full | ++ ++#### Board test environment requirements ++ ++| Project | Requirements | ++| ------------- | ------------------------------------------------------------ | ++| server models | Taishan200(Model 2280), 2288H V5 or equivalent servers (see the community compatibility list for details). For x86_64 servers, you can choose one of icelake/cooperlake/cascade, preferably icelake. | ++| RAID Card | group raid is required, at least group raid 0 | ++| NIC/IB Card | The server and the test end need to insert a board of the same type respectively, configure the IP of the same network segment, and ensure direct connection and intercommunication. | ++| FC Card | Magnetic array needs to be connected, at least two luns | ++ ++**Note** ++ ++If you want to test external drivers, install the drivers in advance and configure the test environment. ++ ++GPU, VGPU, keycard and other test items need to install external drivers in advance to ensure that the environment deployment is completed, and then use this tool for testing. ++ ++### Operating environment networking ++ ++![test-network](docs/pictures/test-network.png) ++ ++# Offline Installation Environment Deployment Requirements ++ ++1. Download openEuler's official everything iso and mount the local repo source. ++ ++ If you cannot find a dependent package in everything iso, download the package manually from the openEuler repo and upload it to the tester for installation. ++ ++2. Root different test items, configure offline test dependencies ++ ++ | Test item | filename | path | ++ | --------- | ------------------------------------------------------------ | ------ | ++ | GPU | [https://github.com/wilicc/gpu-burn](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Fwilicc%2Fgpu-burn) | `/opt` | ++ | | [https://github.com/NVIDIA/cuda-samples/archive/refs/heads/master.zip](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2FNVIDIA%2Fcuda-samples%2Farchive%2Frefs%2Fheads%2Fmaster.zip) | `/opt` | ++ | VGPU | NVIDIA vgpu client driver package | /root | ++ | | Download the virtual machine image file with the corresponding version and architecture, taking openEuler 22.03LTS and x86_64 as an example:[https://repo.openeuler.org/openEuler-22.03-LTS/virtual_machine_img/x86_64/openEuler-22.03-LTS-x86_64.qcow2.xz](https://gitee.com/link?target=https%3A%2F%2Frepo.openeuler.org%2FopenEuler-22.03-LTS%2Fvirtual_machine_img%2Fx86_64%2FopenEuler-22.03-LTS-x86_64.qcow2.xz) | `/opt` | ++ ++# tool mounting ++ ++## prerequisite ++ ++This tool supports openEuler 20.03 (LTS) or higher. For details of supported operating system versions, please see file `oec-hardware/scripts/kernelrelease.json` . ++ ++## Get the installation package ++ ++Configure the everything and update repo sources of the corresponding versions in the openEuler official repo, and use `dnf` to get the package for installation. ++ ++## installation process ++ ++### client ++ ++1. Install client oec-hardware using `dnf` . ++ ++ ``` ++ dnf install oec-hardware ++ ``` ++ ++2. Enter `oech` command, it can run normally, it means that the installation is successful. ++ ++### server ++ ++1. Install server-side oec-hardware-server using `dnf` . ++ ++ ``` ++ dnf install oec-hardware-server ++ ``` ++ ++2. Start the service. This service provides web services through nginx service. By default, port 80 is used. External ports can be modified through nginx service configuration files. Please ensure that these ports are not occupied before starting. ++ ++ ``` ++ systemctl start oech-server.service ++ systemctl start nginx.service ++ ``` ++ ++3. Turn off firewall and SElinux. ++ ++ ``` ++ systemctl stop firewalld ++ iptables -F ++ setenforce 0 ++ ``` ++ ++# use guidance ++ ++## prerequisite ++ ++- The `/usr/share/oech/kernelrelease.json` file lists all currently supported system versions. Use the `uname -a` command to confirm whether the current system kernel version belongs to the supported version of the framework. ++- By default, the framework scans all network cards. Before testing the network cards, please filter the tested network cards by yourself. The test port is required to be connected and the status is up. It is recommended not to use the service network interface for network card testing. ++- `/usr/share/oech/lib/config/test_config.yaml ` is the configuration file template of hardware test items. `fc` , `raid` , `disk` , `ethernet` and `infiniband` need to be configured according to the actual environment before hardware test. Other hardware tests do not need to be configured. For network card test, if the IP address is automatically added by the tool, after the test is completed, for security reasons, the IP of the server needs to be manually deleted. ++ ++## using step ++ ++1. Launch the test framework on the client side. The client starts `oech` , selects the test category, `compatible` indicates compatibility, `virtualization` indicates virtualization, and fills in the category number, i.e., enter `1` to indicate the selected compatibility category. ++ ++ ``` ++ # oech ++ Please select test category. ++ No. category ++ 1 compatible ++ 2 virtualization ++ Please select test category No:1 ++ ``` ++ ++2. Fill in configuration items `ID` , `URL` and `Server` ; `ID` is recommended to fill in the issue ID on gitee (note: `ID` cannot contain special characters); `URL` is recommended to fill in the product link; `Server` must be filled in as the server domain name or ip that the client can directly access, which is used to display the test report and the server for network testing. The default port number of server `nginx` is `80` . If the port is not modified after the server is installed, you only need to enter the service IP address of the server for the value `Compatibility Test Server` ; otherwise, you need to bring the port number, such as `172.167.145.2:90` . ++ ++ ``` ++ The openEuler Hardware Compatibility Test Suite ++ Please provide your Compatibility Test ID: ++ Please provide your Product URL: ++ Please provide the Compatibility Test Server (Hostname or Ipaddr): ++ ``` ++ ++3. Enter the test kit selection interface. In the case selection interface, the framework will automatically scan the hardware and select the test suite available for testing in the current environment. Enter `edit` to enter the test suite selection interface. ++ ++ ``` ++ These tests are recommended to complete the compatibility test: ++ No. Run-Now? status Class Device driverName driverVersion chipModel boardModel ++ 1 yes NotRun acpi ++ 2 yes NotRun clock ++ 3 yes NotRun cpufreq ++ 4 yes NotRun disk ++ 5 yes NotRun ethernet enp3s0 hinic 2.3.2.17 Hi1822 SP580 ++ 6 yes NotRun ethernet enp4s0 hinic 2.3.2.17 Hi1822 SP580 ++ 7 yes NotRun ethernet enp125s0f0 hns3 HNS GE/10GE/25GE TM210/TM280 ++ 8 yes NotRun ethernet enp125s0f1 hns3 HNS GE/10GE/25GE TM210/TM280 ++ 9 yes NotRun raid 0000:04:00.0 megaraid_sas 07.714.04.00-rc1 SAS3408 SR150-M ++ 10 yes NotRun gpu 0000:03:00.0 amdgpu Navi Radeon PRO W6800 ++ 11 yes NotRun ipmi ++ 12 yes NotRun kabi ++ 13 yes NotRun kdump ++ 14 yes NotRun memory ++ 15 yes NotRun perf ++ 16 yes NotRun system ++ 17 yes NotRun usb ++ 18 yes NotRun watchdog ++ Ready to begin testing? (run|edit|quit) ++ ``` ++ ++4. Select the test kit. `all|none` is used for `全选|全取消` respectively (the mandatory test item `system` cannot be cancelled, and the status of `system` will change to `Force` after repeated successful execution); the number number can be selected as the test set, and only one number can be selected at a time. After pressing the enter character, `no` changes to `yes` , indicating that the test set has been selected. ++ ++ ``` ++ Select tests to run: ++ No. Run-Now? status Class Device driverName driverVersion chipModel boardModel ++ 1 no NotRun acpi ++ 2 no NotRun clock ++ 3 no NotRun cpufreq ++ 4 no NotRun disk ++ 5 yes NotRun ethernet enp3s0 hinic 2.3.2.17 Hi1822 SP580 ++ 6 no NotRun ethernet enp4s0 hinic 2.3.2.17 Hi1822 SP580 ++ 7 no NotRun ethernet enp125s0f0 hns3 HNS GE/10GE/25GE TM210/TM280 ++ 8 no NotRun ethernet enp125s0f1 hns3 HNS GE/10GE/25GE TM210/TM280 ++ 9 yes NotRun raid 0000:04:00.0 megaraid_sas 07.714.04.00-rc1 SAS3408 SR150-M ++ 10 yes NotRun gpu 0000:03:00.0 amdgpu Navi Radeon PRO W6800 ++ 11 yes NotRun ipmi ++ 12 yes NotRun kabi ++ 13 yes NotRun kdump ++ 14 yes NotRun memory ++ 15 yes NotRun perf ++ 16 yes NotRun system ++ 17 yes NotRun usb ++ 18 yes NotRun watchdog ++ Selection (|all|none|quit|run): ++ ``` ++ ++5. Start testing. Enter `run` to start the test. ++ ++6. Upload test results. After the test is completed, you can upload the test results to the server for easy result display and log analysis. If the upload fails, check the network configuration and re-upload the test results. ++ ++ ``` ++ ... ++ ------------- Summary ------------- ++ ethernet-enp3s0 PASS ++ system PASS ++ Log saved to /usr/share/oech/logs/oech-20200228210118-TnvUJxFb50.tar succ. ++ Do you want to submit last result? (y|n) y ++ Uploading... ++ Successfully uploaded result to server X.X.X.X. ++ ``` ++ ++# result acquisition ++ ++## view results ++ ++1. Open the server IP address in the browser, click the navigation bar `Results` interface, and find the corresponding test id to enter. ++ ++ ![results](docs/pictures/results.png) ++ ++2. Enter a single task page to see specific test results, including environmental information and execution results. ++ ++ - `Summary` View all test results. ++ ++ - `Devices` View all hardware device information. ++ ++ - `Runtime` View test run times and total task execution logs. ++ ++ - `Attachment` Download Test Log Attachment. ++ ++ - `Submit` means upload the results to Euler's official authentication server (currently not open). ++ ++ ![result-qemu](docs/pictures/result-qemu.png) ++ ++## results show ++ ++The Result column displays the test results, which can be either PASS or FAIL. If the result is FAIL, you can click the result directly to view the execution log, and check the case code according to the error report. ++ ++## Review of test results ++ ++If the tested hardware and complete machine need to be published to the openEuler compatibility list, please upload all the following test results to the relevant adaptation issue: ++ ++- oec-hardware test log ++ ++- html test report generated by oec-hardware-server ++ ++- Compatibility manifest file ++ ++ After oec-hardware is executed, compatibility information file `hw_compatibility.json` will be automatically generated for the hardware passing the test. Please refer to this file to fill in templates under templates directory, and then upload the filled template file. ++ ++ The whole machine adaptation needs to test at least one RAID card and one network card, and provide corresponding information. ++ ++# Test item introduction ++ ++## Existing test items ++ ++### compatible ++ ++1. **system** ++ ++ - Check if this tool has been modified. ++ - Check if OS version and kernel version match. ++ - Check if the kernel is modified/infected. ++ - Check if selinux is enabled properly. ++ - Use the dmidecode tool to read hardware information. ++ ++2. **cpufreq** ++ ++ - Test whether cpu runs at the same frequency as expected under different fm strategies. ++ - Test whether the time required for cpu to calculate exactly the same specification at different frequencies is inversely related to the frequency value. ++ ++3. **clock** ++ ++ - Test time vectoricity, no backtracking. ++ - Test basic stability of RTC hardware clock. ++ ++4. **memory** ++ ++ - Use the memtester tool for memory read and write testing. ++ - mmap all available system memory, trigger swap, 120s read and write test. ++ - Test hugetlb. ++ - Memory hot plug test. ++ ++5. **network** ++ ++ - Use ethtool to get network card information and ifconfig to perform down/up tests on the network card. ++ ++ - Use qperf to test ethernet tcp/udp latency and bandwidth, as well as http upload and download rates. ++ ++ - Use perftest to test latency and bandwidth of infiniband(IB) or RoCE network protocols. ++ ++ **Note** ++ ++ When testing the network bandwidth, please confirm in advance that the network card speed of the server is not lower than that of the client, and ensure that there is no other traffic interference on the test network. ++ ++6. **disk** ++ ++ Sequential/random read-write testing of bare disks/file systems using fio tools. ++ ++7. **kdump** ++ ++ Trigger kdump to test whether the vmcore file can be generated and parsed normally. ++ ++8. **watchdog** ++ ++ Trigger watchdog to test whether the system can be reset normally. ++ ++9. **perf** ++ ++ - Collect events generated by hardware in the system. ++ - Collect sampling information and view statistical results. ++ ++10. **cdrom** ++ ++ Burn and read optical drives using mkisofs and cdrecord. ++ ++11. **ipmi** ++ ++ Query IPMI information using ipmitool. ++ ++12. **nvme** ++ ++ Use nvme-cli tool to format, read and write, query and test the disk. ++ ++13. **usb** ++ ++ Plug and unplug usb devices and test whether usb interfaces can be recognized normally. ++ ++14. **acpi** ++ ++ Use the acpidump tool to read the data. ++ ++15. **FC** ++ ++ Sequential/random read-write testing of FC storage servers using fio tools. ++ ++16. **RAID** ++ ++ Use fio tool for sequential/random read/write test of hard disk under RAID. ++ ++17. **keycard** ++ ++ Test whether the encryption card can be used normally. ++ ++18. **GPU** ++ ++ - NVIDIA GPU ++ ++ - Stress test GPU using gpu_burn tool. ++ - Use cuda_samples to test basic GPU functionality. ++ ++ - AMD GPU ++ ++ - Use the radeontop tool to view GPU usage. ++ ++ - Use the glmark2 tool to view GPU screen information. ++ ++ - Stress testing GPU using glmark2 tool. ++ ++ **Note** ++ ++ AMD GPU testing relies on a graphical interface, which needs to be deployed and switched to before testing. ++ ++19. **infiniband** ++ ++ - Use ethtool to get network card information. ++ ++ - Use perftest to test the latency and bandwidth of the infiniband(IB) network protocol. ++ ++ **Note** ++ ++ When testing the network bandwidth, please confirm in advance that the network card speed of the server is not lower than that of the client, and ensure that there is no other traffic interference on the test network. ++ ++20. **kabi** ++ ++ - Test whether the kernel kabi has changed compared to the standard system. ++ ++21. **VGPU** ++ ++ - Test NVIDIA VGPU server-side basics. ++ - Deploy NVIDIA VGPU client virtual machines, test driver installation, test client VGPU functionality. ++ - The VGPU server monitors the operation of the client. ++ ++22. **spdk** ++ ++ - Sequential and random read and write testing of SSDs using the spdk tool. ++ ++23. **dpdk** ++ ++ - Use dpdk-testpmd to connect two Ethernet ports in loopback mode. In the absence of an external traffic generator, the client uses Tx-only mode as the packet source, and the server uses Rx-only mode as the packet receiver to test the port transmission rate function. ++ ++### virtualization ++ ++``` ++Virtualization has use cases waiting for updates. ++``` ++ ++# Community Developer Involvement Presentations ++ ++## environment deployment ++ ++1. Fork oec-hardware source code repository to personal space; ++ ++2. clone repository source code; ++ ++ ``` ++ git clone https://gitee.com/${gitee_id}/oec-hardware.git ++ ``` ++ ++3. Enter the corresponding directory, compile and install; ++ ++ ``` ++ cd oec-hardware ++ make && make install ++ ``` ++ ++4. Package verification, here take version 1.0.0 as an example for packaging, the specific packaging version please refer to the version in the spec file. ++ ++ ``` ++ dnf install -y rpm-build ++ cd oec-hardware ++ tar jcvf oec-hardware-1.0.0.tar.bz2 * ++ mkdir -p /root/rpmbuild/SOURCES ++ cp oec-hardware-1.0.0.tar.bz2 /root/rpmbuild/SOURCES/ ++ rpmbuild -ba oec-hardware.spec ++ ``` ++ ++## New test item ++ ++1. If there is already a category of test items in the directory `tests/` , add test items directly under the category. The directory name of the test items should be the same as the name of the following entry function. For example, the entry file of acpi test items is acpi.py file, and inherit the framework `Test` to implement your own test class. Otherwise, add category catalog first, and then add test items under category. ++2. Important member variables or functions in the test class: ++ - Function `test` -Required to test the main flow. ++ - Function `setup` -environment preparation before test, mainly used to initialize the relevant information of the tested equipment, you can refer to network test. ++ - Function `teardown` -environment cleaning after test is completed, mainly used to ensure that the environment can be restored correctly regardless of test success or failure, you can refer to network test. ++ - Variable `requirements` -stores the rpm package names that the test depends on as an array, and the framework is automatically installed before the test starts. ++ - Variables `reboot` and `rebootup` -If `reboot = True` indicates that the test suite/test case will restart the system and continue to execute the function specified by `rebootup` after restart, refer to kdump test. ++3. Add identification display of corresponding test item in `hwcompatible/compatibility.py` file. Refer to https://gitee.com/openeuler/oec-hardware/blob/master/docs/develop_doc/get_board.md for card identification method. ++ ++# FAQ ++ ++ Kunpeng Xiaozhi provides solutions to problems that may be encountered during oec-hardware testing, and users can retrieve solutions to problems. In addition, the Kunpeng Forum provides complete oec-hardware installation and use questions, and users can obtain solutions according to scenarios. ++ ++If you encounter problems in the adaptation process, it is recommended that users first obtain support through Kunpeng Xiaozhi or Kunpeng Forum. ++ ++If Kunpeng Xiaozhi can't solve it, you can submit issue feedback under this repository or send an email to openEuler Community Compatibility SIG Group Email: oecompatibility@openeuler.org +\ No newline at end of file +diff -Naur rpm/README.md oech/README.md +--- rpm/README.md 2023-10-24 22:25:50.000000000 +0800 ++++ oech/README.md 2024-04-16 18:08:37.744536626 +0800 +@@ -204,18 +204,26 @@ + * `/usr/share/oech/lib/config/test_config.yaml ` 是硬件测试项配置文件模板,`fc`、`raid`、`disk`、`ethernet`、`infiniband`硬件测试前需先根据实际环境进行配置,其它硬件测试不需要配置。对于网卡测试,如果是工具自动添加的IP地址,测试完成后,为了安全,服务端的IP需手动删除。 + + ## 使用步骤 ++1. 在客户端启动测试框架。客户端启动 `oech`,选择测试类别,`compatible`表示兼容性,`virtualization`表示虚拟化,填写类别序号,即输入`1`表示选择的兼容性类别。 ++ ``` ++ # oech ++ Please select test category. ++ No. category ++ 1 compatible ++ 2 virtualization ++ Please select test category No:1 ++ ``` + +-1. 在客户端启动测试框架。在客户端启动 `oech`,填写`ID`、`URL`、`Server`配置项,`ID` 建议填写 gitee 上的 issue ID(注意:`ID`中不能带特殊字符);`URL`建议填写产品链接;`Server` 必须填写为客户端可以直接访问的服务器域名或 ip,用于展示测试报告和作网络测试的服务端。服务端`nginx`默认端口号是`80`,如果服务端安装完成后没有修改该端口,`Compatibility Test Server` 的值只需要输入服务端的业务IP地址;否则需要带上端口号,比如:`172.167.145.2:90`。 ++2. 填写`ID`、`URL`、`Server`配置项,`ID` 建议填写 gitee 上的 issue ID(注意:`ID`中不能带特殊字符);`URL`建议填写产品链接;`Server` 必须填写为客户端可以直接访问的服务器域名或 ip,用于展示测试报告和作网络测试的服务端。服务端`nginx`默认端口号是`80`,如果服务端安装完成后没有修改该端口,`Compatibility Test Server` 的值只需要输入服务端的业务IP地址;否则需要带上端口号,比如:`172.167.145.2:90`。 + + ``` +- # oech + The openEuler Hardware Compatibility Test Suite + Please provide your Compatibility Test ID: + Please provide your Product URL: + Please provide the Compatibility Test Server (Hostname or Ipaddr): + ``` + +-2. 进入测试套选择界面。在用例选择界面,框架将自动扫描硬件并选取当前环境可供测试的测试套,输入 `edit` 可以进入测试套选择界面。 ++3. 进入测试套选择界面。在用例选择界面,框架将自动扫描硬件并选取当前环境可供测试的测试套,输入 `edit` 可以进入测试套选择界面。 + + ``` + These tests are recommended to complete the compatibility test: +@@ -228,18 +236,20 @@ + 6 yes NotRun ethernet enp4s0 hinic 2.3.2.17 Hi1822 SP580 + 7 yes NotRun ethernet enp125s0f0 hns3 HNS GE/10GE/25GE TM210/TM280 + 8 yes NotRun ethernet enp125s0f1 hns3 HNS GE/10GE/25GE TM210/TM280 +- 9 yes NotRun ipmi +- 10 yes NotRun kabi +- 11 yes NotRun kdump +- 12 yes NotRun memory +- 13 yes NotRun perf +- 14 yes NotRun system +- 15 yes NotRun usb +- 16 yes NotRun watchdog ++ 9 yes NotRun raid 0000:04:00.0 megaraid_sas 07.714.04.00-rc1 SAS3408 SR150-M ++ 10 yes NotRun gpu 0000:03:00.0 amdgpu Navi Radeon PRO W6800 ++ 11 yes NotRun ipmi ++ 12 yes NotRun kabi ++ 13 yes NotRun kdump ++ 14 yes NotRun memory ++ 15 yes NotRun perf ++ 16 yes NotRun system ++ 17 yes NotRun usb ++ 18 yes NotRun watchdog + Ready to begin testing? (run|edit|quit) + ``` + +-3. 选择测试套。`all|none` 分别用于 `全选|全取消`(必测项 `system` 不可取消,多次执行成功后 `system` 的状态会变为`Force`);数字编号可选择测试套,每次只能选择一个数字,按回车符之后 `no` 变为 `yes`,表示已选择该测试套。 ++4. 选择测试套。`all|none` 分别用于 `全选|全取消`(必测项 `system` 不可取消,多次执行成功后 `system` 的状态会变为`Force`);数字编号可选择测试套,每次只能选择一个数字,按回车符之后 `no` 变为 `yes`,表示已选择该测试套。 + + ``` + Select tests to run: +@@ -252,20 +262,22 @@ + 6 no NotRun ethernet enp4s0 hinic 2.3.2.17 Hi1822 SP580 + 7 no NotRun ethernet enp125s0f0 hns3 HNS GE/10GE/25GE TM210/TM280 + 8 no NotRun ethernet enp125s0f1 hns3 HNS GE/10GE/25GE TM210/TM280 +- 9 no NotRun ipmi +- 10 no NotRun kabi +- 11 no NotRun kdump +- 12 no NotRun memory +- 13 no NotRun perf +- 14 yes NotRun system +- 15 no NotRun usb +- 16 no NotRun watchdog ++ 9 yes NotRun raid 0000:04:00.0 megaraid_sas 07.714.04.00-rc1 SAS3408 SR150-M ++ 10 yes NotRun gpu 0000:03:00.0 amdgpu Navi Radeon PRO W6800 ++ 11 yes NotRun ipmi ++ 12 yes NotRun kabi ++ 13 yes NotRun kdump ++ 14 yes NotRun memory ++ 15 yes NotRun perf ++ 16 yes NotRun system ++ 17 yes NotRun usb ++ 18 yes NotRun watchdog + Selection (|all|none|quit|run): + ``` + +-4. 开始测试。选择完成后输入 `run` 开始测试。 ++5. 开始测试。选择完成后输入 `run` 开始测试。 + +-5. 上传测试结果。测试完成后可以上传测试结果到服务器,便于结果展示和日志分析。如果上传失败,请检查网络配置,然后重新上传测试结果。 ++6. 上传测试结果。测试完成后可以上传测试结果到服务器,便于结果展示和日志分析。如果上传失败,请检查网络配置,然后重新上传测试结果。 + + ``` + ... +@@ -322,6 +334,7 @@ + # 测试项介绍 + + ## 已有测试项 ++### compatible + + 1. **system** + +@@ -453,6 +466,10 @@ + 客户端使用发包模式(Tx-only mode)作为数据包源,服务端使用收包模式(Rx-only mode) + 作为数据包接收器, 测试端口传输速率功能。 + ++### virtualization ++ ++ 虚拟化已有用例待更新 ++ + # 社区开发者参与介绍 + + ## 环境部署 +@@ -485,7 +502,7 @@ + + ## 新增测试项 + +-1. 在 `tests/` 目录下添加测试项模板,通过继承框架 `Test` 实现自己的测试类。 ++1. `tests/` 目录下如果已有测试项所在的类别,直接在类别下添加测试项,测试项的目录名称需和下面入口函数名称相同,比如acpi测试项的入口文件是acpi.py文件,并继承框架 `Test` 实现自己的测试类。否则先添加类别目录,在类别下面再添加测试项。 + + 2. 测试类中的重要成员变量或函数介绍: + +@@ -499,7 +516,7 @@ + + - 变量 `reboot` 和 `rebootup` - 若 `reboot = True` 表示该测试套/测试用例会重启系统,且在重启后继续执行 `rebootup` 指定的函数,可以参考 kdump 测试。 + +-3. 在 `hwcompatible/compatibility.py` 文件中添加对应测试项的识别显示。 ++3. 在 `hwcompatible/compatibility.py` 文件中添加对应测试项的识别显示,板卡识别方法可参考https://gitee.com/openeuler/oec-hardware/blob/master/docs/develop_doc/get_board.md 文档。 + + # FAQ + +diff -Naur rpm/scripts/kernelrelease.json oech/scripts/kernelrelease.json +--- rpm/scripts/kernelrelease.json 2023-10-24 22:25:50.000000000 +0800 ++++ oech/scripts/kernelrelease.json 2024-04-16 18:08:37.756536769 +0800 +@@ -9,12 +9,21 @@ + "openEuler 22.03 LTS": "5.10.0", + "openEuler 22.03 (LTS-SP1)": "5.10.0", + "openEuler 22.03 (LTS-SP2)": "5.10.0", +- "openEuler 22.03 (LTS-SP3)": "5.10.0" ++ "openEuler 22.03 (LTS-SP3)": "5.10.0", ++ "openEuler 22.03 (LTS-SP4)": "5.10.0", ++ "openEuler 24.03 (LTS)": "6.6.0" + }, + "KylinSec": { + "345": "openEuler-20.03-LTS-SP3/4.19.90-2112.8.0.0131.oe1", + "351": "openEuler-22.03-LTS/5.10.0-60.18.0.50.oe2203", + "352": "openEuler-22.03-LTS-SP2/5.10.0-153.12.0.92.oe2203sp2" +- } ++ }, ++ "Kylin": { ++ "V10": "openEuler-20.03-LTS-SP3/4.19.90-2112.8.0.0131.oe1" ++ }, ++ "UOS": { ++ "20": "openEuler-22.03-LTS/5.10.0-60.18.0.50.oe2203", ++ "20": "openEuler-22.03-LTS-SP2/5.10.0-153.12.0.92.oe2203sp2" ++ } + } + +diff -Naur rpm/server/oech-server-pre.sh oech/server/oech-server-pre.sh +--- rpm/server/oech-server-pre.sh 2023-10-24 22:25:50.000000000 +0800 ++++ oech/server/oech-server-pre.sh 2024-04-16 18:08:37.756536769 +0800 +@@ -15,3 +15,8 @@ + dir_cert=/usr/share/oech/lib/server + + test -f ${dir_nginx}/uwsgi.conf || cp -af ${dir_cert}/uwsgi.conf ${dir_nginx} ++ ++if [ ! -f /usr/bin/uwsgi ]; ++then ++ ln -s /usr/sbin/uwsgi /usr/bin/uwsgi ++fi +diff -Naur rpm/server/uwsgi.ini oech/server/uwsgi.ini +--- rpm/server/uwsgi.ini 2023-10-24 22:25:50.000000000 +0800 ++++ oech/server/uwsgi.ini 2024-04-16 18:08:37.756536769 +0800 +@@ -6,4 +6,5 @@ + processes = 4 + pidfile = /usr/share/oech/lib/server/uwsgi.pid + master = true +-buffer-size = 65536 +\ No newline at end of file ++buffer-size = 65536 ++plugins = python3 +\ No newline at end of file +diff -Naur rpm/tests/compatible/cpufreq/cpufreq.py oech/tests/compatible/cpufreq/cpufreq.py +--- rpm/tests/compatible/cpufreq/cpufreq.py 2024-04-16 18:17:05.014569227 +0800 ++++ oech/tests/compatible/cpufreq/cpufreq.py 2024-04-16 18:08:37.760536817 +0800 +@@ -136,7 +136,7 @@ + :return: + """ + self.process = self.command.run_cmd( +- "taskset -c %s python -u %s/cpufreq/cal.py" % (self.cpu, CertEnv.testdirectoy), log_print=False) ++ "taskset -c %s python3 -u %s/compatible/cpufreq/cal.py" % (self.cpu, CertEnv.testdirectoy), log_print=False) + + def get_runtime(self): + """ +diff -Naur rpm/tests/compatible/disk/common.py oech/tests/compatible/disk/common.py +--- rpm/tests/compatible/disk/common.py 2024-04-16 18:17:05.014569227 +0800 ++++ oech/tests/compatible/disk/common.py 2024-04-16 18:08:37.760536817 +0800 +@@ -106,17 +106,29 @@ + size = 1048576 + + logger.info("Starting sequential raw IO test...") +- opts = "-direct=1 -iodepth 4 -rw=rw -rwmixread=50 -group_reporting -name=file -runtime=300" +- if not do_fio(logger, command, device, size, opts): +- logger.error("%s sequential raw IO test failed." % device) +- return False ++ # opts = "-direct=1 -iodepth 4 -rw=rw -rwmixread=50 -group_reporting -name=file -runtime=300" ++ opts_list = ["-direct=1 -iodepth 32 -rw=write -group_reporting -name=file", ++ "-direct=1 -iodepth 32 -rw=read -group_reporting -name=file -runtime=300", ++ "-direct=1 -iodepth 32 -rw=write -group_reporting -name=file -runtime=300", ++ "-direct=1 -iodepth 4 -rw=rw -rwmixread=50 -group_reporting -name=file -runtime=300", ++ ] ++ for opts in opts_list: ++ if not do_fio(logger, command, device, size, opts): ++ logger.error("%s sequential raw IO test failed." % device) ++ return False ++ logger.info("%s sequential raw IO test succeed." % device) + + logger.info("Starting rand raw IO test...") +- opts = "-direct=1 -iodepth 4 -rw=randrw -rwmixread=50 " \ +- "-group_reporting -name=file -runtime=300" +- if not do_fio(logger, command, device, size, opts): +- logger.error("%s rand raw IO test failed." % device) +- return False ++ # opts = "-direct=1 -iodepth 4 -rw=randrw -rwmixread=50 " \ ++ # "-group_reporting -name=file -runtime=300" ++ opts_list = ["-direct=1 -iodepth 4 -rw=randrw -rwmixread=50 -group_reporting -name=file -runtime=300", ++ "-direct=1 -iodepth 32 -rw=randread -group_reporting -name=file -runtime=300", ++ "-direct=1 -iodepth 32 -rw=randwrite -group_reporting -name=file -runtime=300"] ++ for opts in opts_list: ++ if not do_fio(logger, command, device, size, opts): ++ logger.error("%s rand raw IO test failed." % device) ++ return False ++ logger.info("%s sequential rand raw IO test succeed." % device) + + return True + +@@ -189,7 +201,6 @@ + logger.error("%s fio failed." % filepath) + return False + a_bs = a_bs * 2 +- logger.info("%s fio succeed." % filepath) + return True + + +diff -Naur rpm/tests/compatible/dpdk/dpdk.py oech/tests/compatible/dpdk/dpdk.py +--- rpm/tests/compatible/dpdk/dpdk.py 2024-04-16 18:17:05.014569227 +0800 ++++ oech/tests/compatible/dpdk/dpdk.py 2024-04-16 18:08:37.760536817 +0800 +@@ -348,7 +348,7 @@ + self.logger.error("Set speed of %s failed." % self.interface) + + count = 500 +- cmd = "ping -q -c %d -i 0 %s | grep 'packet loss' | awk '{print $6}'" % ( ++ cmd = "ping -q -c %d -i 0.001 %s | grep 'packet loss' | awk '{print $6}'" % ( + count, self.server_ip) + for _ in range(self.retries): + result = self.command.run_cmd(cmd, ignore_errors=True) +diff -Naur rpm/tests/compatible/dpdk/Makefile oech/tests/compatible/dpdk/Makefile +--- rpm/tests/compatible/dpdk/Makefile 2024-04-16 18:17:05.014569227 +0800 ++++ oech/tests/compatible/dpdk/Makefile 2024-04-16 18:08:37.760536817 +0800 +@@ -17,7 +17,7 @@ + + install: + mkdir -p $(DEST) +- cp -a $(SUBDIR)/build *.py $(DEST) ++ cp -a *.py $(DEST) + chmod a+x $(DEST)/*.py + + clean: +diff -Naur rpm/tests/compatible/gpu/nvidia_gpu.py oech/tests/compatible/gpu/nvidia_gpu.py +--- rpm/tests/compatible/gpu/nvidia_gpu.py 2024-04-16 18:17:05.014569227 +0800 ++++ oech/tests/compatible/gpu/nvidia_gpu.py 2024-04-16 18:08:37.760536817 +0800 +@@ -15,6 +15,7 @@ + import os + import re + import time ++import platform + from subprocess import getstatusoutput + gpu_dir = os.path.dirname(os.path.realpath(__file__)) + +@@ -27,6 +28,9 @@ + self.cuda_samples_log = os.path.join( + self.logger.logdir, 'cuda_samples.log') + self.gpu_burn = os.path.join(self.logger.logdir, 'gpu_burn.log') ++ self.gpu_clpeak_log = os.path.join(self.logger.logdir, 'gpu_clpeak.log') ++ self.gpu_nvidia_smi_log = os.path.join(self.logger.logdir, 'gpu_nvidia_smi.log') ++ self.gpu_vulkan_log = os.path.join(self.logger.logdir, 'gpu_vulkan.log') + self.smi_name = "nvidia-smi" + + def get_driver_info(self): +@@ -136,9 +140,21 @@ + self.logger.error("Test gpu pressure failed.") + result = False + ++ machine = platform.machine() ++ if machine == 'x86_64': ++ self.logger.info("Start to test clpeak.") ++ self.set_default_gpu() ++ code = self.command.run_cmd( ++ "bash %s/test_nvidia_gpu.sh test_clpeak '%s'" % (gpu_dir, self.gpu_clpeak_log)) ++ if code[2] == 0: ++ self.logger.info("Test clpeak succeed.") ++ else: ++ result = False ++ self.logger.error("Test clpeak failed.") ++ + self.logger.info("Start to test cuda samples.") + self.set_default_gpu() +- sample_case = "simpleOccupancy,bandwidthTest,p2pBandwidthLatencyTest,deviceQuery,clock" ++ sample_case = "simpleOccupancy,bandwidthTest,p2pBandwidthLatencyTest,deviceQuery,clock,cuda_maketest" + code = self.command.run_cmd( + "bash %s/test_nvidia_gpu.sh test_cuda_samples '%s %s'" % (gpu_dir, self.cuda_samples_log, sample_case)) + if code[2] == 0: +@@ -146,6 +162,29 @@ + else: + result = False + self.logger.error("Test cuda samples failed.") ++ ++ self.logger.info("Start to test nvidia driver using nvidia-smi tool.") ++ self.set_default_gpu() ++ code = self.command.run_cmd( ++ "bash %s/test_nvidia_gpu.sh test_nvidia_smi '%s'" % (gpu_dir, self.gpu_nvidia_smi_log)) ++ if code[2] == 0: ++ self.logger.info("Using nvidia-smi to test Drvier succeed.") ++ else: ++ result = False ++ self.logger.error("Using nvidia-smi to test Drvier failed.") ++ ++ env_display = os.getenv('DISPLAY') ++ if env_display != '': ++ self.logger.info("Start to test Vulkan.") ++ self.set_default_gpu() ++ code = self.command.run_cmd( ++ "bash %s/test_nvidia_gpu.sh test_VulkanSamples '%s'" % (gpu_dir, self.gpu_vulkan_log)) ++ if code[2] == 0: ++ self.logger.info("Test Vulkan succeed.") ++ else: ++ result = False ++ self.logger.error("Test Vulkan failed.") ++ + except Exception as e: + self.logger.error( + "Failed to run the script because compiling or setting variables: %s" % e) +diff -Naur rpm/tests/compatible/gpu/test_nvidia_gpu.sh oech/tests/compatible/gpu/test_nvidia_gpu.sh +--- rpm/tests/compatible/gpu/test_nvidia_gpu.sh 2024-04-16 18:17:05.014569227 +0800 ++++ oech/tests/compatible/gpu/test_nvidia_gpu.sh 2024-04-16 18:08:37.760536817 +0800 +@@ -15,6 +15,25 @@ + cuda_version=$(nvidia-smi -q | grep "CUDA Version" | awk '{print $4}') + cuda_name="cuda-samples-${cuda_version}" + ++function install_clpeak() { ++ cd /opt ++ res_code=0 ++ if [ ! -d clpeak ]; then ++ git clone https://gitee.com/shangbaogen/clpeak.git ++ fi ++ cd clpeak ++ git checkout 1.1.2 &>/dev/null ++ if [ ! -d build ]; then ++ mkdir build ++ fi ++ cd build ++ if [ ! -d sdk_install ]; then ++ cmake .. &>/dev/null || res_code=1 ++ fi ++ cmake --build . &>/dev/null || res_code=1 ++ return $res_code ++} ++ + function install_gpu_burn() { + cd /opt + res_code=0 +@@ -50,15 +69,40 @@ + return 0 + } + ++function install_VulkanSamples() { ++ cd /opt ++ res_code=0 ++ if [ ! -d VulkanSamples ]; then ++ git clone https://github.com/LunarG/VulkanSamples.git ++ fi ++ cd VulkanSamples ++ if [ ! -d build ]; then ++ mkdir build ++ cd build ++ sed -i 's/python/python3/g' ../scripts/update_deps.py ++ chmod +x ../scripts/update_deps.py ++ ../scripts/update_deps.py &>/dev/null || res_code=1 ++ cmake -C helper.cmake .. &>/dev/null || res_code=1 ++ cmake --build . &>/dev/null || res_code=1 ++ fi ++ return $res_code ++} ++ + function test_nvidia_case() { + casename=$1 + logfile=$2 + res_code=0 + cd /opt/${cuda_name} +- path=$(find ./ -name $casename -type d) +- cd $path + make &>/dev/null +- ./$casename &>>$logfile ++ ++ if [[ $casename == 'cuda_maketest' ]];then ++ make test &>>$logfile ++ else ++ path=$(find ./ -name $casename -type d) ++ cd $path ++ ./$casename &>>$logfile ++ fi ++ + if [[ $? -eq 0 ]]; then + echo "Test $casename succeed." >>$logfile + else +@@ -116,6 +160,98 @@ + return $res_code + } + ++function test_clpeak() { ++ logfile=$1 ++ res_code=0 ++ install_clpeak ++ if [[ $? -eq 1 ]]; then ++ echo "Install clpeak failed." ++ res_code=1 ++ return $res_code ++ fi ++ /opt/clpeak/build/clpeak &> $logfile ++ if [[ $? -eq 0 ]]; then ++ echo "Test clpeak succeed." ++ res_code=0 ++ else ++ echo "Test clpeak failed." ++ res_code=1 ++ fi ++ return $res_code ++} ++ ++sm_clock=`nvidia-smi -q|grep "SM "|head -n 1|cut -d ':' -f 2|awk '{print $1}'` ++memory_clock=`nvidia-smi -q -d SUPPORTED_CLOCKS|grep Memory|head -n 1|cut -d ':' -f 2|awk '{print $1}'` ++min_power_limit=`nvidia-smi -q|grep "Min Power Limit"|head -n 1|cut -d ':' -f 2|awk '{print $1}'` ++max_power_limit=`nvidia-smi -q|grep "Max Power Limit"|head -n 1|cut -d ':' -f 2|awk '{print $1}'` ++ ++allcases="nvidia-smi; \ ++ nvidia-smi -L; \ ++ nvidia-smi -q; \ ++ nvidia-smi -q -d SUPPORTED_CLOCKS; \ ++ nvidia-smi topo --matrix; \ ++ nvidia-smi -pm 0; \ ++ nvidia-smi -pm 1; \ ++ nvidia-smi -e 0; \ ++ nvidia-smi -e 1; \ ++ nvidia-smi -p 0; \ ++ nvidia-smi -p 1; \ ++ nvidia-smi -c 0; \ ++ nvidia-smi -c 2; \ ++ nvidia-smi -c 3; \ ++ nvidia-smi -pl $min_power_limit; \ ++ nvidia-smi -pl $max_power_limit; \ ++ nvidia-smi -ac $memory_clock,$sm_clock; \ ++ nvidia-smi -am 1; \ ++ nvidia-smi -am 0; \ ++ nvidia-smi -caa; \ ++ nvidia-smi -r; \ ++" ++ ++function test_nvidia_smi() { ++ logfile=$1 ++ IFS_OLD=$IFS ++ IFS=$';' ++ res_code=0 ++ for casename in ${allcases[@]}; do ++ eval $casename ++ if [[ $? -eq 1 ]]; then ++ res_code=1 ++ fi ++ done ++ IFS=${IFS_OLD} ++ return $res_code ++} ++ ++function test_VulkanSamples() { ++ logfile=$1 ++ res_code=0 ++ install_VulkanSamples ++ if [[ $? -eq 1 ]]; then ++ echo "Install VulkanSamples failed." ++ res_code=1 ++ return $res_code ++ fi ++ source ~/.bash_profile ++ if [ -n "$DISPLAY" ]; then ++ timeout 5s /opt/VulkanSamples/build/Sample-Programs/Hologram/Hologram &> $logfile ++ cd /opt/VulkanSamples/build/API-Samples/ ++ ./run_all_samples.sh &>> $logfile ++ if [[ $? -eq 0 ]]; then ++ echo "Test VulkanSamples succeed." ++ res_code=0 ++ else ++ echo "Test VulkanSamples failed." ++ res_code=1 ++ fi ++ else ++ echo "Please set the DISPLAY environment variables!" ++ res_code=1 ++ fi ++ return $res_code ++ ++} ++ + function main() { + func_name=$1 + param_list=$2 +@@ -126,6 +262,12 @@ + install_cuda_samples + elif [[ $func_name == "test_cuda_samples" ]]; then + test_cuda_samples $param_list ++ elif [[ $func_name == "test_clpeak" ]]; then ++ test_clpeak $param_list ++ elif [[ $func_name == "test_nvidia_smi" ]]; then ++ test_nvidia_smi $param_list ++ elif [[ $func_name == "test_VulkanSamples" ]]; then ++ test_VulkanSamples $param_list + else + echo "The function doesn't exist, please check!" + return 1 +diff -Naur rpm/tests/compatible/kabiwhitelist/kabi_check.sh oech/tests/compatible/kabiwhitelist/kabi_check.sh +--- rpm/tests/compatible/kabiwhitelist/kabi_check.sh 2024-04-16 18:17:05.018569275 +0800 ++++ oech/tests/compatible/kabiwhitelist/kabi_check.sh 2024-04-16 18:08:37.760536817 +0800 +@@ -11,8 +11,8 @@ + # Author: @liqiang1118 + # Create: 2023-05-15 + +-mkdir /usr/share/oech/lib/tests/kabiwhitelist/test_log +-testdir="/usr/share/oech/lib/tests/kabiwhitelist/test_log" ++mkdir /usr/share/oech/lib/tests/compatible/kabiwhitelist/test_log ++testdir="/usr/share/oech/lib/tests/compatible/kabiwhitelist/test_log" + cd $testdir + + os_version=`cat /etc/openEuler-latest|grep openeulerversion |awk -F = '{print $2}'` +@@ -21,8 +21,8 @@ + wget $url + kernel_version=`uname -r` + symvers_gz="symvers-"$kernel_version".gz" +-cp /boot/$symvers_gz /usr/share/oech/lib/tests/kabiwhitelist/test_log +-gunzip /usr/share/oech/lib/tests/kabiwhitelist/test_log/$symvers_gz ++cp /boot/$symvers_gz /usr/share/oech/lib/tests/compatible/kabiwhitelist/test_log ++gunzip /usr/share/oech/lib/tests/compatible/kabiwhitelist/test_log/$symvers_gz + + # Desc: Test kabi + # Input: xxx.ko or xxx.rpm +diff -Naur rpm/tests/compatible/kabiwhitelist/kabiwhitelist.py oech/tests/compatible/kabiwhitelist/kabiwhitelist.py +--- rpm/tests/compatible/kabiwhitelist/kabiwhitelist.py 2024-04-16 18:17:05.018569275 +0800 ++++ oech/tests/compatible/kabiwhitelist/kabiwhitelist.py 2024-04-16 18:08:37.760536817 +0800 +@@ -58,7 +58,7 @@ + """ + Clear temporary files + """ +- file_name = "/usr/share/oech/lib/tests/kabiwhitelist/test_log" ++ file_name = "/usr/share/oech/lib/tests/compatible/kabiwhitelist/test_log" + if os.path.exists(file_name): + shutil.rmtree(file_name) + self.logger.info("Clearing temporary files is complete") +diff -Naur rpm/tests/compatible/kabiwhitelist/Makefile oech/tests/compatible/kabiwhitelist/Makefile +--- rpm/tests/compatible/kabiwhitelist/Makefile 2024-04-16 18:17:05.018569275 +0800 ++++ oech/tests/compatible/kabiwhitelist/Makefile 2024-04-16 18:08:37.760536817 +0800 +@@ -17,8 +17,8 @@ + + install: + mkdir -p $(DEST) +- cp -a $(SUBDIR)/build *.py $(DEST) +- cp -a $(SUBDIR)/build *.sh $(DEST) ++ cp -a *.py $(DEST) ++ cp -a *.sh $(DEST) + chmod a+x $(DEST)/*.py + chmod a+x $(DEST)/*.sh + +diff -Naur rpm/tests/compatible/keycard/keycard.py oech/tests/compatible/keycard/keycard.py +--- rpm/tests/compatible/keycard/keycard.py 2024-04-16 18:17:05.018569275 +0800 ++++ oech/tests/compatible/keycard/keycard.py 2024-04-16 18:08:37.760536817 +0800 +@@ -13,58 +13,40 @@ + # Create: 2022-03-28 + # Desc: Public key card test + +-import os +-import shutil ++import argparse ++from sds_keycard import SDSKeyCardTest ++from tsse_keycard import TSSEKeyCardTest + from hwcompatible.test import Test +-from hwcompatible.command_ui import CommandUI +- +-keycard_dir = os.path.dirname(os.path.realpath(__file__)) + + + class KeyCardTest(Test): + def __init__(self): + Test.__init__(self) +- self.com_ui = CommandUI() +- self.target_file = "/usr/lib64/libswsds.so" ++ self.device = None ++ self.keycard_test = None ++ ++ def setup(self, args=None): ++ """ ++ Initialization before test ++ """ ++ self.args = args or argparse.Namespace() ++ self.device = getattr(args, 'device', None) ++ if self.device.driver == "tsse": ++ self.keycard_test = TSSEKeyCardTest() ++ else: ++ self.keycard_test = SDSKeyCardTest() ++ self.keycard_test.setup(args) + + def test(self): + """ + Run key card test case + return: result + """ +- result = True +- original_file = os.path.join(keycard_dir, "libswsds.so") +- shutil.copy(original_file, self.target_file) +- ui_message_list = [ +- "Which test suite would you like to test: ", +- "1|基本函数测试", +- "2|RSA非对称密码运算函数测试", +- "3|ECC非对称密码运算函数测试", +- "4|对称密码运算函数测试", +- "5|杂凑运算函数测试", +- "6|用户文件操作函数测试", +- "Enter space to split(ex: 1 2 3)\n" +- ] +- ui_message = "\n".join(ui_message_list) +- execnum = self.com_ui.prompt(ui_message) +- self.logger.info("Start to test, please wait.") +- execnum = execnum.split(" ") +- for num in execnum: +- result = self.command.run_cmd( +- "echo %s | %s/TestSDS" % (num, keycard_dir)) +- if result[2] != 0: +- result = False ++ return self.keycard_test.test() + +- if result: +- self.logger.info("Test key card succeed.") +- else: +- self.logger.error("Test key card failed.") +- return result +- + def teardown(self): + """ + Environment recovery after test + :return: + """ +- if os.path.exists(self.target_file): +- os.remove(self.target_file) +\ No newline at end of file ++ self.keycard_test.teardown() +\ No newline at end of file +diff -Naur rpm/tests/compatible/keycard/Makefile oech/tests/compatible/keycard/Makefile +--- rpm/tests/compatible/keycard/Makefile 2024-04-16 18:17:05.030569417 +0800 ++++ oech/tests/compatible/keycard/Makefile 2024-04-16 18:08:37.760536817 +0800 +@@ -27,6 +27,8 @@ + cp -a *.py $(DEST) + cp $(APPS) $(DEST) + chmod a+x $(DEST)/*.py ++ cp -a *.sh $(DEST) ++ chmod a+x $(DEST)/*.sh + + %.o:%.c + $(CC) -O2 -c $(CFLAGS) $< -o $@ +diff -Naur rpm/tests/compatible/keycard/sds_keycard.py oech/tests/compatible/keycard/sds_keycard.py +--- rpm/tests/compatible/keycard/sds_keycard.py 1970-01-01 08:00:00.000000000 +0800 ++++ oech/tests/compatible/keycard/sds_keycard.py 2024-04-16 18:08:37.772536959 +0800 +@@ -0,0 +1,79 @@ ++#!/usr/bin/env python3 ++# coding: utf-8 ++# Copyright (c) 2022 Huawei Technologies Co., Ltd. ++# oec-hardware is licensed under the Mulan PSL v2.gica's ++# You can use this software according to the terms and conditions of the Mulan PSL v2. ++# You may obtain a copy of Mulan PSL v2 at: ++# http://license.coscl.org.cn/MulanPSL2 ++# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR ++# PURPOSE. ++# See the Mulan PSL v2 for more details. ++# Author: @meitingli ++# Create: 2022-03-28 ++# Desc: Public key card test ++ ++import argparse ++import os ++import shutil ++from hwcompatible.command import Command ++from hwcompatible.test import Test ++from hwcompatible.command_ui import CommandUI ++ ++keycard_dir = os.path.dirname(os.path.realpath(__file__)) ++ ++ ++class SDSKeyCardTest(Test): ++ def __init__(self): ++ Test.__init__(self) ++ self.com_ui = None ++ self.target_file = "" ++ ++ def setup(self, args=None): ++ self.args = args or argparse.Namespace() ++ self.logger = getattr(args, "test_logger", None) ++ self.command = Command(self.logger) ++ self.com_ui = CommandUI() ++ self.target_file = "/usr/lib64/libswsds.so" ++ ++ def test(self): ++ """ ++ Run key card test case ++ return: result ++ """ ++ ret_val = True ++ original_file = os.path.join(keycard_dir, "libswsds.so") ++ shutil.copy(original_file, self.target_file) ++ ui_message_list = [ ++ "Which test suite would you like to test: ", ++ "1|基本函数测试", ++ "2|RSA非对称密码运算函数测试", ++ "3|ECC非对称密码运算函数测试", ++ "4|对称密码运算函数测试", ++ "5|杂凑运算函数测试", ++ "6|用户文件操作函数测试", ++ "Enter space to split(ex: 1 2 3)\n" ++ ] ++ ui_message = "\n".join(ui_message_list) ++ execnum = self.com_ui.prompt(ui_message) ++ self.logger.info("Start to test, please wait.") ++ execnum = execnum.split(" ") ++ for num in execnum: ++ result = self.command.run_cmd( ++ "echo %s | %s/TestSDS" % (num, keycard_dir)) ++ if result[2] != 0: ++ ret_val = False ++ ++ if ret_val: ++ self.logger.info("Test key card succeed.") ++ else: ++ self.logger.error("Test key card failed.") ++ return ret_val ++ ++ def teardown(self): ++ """ ++ Environment recovery after test ++ :return: ++ """ ++ if os.path.exists(self.target_file): ++ os.remove(self.target_file) +\ No newline at end of file +diff -Naur rpm/tests/compatible/keycard/test_tsse_keycard.sh oech/tests/compatible/keycard/test_tsse_keycard.sh +--- rpm/tests/compatible/keycard/test_tsse_keycard.sh 1970-01-01 08:00:00.000000000 +0800 ++++ oech/tests/compatible/keycard/test_tsse_keycard.sh 2024-04-16 18:08:37.772536959 +0800 +@@ -0,0 +1,40 @@ ++#!/usr/bin/bash ++# Copyright (c) 2024 Montage Technology. ++# oec-hardware is licensed under the Mulan PSL v2. ++# You can use this software according to the terms and conditions of the Mulan PSL v2. ++# You may obtain a copy of Mulan PSL v2 at: ++# http://license.coscl.org.cn/MulanPSL2 ++# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR ++# PURPOSE. ++# See the Mulan PSL v2 for more details. ++# Create: 2024-03-20 ++# Desc: Shell script used for testing tsse keycard ++ ++function main() { ++ res_code=0 ++ cd /opt ++ if [ ! -f openssl-3.1.5.tar.gz ]; then ++ wget https://www.openssl.org/source/openssl-3.1.5.tar.gz ++ fi ++ if [ ! -d openssl-3.1.5 ]; then ++ tar -xvzf openssl-3.1.5.tar.gz -C . &>/dev/null ++ fi ++ if [ ! -d /opt/local/ssl ]; then ++ cd openssl-3.1.5 ++ ./Configure --prefix=/opt/local/ssl --openssldir=/opt/local/ssl ++ echo "doing make and make install ..." ++ make &>/dev/null || res_code=1 ++ make install &>/dev/null || res_code=1 ++ echo "make and make install completed" ++ fi ++ if [ ! -f /usr/lib64/libssl.so.3 ]; then ++ ln -s /opt/local/ssl/lib64/libssl.so.3 /usr/lib64/libssl.so.3 ++ fi ++ if [ ! -f /usr/lib64/libcrypto.so.3 ]; then ++ ln -s /opt/local/ssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3 ++ fi ++ return $res_code ++} ++ ++main "$@" +\ No newline at end of file +diff -Naur rpm/tests/compatible/keycard/tsse_keycard.py oech/tests/compatible/keycard/tsse_keycard.py +--- rpm/tests/compatible/keycard/tsse_keycard.py 1970-01-01 08:00:00.000000000 +0800 ++++ oech/tests/compatible/keycard/tsse_keycard.py 2024-04-16 18:08:37.772536959 +0800 +@@ -0,0 +1,89 @@ ++#!/usr/bin/env python3 ++# coding: utf-8 ++ ++# Copyright (c) 2024 Montage Technology. ++# oec-hardware is licensed under the Mulan PSL v2. ++# You can use this software according to the terms and conditions of the Mulan PSL v2. ++# You may obtain a copy of Mulan PSL v2 at: ++# http://license.coscl.org.cn/MulanPSL2 ++# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR ++# PURPOSE. ++# See the Mulan PSL v2 for more details. ++# Create: 2024-03-20 ++ ++import argparse ++import ssl ++import os ++from hwcompatible.command import Command ++from hwcompatible.test import Test ++ ++local_openssl_dir = os.path.dirname(os.path.realpath(__file__)) ++ ++ ++class TSSEKeyCardTest(Test): ++ def __init__(self): ++ Test.__init__(self) ++ self.device = None ++ ++ def setup(self, args=None): ++ """ ++ Initialization before test ++ :return: ++ """ ++ self.args = args or argparse.Namespace() ++ self.logger = getattr(self.args, "test_logger", None) ++ self.command = Command(self.logger) ++ self.device = getattr(self.args, 'device', None) ++ self.show_driver_info() ++ ++ def test(self): ++ """ ++ Run openssl ++ return: result ++ """ ++ ret = True ++ version = ssl.OPENSSL_VERSION_INFO ++ system_openssl = True ++ ++ if version < (3, 0): ++ self.logger.info("System openssl version is less than 3.0, will install a new one.") ++ system_openssl = False ++ result = self.command.run_cmd( ++ "bash {}/test_tsse_keycard.sh".format(local_openssl_dir)) ++ if result[2] != 0: ++ self.logger.error("failed to install new openssl.") ++ return False ++ else: ++ out = self.command.run_cmd("/opt/local/ssl/bin/openssl version -m") ++ self.logger.info(out[0]) ++ else: ++ out = self.command.run_cmd("openssl version -m") ++ self.logger.info(out[0]) ++ self.logger.info("Please make sure the provider shared object file of Mont-TSSE exists in MODULESDIR") ++ ++ algorithms = ["aes-128-gcm", "aes-256-gcm", "sha256", "sha384", "sha512", ++ "sm3", "sm4-cbc", "sm4-gcm", "sm2"] ++ if system_openssl: ++ cmd_format = "openssl speed -provider {} -elapsed {}{}" ++ else: ++ cmd_format = "/opt/local/ssl/bin/openssl speed -provider {} -elapsed {}{}" ++ ++ for alg in algorithms: ++ if (alg == "sm2"): ++ cmd = cmd_format.format("mcpprovider", "", alg) ++ else: ++ cmd = cmd_format.format("mcpprovider", "-evp ", alg) ++ result = self.command.run_cmd(cmd) ++ if result[2] != 0: ++ self.logger.error("openssl {} failed.".format(alg)) ++ self.logger.error(result[1]) ++ ret = False ++ else: ++ self.logger.info("openssl {} succeed.".format(alg)) ++ ++ if ret: ++ self.logger.info("Test OpenSSL succeed.") ++ else: ++ self.logger.error("Test OpenSSL failed.") ++ return ret +\ No newline at end of file +diff -Naur rpm/tests/compatible/memory/memory.py oech/tests/compatible/memory/memory.py +--- rpm/tests/compatible/memory/memory.py 2024-04-16 18:17:05.030569417 +0800 ++++ oech/tests/compatible/memory/memory.py 2024-04-16 18:08:37.772536959 +0800 +@@ -131,7 +131,7 @@ + self.command.run_cmd("sysctl -w vm.panic_on_oom=1") + self.logger.info("set the system not to restart.") + if self.swap_memory < 4096: +- self.logger.error("Swap memory of %s MB is too small. Suggest configuring to 4G." ++ self.logger.error("Swap memory of %s MB is too small. Suggest configuring to 10G." + % self.swap_memory) + return False + extra_mem = self.free_memory/100 +diff -Naur rpm/tests/compatible/network/network.py oech/tests/compatible/network/network.py +--- rpm/tests/compatible/network/network.py 2024-04-16 18:17:05.030569417 +0800 ++++ oech/tests/compatible/network/network.py 2024-04-16 18:08:37.772536959 +0800 +@@ -196,7 +196,7 @@ + :return: + """ + count = 500 +- cmd = "ping -q -c %d -i 0 %s | grep 'packet loss' | awk '{print $6}'" % ( ++ cmd = "ping -q -c %d -i 0.001 %s | grep 'packet loss' | awk '{print $6}'" % ( + count, self.server_ip) + for _ in range(self.retries): + result = self.command.run_cmd(cmd) +diff -Naur rpm/tests/compatible/nvme/nvme.py oech/tests/compatible/nvme/nvme.py +--- rpm/tests/compatible/nvme/nvme.py 2024-04-16 18:17:05.030569417 +0800 ++++ oech/tests/compatible/nvme/nvme.py 2024-04-16 18:08:37.772536959 +0800 +@@ -19,6 +19,7 @@ + from subprocess import getoutput + from hwcompatible.test import Test + from hwcompatible.command import Command ++from tests.compatible.disk.common import raw_test + + + class NvmeTest(Test): +@@ -95,6 +96,11 @@ + return_code = False + + self.command.run_cmd("nvme list", ignore_errors=True) ++ ++ # run fio ++ if not raw_test(self.logger, self.command, disk): ++ return_code = False ++ + if return_code: + self.logger.info("Test nvme succeed.") + else: +diff -Naur rpm/tests/compatible/system/system.py oech/tests/compatible/system/system.py +--- rpm/tests/compatible/system/system.py 2024-04-16 18:17:05.034569465 +0800 ++++ oech/tests/compatible/system/system.py 2024-04-16 18:08:37.772536959 +0800 +@@ -90,6 +90,10 @@ + os_version = self.sysinfo.product + " " + self.sysinfo.get_version() + elif product == "KylinSec": + os_version = getoutput("cat /etc/dnf/vars/osversion | sed 's/[^0-9]//g'") ++ elif product == "Kylin": ++ os_version = getoutput("cat /etc/os-release | grep -i version_id | awk -F = '{print $2}' | sed 's/[\"]//g'") ++ elif product == "UOS": ++ os_version = getoutput("cat /etc/os-release | grep -i version_id | awk -F = '{print $2}' | sed 's/[\"]//g'") + else: + self.logger.error("Failed to get os version info.") + self.logger.info("OS Version: %s" % os_version, terminal_print=False) +@@ -107,6 +111,10 @@ + kernel_release = kernel_dict.document[product][os_version] + elif product == "KylinSec": + kernel_release = kernel_dict.document[product][os_version].split('/')[1].split('-')[0] ++ elif product == "Kylin": ++ kernel_release = kernel_dict.document[product][os_version].split('/')[1].split('-')[0] ++ elif product == "UOS": ++ kernel_release = kernel_dict.document[product][os_version].split('/')[1].split('-')[0] + try: + if kernel_release != self.sysinfo.kernel_version: + self.logger.error("Failed to check kernel %s GA status." % +diff -Naur rpm/tests/virtualization/Makefile oech/tests/virtualization/Makefile +--- rpm/tests/virtualization/Makefile 2024-04-16 18:17:05.054569703 +0800 ++++ oech/tests/virtualization/Makefile 2024-04-16 18:08:37.772536959 +0800 +@@ -13,7 +13,7 @@ + .PHONY: all clean install + + HWCERT_TEST_LIB := $(DESTDIR)/usr/share/oech/lib/tests/virtualization +-SUBDIRS := $(shell ls | grep -v Makefile) ++SUBDIRS := $(shell ls | grep -v "Makefile\|stratovirt.xml\|__init__.py\|console_cmd.sh\|qemu.xml") + + all: + for i in $(SUBDIRS); do $(MAKE) -C $$i; done diff --git a/oec-hardware.spec b/oec-hardware.spec index 067c7e98e1d47fd7816c095820679a9f89af5af9..769b72303d43ac7ed0f46b4ede8665c83f3c84c7 100644 --- a/oec-hardware.spec +++ b/oec-hardware.spec @@ -4,7 +4,7 @@ Name: oec-hardware Summary: openEuler Hardware Compatibility Test Suite Version: 1.1.5 -Release: 1 +Release: 2 Group: Development/Tools License: Mulan PSL v2 URL: https://gitee.com/openeuler/oec-hardware @@ -12,6 +12,7 @@ Source0: https://gitee.com/openeuler/oec-hardware/repository/archive/v%{v # patch fix issue Patch0001: oec-hardware-1.1.5-1-add-virtual-branch-fix-bug.patch +Patch0002: oec-hardware-1.1.5-2-fix-bug.patch Buildroot: %{_tmppath}/%{name}-%{version}-root BuildRequires: gcc @@ -36,6 +37,7 @@ openEuler Hardware Compatibility Test Server %prep %setup -q -c %patch1 -p1 +%patch2 -p1 %build %ifarch x86_64 aarch64 @@ -80,6 +82,14 @@ DESTDIR=$RPM_BUILD_ROOT make install rm -rf /var/lock/oech.lock %changelog +* Wed Nov 29 2023 cuixucui - 1.1.5-1 +- Resolve kdump\watchdog\cpufreq\kabiwhitelist\network test failure issue +- Add fio test cases:read,write,randread,randwrite +- Solve the nvme line break issue in the command line interface +- Fix compilation errors in the make command +- Add Vulkan testcase for nvida GPU +- Resolve the issue of oech server startup failure on version 24.03 + * Wed Nov 29 2023 cuixucui - 1.1.5-1 - Add virtual cases - Resolve IB startup IB_Read_BW service failure issue