diff --git a/oec-hardware-1.1.2-add-compatibility.patch b/oec-hardware-1.1.2-add-compatibility.patch new file mode 100644 index 0000000000000000000000000000000000000000..32c6a68fb574fd41329ac105cda73d6fa4ef9235 --- /dev/null +++ b/oec-hardware-1.1.2-add-compatibility.patch @@ -0,0 +1,267 @@ +From 1d0d56a7a62da272a42cd1bbd4222c6cb1431ba9 Mon Sep 17 00:00:00 2001 +From: meitingli +Date: Sat, 3 Sep 2022 11:21:11 +0800 +Subject: [PATCH] Add generate compatibility information and bugfix + +--- + hwcompatible/cert_info.py | 101 ++++++++++++++++++++++++++++++++++++++ + hwcompatible/constants.py | 2 +- + hwcompatible/device.py | 2 + + hwcompatible/job.py | 11 ++++- + tests/cpufreq/cpufreq.py | 8 +-- + tests/gpu/gpu.py | 6 +-- + 6 files changed, 120 insertions(+), 10 deletions(-) + create mode 100644 hwcompatible/cert_info.py + +diff --git a/hwcompatible/cert_info.py b/hwcompatible/cert_info.py +new file mode 100644 +index 0000000..741e49a +--- /dev/null ++++ b/hwcompatible/cert_info.py +@@ -0,0 +1,101 @@ ++#!/usr/bin/env python3 ++# coding: utf-8 ++# 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-08-24 ++# Desc: Generate compatibility json file ++ ++import os ++import json ++from datetime import date ++from .env import CertEnv ++from .constants import FILE_FLAGS, FILE_MODES ++ ++ ++class CertInfo: ++ def __init__(self, logger, command): ++ self.cert_devices = [] ++ self.cert_quads = [] ++ self.infos = ["vendorID", "deviceID", "svID", "ssID", "architecture", "os", "driverName", "version", ++ "type", "date", "sha256", "driverSize", "chipVendor", "boardModel", "chipModel", "downloadLink"] ++ self.logger = logger ++ self.command = command ++ ++ def create_json(self, device): ++ """ ++ Create hardware information json ++ Args: ++ device: hardware device ++ Returns: True/False ++ """ ++ if not device or not device.quad: ++ self.logger.warning( ++ "The %s doesn't have quadruple information, couldn't get hardware." % device.name) ++ return False ++ ++ if device.quad in self.cert_quads: ++ return True ++ ++ oec_json = {} ++ for info in self.infos: ++ oec_json[info] = "" ++ ++ self.logger.info( ++ "Please input sha256, driverSize, downloadLink for %s manually " ++ "if you use outbox driver." % device.name) ++ ++ oec_json["vendorID"] = device.quad[0] ++ oec_json["deviceID"] = device.quad[1] ++ oec_json["svID"] = device.quad[2] ++ oec_json["ssID"] = device.quad[3] ++ oec_json["driverName"] = device.driver ++ oec_json["version"] = device.driver_version ++ chip_vendor = self.command.run_cmd( ++ "grep '^%s' %s | cut -d ' ' -f 3" % (device.quad[0], CertEnv.pcifile), log_print=False) ++ oec_json["chipVendor"] = chip_vendor[0].strip("\n") ++ oec_json["boardModel"] = device.board ++ oec_json["chipModel"] = device.chip ++ oec_json["type"] = device.name ++ arch = self.command.run_cmd("uname -m", log_print=False) ++ oec_json["architecture"] = arch[0].strip("\n") ++ os_cmd = self.command.run_cmd( ++ "grep openeulerversion /etc/openEuler-latest | cut -d '=' -f 2", log_print=False) ++ os_version = os_cmd[0].strip("\n").replace('-', ' ') ++ oec_json["os"] = os_version ++ curday = date.today().strftime("%Y.%m.%d") ++ oec_json["date"] = curday ++ shanum = self.command.run_cmd( ++ "modinfo %s | grep signature | awk '{print $2}'" % device.driver, log_print=False) ++ oec_json["sha256"] = shanum[0].replace(":", "").strip("\n") ++ filename = self.command.run_cmd( ++ "modinfo %s | grep filename | awk '{print $2}'" % device.driver, log_print=False) ++ driver_size = self.command.run_cmd( ++ "ls -lh %s | awk '{print $5}'" % filename[0], log_print=False) ++ oec_json["driverSize"] = driver_size[0].strip("\n") ++ oec_json["downloadLink"] = "inbox" ++ ++ self.cert_quads.append(device.quad) ++ self.cert_devices.append(oec_json) ++ return True ++ ++ def export_cert_info(self): ++ """ ++ Export device cert informations to json file ++ """ ++ if not self.cert_devices: ++ self.logger.info("There is no cert device need to export.") ++ return ++ ++ name = "hw_compatibility.json" ++ file = os.path.join(self.logger.logdir, name) ++ with os.fdopen(os.open(file, FILE_FLAGS, FILE_MODES), "w", encoding='utf-8') as fd_cert: ++ fd_cert.write(json.dumps(self.cert_devices, indent=4)) ++ ++ self.logger.info("The cert device json file is created succeed.") +diff --git a/hwcompatible/constants.py b/hwcompatible/constants.py +index bd7e038..86713d8 100644 +--- a/hwcompatible/constants.py ++++ b/hwcompatible/constants.py +@@ -33,7 +33,7 @@ KEYCARD_VENDORS = ('Xilinx', 'Renesas', 'Texas', 'PLX') + IB = "infiniband" + DEVICE_INFO = ('color', 'status', 'num', 'run', 'name', + 'device', 'driver', 'version', 'chip', 'board') +-NO_CONFIG_DEVICES = ("gpu", "vgpu", "nvme", "dpdk", "cdrom") ++NO_CONFIG_DEVICES = ("gpu", "vgpu", "nvme", "dpdk", "cdrom", "keycard") + + # File access control + FILE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC +diff --git a/hwcompatible/device.py b/hwcompatible/device.py +index 72e57fa..1bd6218 100755 +--- a/hwcompatible/device.py ++++ b/hwcompatible/device.py +@@ -69,6 +69,7 @@ class Device: + def __init__(self, properties=None, logger=None): + self.logger = logger + self.command = Command(self.logger) ++ self.name = "" + self.path = "" + self.pci = "" + self.quad = list() +@@ -109,6 +110,7 @@ class Device: + get board model name + :return: + """ ++ self.name = name + self.file = file + self.file.seek(0) + # get PCI number +diff --git a/hwcompatible/job.py b/hwcompatible/job.py +index fe04a14..0005eb6 100755 +--- a/hwcompatible/job.py ++++ b/hwcompatible/job.py +@@ -22,7 +22,8 @@ from .env import CertEnv + from .command import Command + from .log import Logger + from .reboot import Reboot +-from .constants import NO_CONFIG_DEVICES ++from .cert_info import CertInfo ++from .constants import NO_CONFIG_DEVICES, NODEVICE + + + class Job(): +@@ -59,7 +60,7 @@ class Job(): + for tests in self.test_suite: + for pkg in tests["test"].requirements: + cmd_result = self.command.run_cmd( +- "rpm -q %s" % pkg, ignore_errors=True) ++ "rpm -q %s" % pkg, ignore_errors=True, log_print=False) + return_code = cmd_result[2] + if return_code != 0 and pkg not in required_rpms: + required_rpms.append(pkg) +@@ -88,17 +89,23 @@ class Job(): + + self.get_config() + self.test_suite.sort(key=lambda k: k["test"].pri) ++ cert_infos = CertInfo(self.logger, self.command) + for testcase in self.test_suite: + config_data = self.get_device(testcase) + if self._run_test(testcase, config_data, subtests_filter): + testcase["status"] = "PASS" + self.logger.info("Test %s succeed." % + testcase["name"], terminal_print=False) ++ ++ if testcase["name"] not in NODEVICE: ++ cert_infos.create_json(testcase["device"]) + else: + testcase["status"] = "FAIL" + self.logger.error("Test %s failed." % + testcase["name"], terminal_print=False) + ++ cert_infos.export_cert_info() ++ + def run(self): + """ + Test entrance +diff --git a/tests/cpufreq/cpufreq.py b/tests/cpufreq/cpufreq.py +index d01d9d9..98e7305 100644 +--- a/tests/cpufreq/cpufreq.py ++++ b/tests/cpufreq/cpufreq.py +@@ -262,7 +262,7 @@ class CPUFreqTest(Test): + return False + self.logger.info("Set governor of all CPUs to ondemand succeed.") + +- target_cpu = randint(0, self.cpu.nums) ++ target_cpu = randint(0, self.cpu.nums-1) + target_cpu_governor = self.cpu.get_governor(target_cpu) + if target_cpu_governor != 'ondemand': + self.logger.error("The governor of CPU%s(%s) is not ondemand." % ( +@@ -311,7 +311,7 @@ class CPUFreqTest(Test): + return False + self.logger.info("Set governor of all CPUs to conservative.") + +- target_cpu = randint(0, self.cpu.nums) ++ target_cpu = randint(0, self.cpu.nums-1) + target_cpu_governor = self.cpu.get_governor(target_cpu) + if target_cpu_governor != 'conservative': + self.logger.error("The governor of CPU%s(%s) is not conservative." % +@@ -350,7 +350,7 @@ class CPUFreqTest(Test): + return False + self.logger.info("Set governor of all CPUs to powersave.") + +- target_cpu = randint(0, self.cpu.nums) ++ target_cpu = randint(0, self.cpu.nums-1) + target_cpu_governor = self.cpu.get_governor(target_cpu) + if target_cpu_governor != 'powersave': + self.logger.error("The governor of CPU%s(%s) is not powersave." % +@@ -389,7 +389,7 @@ class CPUFreqTest(Test): + return False + self.logger.info("Set governor of all CPUs to performance.") + +- target_cpu = randint(0, self.cpu.nums) ++ target_cpu = randint(0, self.cpu.nums-1) + target_cpu_governor = self.cpu.get_governor(target_cpu) + if target_cpu_governor != 'performance': + self.logger.error("The governor of CPU%s(%s) is not performance." % +diff --git a/tests/gpu/gpu.py b/tests/gpu/gpu.py +index 665bbdf..7260b99 100644 +--- a/tests/gpu/gpu.py ++++ b/tests/gpu/gpu.py +@@ -78,8 +78,8 @@ class GpuTest(Test): + os.environ['CUDA_VISIBLE_DEVICES'] = id_num + + self.command.run_cmd("bash %s/test_gpu.sh install_gpu_burn" % gpu_dir) +- self.command.run_cmd( +- '/opt/gpu-burn/gpu_burn 10 | tee %s' % self.gpu_burn) ++ os.chdir("/opt/gpu-burn") ++ self.command.run_cmd('./gpu_burn 10 | tee %s' % self.gpu_burn) + time.sleep(1) + for _ in range(10): + cmd = self.command.run_cmd( +@@ -116,4 +116,4 @@ class GpuTest(Test): + except Exception as e: + self.logger.error( + "Failed to run the script because compiling or setting variables: %s" % e) +- return False ++ return False +\ No newline at end of file +-- +2.33.0 + diff --git a/oec-hardware.spec b/oec-hardware.spec index 439f96ab1a354ddc3f81ca9b9da62a4c9e333b4e..5950ef3681cbe15d0e58dcdc4babfe83dff79b5c 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.2 -Release: 2 +Release: 3 Group: Development/Tools License: Mulan PSL v2 URL: https://gitee.com/openeuler/oec-hardware @@ -13,6 +13,7 @@ Source0: https://gitee.com/openeuler/oec-hardware/repository/archive/v%{v # patch fix issue Patch0001: oec-hardware-1.1.2-fix-oech.service_status_failed.patch Patch0002: oec-hardware-1.1.2-fix-system.patch +Patch0003: oec-hardware-1.1.2-add-compatibility.patch Buildroot: %{_tmppath}/%{name}-%{version}-root BuildRequires: gcc @@ -37,6 +38,7 @@ openEuler Hardware Compatibility Test Server %setup -q -c %patch1 -p1 %patch2 -p1 +%patch3 -p1 %build @@ -79,6 +81,10 @@ DESTDIR=$RPM_BUILD_ROOT make install rm -rf /var/lock/oech.lock %changelog +* Tue Sep 06 2022 meitingli - 1.1.2-3 +- Add generate compatibility information +- Fix gpu and keycard issues + * Mon Sep 05 2022 cuixucui - 1.1.2-2 - Fix Check whether the tool is modified failed