提交 2f149e6b 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!9 add requirement, remove useless code & update README

Merge pull request !9 from Air9/master
......@@ -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**
......
......@@ -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
......
......@@ -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()
......@@ -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()
......@@ -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<speed>\d+)Mb/s"
pattern = r".*Speed:\s+(?P<speed>\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<ip>.+)/.*"
pattern = r".*inet.? (?P<ip>.+)/.*"
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<loss>\d+\.{0,1}\d*)% packet loss.*"
pattern = r".*, (?P<loss>\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<bandwidth>[\.0-9]+ [MG]B/sec)"
pattern = r"\s+bw\s+=\s+(?P<bandwidth>[\.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()
......@@ -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<avg_bw>[\.\d]+)\s+([\.\d]+)"
pattern = r"\s+(\d+)\s+(\d+)\s+([\.\d]+)\s+(?P<avg_bw>[\.\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()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册