From f7d99f2558a9833da9dea2d8a163ac759b4ca9d7 Mon Sep 17 00:00:00 2001 From: Air9 Date: Mon, 8 Jun 2020 16:21:19 +0800 Subject: [PATCH 1/6] add tar to requirements of server --- oec-hardware.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oec-hardware.spec b/oec-hardware.spec index 00750f0..713631d 100644 --- a/oec-hardware.spec +++ b/oec-hardware.spec @@ -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, tar, nginx, qperf, psmisc %description openEuler Hardware Compatibility Test Suite -- Gitee From 5d5c525eabfb322fb57eb679e05101a05af95571 Mon Sep 17 00:00:00 2001 From: air9 Date: Mon, 8 Jun 2020 19:53:52 +0800 Subject: [PATCH 2/6] remove useless main --- tests/network/ethernet.py | 15 --------------- tests/network/infiniband.py | 15 --------------- tests/network/network.py | 15 --------------- tests/network/rdma.py | 16 ---------------- 4 files changed, 61 deletions(-) diff --git a/tests/network/ethernet.py b/tests/network/ethernet.py index 7da0eed..e977d60 100755 --- a/tests/network/ethernet.py +++ b/tests/network/ethernet.py @@ -63,18 +63,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 7ab7021..5e500ee 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 6fd97c2..7893b94 100755 --- a/tests/network/network.py +++ b/tests/network/network.py @@ -371,18 +371,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 f1ea71b..69df2ae 100755 --- a/tests/network/rdma.py +++ b/tests/network/rdma.py @@ -210,19 +210,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() -- Gitee From 3f8d148e3d79ada1871f7a8540517651b923e93a Mon Sep 17 00:00:00 2001 From: air9 Date: Mon, 8 Jun 2020 20:28:00 +0800 Subject: [PATCH 3/6] update README --- README.md | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 2b1e2ff..76fe132 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** -- Gitee From 7ed07840ae7bc3ec87509a3f28e3362e7f7d7cdc Mon Sep 17 00:00:00 2001 From: air9 Date: Mon, 8 Jun 2020 21:25:57 +0800 Subject: [PATCH 4/6] clean codesmell --- tests/network/ethernet.py | 4 +++- tests/network/network.py | 33 ++++++++++++++++++--------------- tests/network/rdma.py | 30 ++++++++++++++++-------------- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/tests/network/ethernet.py b/tests/network/ethernet.py index e977d60..8d1728a 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 diff --git a/tests/network/network.py b/tests/network/network.py index 7893b94..e86577d 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 FileNotFoundError 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 FileNotFoundError as e: print(e) return False diff --git a/tests/network/rdma.py b/tests/network/rdma.py index 69df2ae..feadf22 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 -- Gitee From 0b3f293d2e63f32d5763af81cea3309935acaceb Mon Sep 17 00:00:00 2001 From: air9 Date: Tue, 9 Jun 2020 10:37:28 +0800 Subject: [PATCH 5/6] use IOError instead in case of py2 --- tests/network/network.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/network/network.py b/tests/network/network.py index e86577d..3d72d63 100755 --- a/tests/network/network.py +++ b/tests/network/network.py @@ -207,7 +207,7 @@ class NetworkTest(Test): try: with open(self.testfile, 'rb') as f: filetext = base64.b64encode(f.read()) - except FileNotFoundError as e: + except IOError as e: print(e) return False @@ -255,7 +255,7 @@ class NetworkTest(Test): try: with open(self.testfile, 'wb') as f: f.write(filetext) - except FileNotFoundError as e: + except IOError as e: print(e) return False -- Gitee From 1c3ab3e275370213b502d9a43ffcf08d21448d55 Mon Sep 17 00:00:00 2001 From: Air9 Date: Fri, 12 Jun 2020 16:14:43 +0800 Subject: [PATCH 6/6] add tar for both client and server --- oec-hardware.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oec-hardware.spec b/oec-hardware.spec index 713631d..d63f87e 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, tar, nginx, qperf, psmisc +Requires: python3, python3-devel, nginx, tar, qperf, psmisc %description openEuler Hardware Compatibility Test Suite -- Gitee