diff --git a/README.md b/README.md index 2b1e2ff067d96aac8ef3249742a34e93f3c44965..76fe1329366c54a6c3d91ce652133121727a39ea 100644 --- a/README.md +++ b/README.md @@ -96,11 +96,11 @@ OS 厂商为了扩大自己产品的兼容性范围,常常寻求与硬件厂 ## 前提条件 -安装了 EulerOS 2.0 (SP8) 及更高版本,或 openEuler 20.03 (LTS) 及更高版本。 +安装了 openEuler 20.03 (LTS) 或更高版本。 ## 获取安装包 -* 安装包从 openEuler 官方网站下载。 +* 安装包从 openEuler 官方网站下载(暂未开放)。 * 校验安装包的完整性。 @@ -110,7 +110,7 @@ OS 厂商为了扩大自己产品的兼容性范围,常常寻求与硬件厂 cat oec-hardware-*.rpm.sha256sum ``` - 2. 计算文件的sha256校验值: + 2. 计算文件的 sha256 校验值: ``` sha256sum oec-hardware-*.rpm @@ -126,28 +126,22 @@ OS 厂商为了扩大自己产品的兼容性范围,常常寻求与硬件厂 ### 客户端 -1. 部分基础用例依赖 fio 和 memtester 工具,需要提前安装依赖(可以用 tools/ 里的源码包编译)。 +1. 配置 [openEuler 官方 repo](https://repo.openeuler.org/) 中对应版本的 everything 源,使用 `dnf` 安装客户端 oec-hardware。 ``` - rpm -ivh fio-3.7-2.aarch64.rpm memtester-4.3.0-13.aarch64.rpm - ``` - -2. 安装 oec-hardware-1.0.0-h1.aarch64.rpm。 - - ``` - dnf install oec-hardware-1.0.0-h1.aarch64.rpm + dnf install oec-hardware-XXX.rpm ``` ### 服务端 -1. 安装服务端子包。 +1. 配置 [openEuler 官方 repo](https://repo.openeuler.org/) 中对应版本的 everything 源,使用 `dnf` 安装服务端 oec-hardware-server。 ``` - dnf install oec-hardware-server-1.0.0-h1.aarch64.rpm + dnf install oec-hardware-server-XXX.rpm ``` -2. 服务端 web 展示页面部分组件系统本身不提供,需要使用 pip 安装(请自行配置可用 pip 源)。 +2. 服务端 web 展示页面部分组件系统本身不提供,需要使用 `pip3` 安装(请自行配置可用 pip 源)。 ``` pip3 install Flask Flask-bootstrap uwsgi @@ -176,13 +170,13 @@ OS 厂商为了扩大自己产品的兼容性范围,常常寻求与硬件厂 ## 前提条件 -* `/usr/share/oech/kernelrelease.json`文件中列出了当前支持的所有系统版本,使用`uname -a` 命令确认当前系统内核版本是否属于框架支持的版本。 +* `/usr/share/oech/kernelrelease.json` 文件中列出了当前支持的所有系统版本,使用`uname -a` 命令确认当前系统内核版本是否属于框架支持的版本。 -* 框架默认会扫描所有网卡,对网卡进行测试前,请自行筛选被测网卡,并给它配上能`ping`通服务端的 ip ;如果是测试客户端 `InfiniBand`网卡,服务端也必须有一个 `InfiniBand`网卡并提前配好 ip 。 +* 框架默认会扫描所有网卡,对网卡进行测试前,请自行筛选被测网卡,并给它配上能 `ping` 通服务端的 ip;如果客户端是对 InfiniBand 网卡进行测试,服务端也必须有一个 InfiniBand 网卡并提前配好 ip 。 ## 使用步骤 -1. 在客户端启动测试框架。在客户端启动 `oech`,其中 `ID` 和 `URL` 可以按需填写,`ID` 建议填写gitee上的issue ID,`Server` 必须填写为客户端可以直接访问的服务器域名或 ip,用于展示测试报告和作网络测试的服务端。 +1. 在客户端启动测试框架。在客户端启动 `oech`,其中 `ID` 和 `URL` 可以按需填写,`ID` 建议填写 gitee 上的 issue ID,`Server` 必须填写为客户端可以直接访问的服务器域名或 ip,用于展示测试报告和作网络测试的服务端。 ``` # oech @@ -283,10 +277,10 @@ OS 厂商为了扩大自己产品的兼容性范围,常常寻求与硬件厂 1. **system** + - 检查本工具是否被修改。 - 检查 OS 版本和 kernel 版本是否匹配。 - - 检查安装的认证工具是否有被修改。 - - 检查内核是否被感染。 - - 检查 selinux 是否正常。 + - 检查内核是否被修改/感染。 + - 检查 selinux 是否正常启用。 - 使用 dmidecode 工具读取硬件信息。 2. **cpufreq** diff --git a/oec-hardware.spec b/oec-hardware.spec index 00750f0b492b60f21dace23caa3cd7f5616921a4..d63f87eb24a966e7c7ac39f0386257396e2df9b0 100644 --- a/oec-hardware.spec +++ b/oec-hardware.spec @@ -15,7 +15,7 @@ Source0: %{name}-%{version}-%{release}.tar.bz2 Buildroot: %{_tmppath}/%{name}-%{version}-root BuildRequires: gcc -Requires: kernel-devel, kernel-headers, dmidecode +Requires: kernel-devel, kernel-headers, dmidecode, tar Requires: qperf, fio, memtester Requires: kernel >= 4 Requires: python3 @@ -24,7 +24,7 @@ Requires: python3 %package server Summary: openEuler Hardware Compatibility Test Server Group: Development/Tools -Requires: python3, python3-devel, nginx, qperf, psmisc +Requires: python3, python3-devel, nginx, tar, qperf, psmisc %description openEuler Hardware Compatibility Test Suite diff --git a/tests/network/ethernet.py b/tests/network/ethernet.py index 7da0eedbd33498f3df3f8ba05a39cab6d824b305..8d1728aafe267edac8925e035ab8b6c7ce5f616b 100755 --- a/tests/network/ethernet.py +++ b/tests/network/ethernet.py @@ -16,7 +16,6 @@ import os import argparse from hwcompatible.test import Test -from hwcompatible.command import Command from hwcompatible.env import CertEnv from hwcompatible.document import CertDocument from rdma import RDMATest @@ -25,6 +24,9 @@ from rdma import RDMATest class EthernetTest(RDMATest): def __init__(self): RDMATest.__init__(self) + self.args = None + self.cert = None + self.device = None self.subtests = [self.test_ip_info, self.test_eth_link, self.test_icmp, self.test_udp_tcp, self.test_http] self.target_bandwidth_percent = 0.75 @@ -63,18 +65,3 @@ class EthernetTest(RDMATest): if not subtest(): return False return True - - -if __name__ == '__main__': - t = EthernetTest() - t.server_ip = '199.1.1.2' - - from hwcompatible.device import Device - properties = { - 'DEVPATH': '/devices/pci0000:80/0000:80:01.0/0000:81:00.0/net/enp129s0f0', - 'INTERFACE': 'enp129s0f0' - } - t.device = Device(properties) - t.interface = t.device.get_property("INTERFACE") - # t.setup() - t.test() diff --git a/tests/network/infiniband.py b/tests/network/infiniband.py index 7ab70215f91e3506eb5cc9f3d8d78b6b07e1e2b4..5e500ee498fd339d745f0cc23d5632b41c1d778f 100755 --- a/tests/network/infiniband.py +++ b/tests/network/infiniband.py @@ -47,18 +47,3 @@ class InfiniBandTest(RDMATest): print("[.] The subnet manager lid is %s" % self.sm_lid) return True - -if __name__ == '__main__': - t = InfiniBandTest() - t.server_ip = '199.1.37.20' - t.speed = 10000 # Mb/s - - from hwcompatible.device import Device - properties = { - 'DEVPATH': '/devices/pci0000:d7/0000:d7:02.0/0000:d8:00.0/net/ib0', - 'INTERFACE': 'ib0' - } - t.device = Device(properties) - t.interface = t.device.get_property("INTERFACE") - # t.setup() - t.test() diff --git a/tests/network/network.py b/tests/network/network.py index 6fd97c2a02f11c09814a6982020b5eab438237ef..3d72d6352735c5090e223cd359387773c0e7a72d 100755 --- a/tests/network/network.py +++ b/tests/network/network.py @@ -26,7 +26,7 @@ except ImportError: from urllib2 import urlopen, Request, HTTPError from hwcompatible.test import Test -from hwcompatible.command import Command +from hwcompatible.command import Command, CertCommandError from hwcompatible.document import CertDocument from hwcompatible.env import CertEnv @@ -34,6 +34,9 @@ from hwcompatible.env import CertEnv class NetworkTest(Test): def __init__(self): Test.__init__(self) + self.args = None + self.cert = None + self.device = None self.requirements = ['ethtool', 'iproute', 'psmisc', 'qperf'] self.subtests = [self.test_ip_info, self.test_eth_link, self.test_icmp, self.test_udp_tcp, self.test_http] @@ -79,7 +82,7 @@ class NetworkTest(Test): try: c.run() return c.output - except Exception as e: + except CertCommandError as e: print(e) return [] @@ -98,28 +101,28 @@ class NetworkTest(Test): def get_speed(self): c = Command("ethtool %s" % self.interface) - pattern = ".*Speed:\s+(?P\d+)Mb/s" + pattern = r".*Speed:\s+(?P\d+)Mb/s" try: speed = c.get_str(pattern, 'speed', False) return int(speed) - except Exception as e: + except CertCommandError as e: print("[X] No speed found on the interface.") return None def get_interface_ip(self): c = Command("ip addr show %s" % self.interface) - pattern = ".*inet.? (?P.+)/.*" + pattern = r".*inet.? (?P.+)/.*" try: ip = c.get_str(pattern, 'ip', False) return ip - except Exception as e: + except CertCommandError as e: print("[X] No available ip on the interface.") return None def test_icmp(self): count = 500 c = Command("ping -q -c %d -i 0 %s" % (count, self.server_ip)) - pattern =".*, (?P\d+\.{0,1}\d*)% packet loss.*" + pattern = r".*, (?P\d+\.{0,1}\d*)% packet loss.*" for _ in range(self.retries): try: @@ -128,7 +131,7 @@ class NetworkTest(Test): c.print_output() if float(loss) == 0: return True - except Exception as e: + except CertCommandError as e: print(e) return False @@ -145,7 +148,7 @@ class NetworkTest(Test): try: request = Request(url, data=data, headers=headers) response = urlopen(request) - except Exception as e: + except HTTPError as e: print(e) return False print("Status: %u %s" % (response.code, response.msg)) @@ -171,7 +174,7 @@ class NetworkTest(Test): cmd = "qperf %s tcp_bw" % self.server_ip print(cmd) c = Command(cmd) - pattern = "\s+bw\s+=\s+(?P[\.0-9]+ [MG]B/sec)" + pattern = r"\s+bw\s+=\s+(?P[\.0-9]+ [MG]B/sec)" for _ in range(self.retries): try: bandwidth = c.get_str(pattern, 'bandwidth', False) @@ -186,7 +189,7 @@ class NetworkTest(Test): (bandwidth, target_bandwidth)) if bandwidth > target_bandwidth: return True - except Exception as e: + except CertCommandError as e: print(e) return False @@ -204,7 +207,7 @@ class NetworkTest(Test): try: with open(self.testfile, 'rb') as f: filetext = base64.b64encode(f.read()) - except Exception as e: + except IOError as e: print(e) return False @@ -221,7 +224,7 @@ class NetworkTest(Test): try: request = Request(url, data=data, headers=headers) response = urlopen(request) - except Exception as e: + except HTTPError as e: print(e) return False time_stop = time.time() @@ -240,7 +243,7 @@ class NetworkTest(Test): time_start = time.time() try: response = urlopen(url) - except Exception as e: + except HTTPError as e: print(e) return False time_stop = time.time() @@ -252,7 +255,7 @@ class NetworkTest(Test): try: with open(self.testfile, 'wb') as f: f.write(filetext) - except Exception as e: + except IOError as e: print(e) return False @@ -371,18 +374,3 @@ class NetworkTest(Test): self.set_other_interfaces_up() print("[.] Test finished.") - - -if __name__ == '__main__': - t = NetworkTest() - t.server_ip = '9.82.37.2' - - from hwcompatible.device import Device - properties = { - 'DEVPATH': '/devices/pci0000:17/0000:17:00.0/0000:18:00.0/0000:19:03.0/0000:1a:00.2/net/eth_main', - 'INTERFACE': 'eth_main' - } - t.device = Device(properties) - t.interface = t.device.get_property("INTERFACE") - # t.setup() - t.test() diff --git a/tests/network/rdma.py b/tests/network/rdma.py index f1ea71bc46fc6b8195c49eefe8d579e70112f1d2..feadf222651346194c8aa427d188dc94cb937d32 100755 --- a/tests/network/rdma.py +++ b/tests/network/rdma.py @@ -17,7 +17,7 @@ import re import argparse from hwcompatible.test import Test -from hwcompatible.command import Command +from hwcompatible.command import Command, CertCommandError from hwcompatible.document import CertDocument from hwcompatible.env import CertEnv from network import NetworkTest @@ -26,11 +26,13 @@ from network import NetworkTest class RDMATest(NetworkTest): def __init__(self): NetworkTest.__init__(self) + self.args = None + self.cert = None + self.device = None self.requirements = ['ethtool', 'iproute', 'psmisc', 'qperf', 'perftest', 'opensm', 'infiniband-diags', 'librdmacm-utils', 'libibverbs-utils'] self.subtests = [self.test_ibstatus, self.test_icmp, self.test_rdma] - self.device = None self.interface = None self.ib_device = None self.ib_port = None @@ -53,7 +55,7 @@ class RDMATest(NetworkTest): c = Command(cmd) try: self.ib_device = c.read() - except Exception as e: + except CertCommandError as e: print(e) return False @@ -62,7 +64,7 @@ class RDMATest(NetworkTest): c = Command(cmd) try: self.ib_port = int(c.read(), 16) + 1 - except Exception as e: + except CertCommandError as e: print(e) return False @@ -78,14 +80,14 @@ class RDMATest(NetworkTest): if ib_str not in info: continue print(info) - self.gid = re.search("default gid:\s+(.*)", info).group(1) - self.base_lid = re.search("base lid:\s+(.*)", info).group(1) - self.sm_lid = re.search("sm lid:\s+(.*)", info).group(1) - self.state = re.search("state:\s+(.*)", info).group(1) - self.phys_state = re.search("phys state:\s+(.*)", info).group(1) - self.link_layer = re.search("link_layer:\s+(.*)", info).group(1) - self.speed = int(re.search("rate:\s+(\d*)", info).group(1)) * 1024 - except Exception as e: + self.gid = re.search(r"default gid:\s+(.*)", info).group(1) + self.base_lid = re.search(r"base lid:\s+(.*)", info).group(1) + self.sm_lid = re.search(r"sm lid:\s+(.*)", info).group(1) + self.state = re.search(r"state:\s+(.*)", info).group(1) + self.phys_state = re.search(r"phys state:\s+(.*)", info).group(1) + self.link_layer = re.search(r"link_layer:\s+(.*)", info).group(1) + self.speed = int(re.search(r"rate:\s+(\d*)", info).group(1)) * 1024 + except CertCommandError as e: print(e) return False @@ -126,7 +128,7 @@ class RDMATest(NetworkTest): cmd = "%s %s -d %s -i %s" % (cmd, self.server_ip, self.ib_device, self.ib_port) print(cmd) c = Command(cmd) - pattern = "\s+(\d+)\s+(\d+)\s+([\.\d]+)\s+(?P[\.\d]+)\s+([\.\d]+)" + pattern = r"\s+(\d+)\s+(\d+)\s+([\.\d]+)\s+(?P[\.\d]+)\s+([\.\d]+)" try: avg_bw = c.get_str(pattern, 'avg_bw', False) ## MB/sec avg_bw = float(avg_bw) * 8 @@ -135,7 +137,7 @@ class RDMATest(NetworkTest): print("Current bandwidth is %.2fMb/s, target is %.2fMb/s" % (avg_bw, tgt_bw)) return avg_bw > tgt_bw - except Exception as e: + except CertCommandError as e: print(e) self.call_remote_server(cmd, 'stop') return False @@ -210,19 +212,3 @@ class RDMATest(NetworkTest): if not subtest(): return False return True - - -if __name__ == '__main__': - t = RDMATest() - t.server_ip = '199.1.37.20' - t.speed = 10000 # Mb/s - - from hwcompatible.device import Device - properties = { - 'DEVPATH': '/devices/pci0000:d7/0000:d7:02.0/0000:d8:00.0/net/ib0', - 'INTERFACE': 'ib0' - } - t.device = Device(properties) - t.interface = t.device.get_property("INTERFACE") - # t.setup() - t.test()