Files
2024-08-20 10:33:21 +08:00

152 lines
4.8 KiB
Python

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#############################################################################
# Copyright (c) 2023 Huawei Technologies Co.,Ltd.
#
# openGauss is licensed under 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.
# ----------------------------------------------------------------------------
# Description : perf_probe.py setup a information set for configure
#############################################################################
import os
import ipaddress
from impl.perf_config.basic.project import Project
from impl.perf_config.basic.probe import Probe, ProbeGroup
from base_utils.os.cmd_util import CmdUtil
class NetworkGateInfo(Probe):
def __init__(self, ifconfig):
super(NetworkGateInfo, self).__init__()
self._ifconfig = ifconfig
self.name = None
self.ipv4 = None
self.ipv6 = None
self.mac = None
self.irq_binds = None
self.combined = None
self.tso = None
self.lro = None
self.gro = None
self.gso = None
def detect(self):
self._parse_ifconfig()
if not self.is_enp_gate():
return
self._detect_irq_binds()
self._detect_combined()
self._detect_ethtool_k()
def _parse_ifconfig(self):
lines = self._ifconfig.split('\n')
self.name = lines[0].split(':')[0].strip()
for line in lines:
line = line.strip()
if line.startswith('inet6'):
self.ipv6 = line.split(' ')[1]
elif line.startswith('inet'):
self.ipv4 = line.split(' ')[1]
self.netmask = line.split(' ')[3]
elif line.startswith('ether'):
self.mac = line.split(' ')[1]
def is_localhost(self):
return self.name == 'lo'
def is_virbr(self):
return self.name.startswith('virbr')
def is_enp_gate(self):
return self.name.startswith('enp')
def _detect_irq_binds(self):
script = Project.environ.get_builtin_script('irq_operate.sh')
cmd = f'sh {script} test {self.name}'
output = CmdUtil.execCmd(cmd, noexcept=True)
if output != 'ok':
Project.log(output)
return
cmd = f'sh {script} check {self.name}'
output = CmdUtil.execCmd(cmd)
lines = output.split('\n')
self.irq_binds = [int(num) for num in lines[2:]]
Project.log(f'Irq binds of {self.name} is: ' + str(self.irq_binds))
def _detect_combined(self):
cmd = f'ethtool -l {self.name} | grep Combined'
output = CmdUtil.execCmd(cmd)
parts = output.split()
self.combined = {'maximums': int(parts[1]),
'current': int(parts[3])}
def _detect_ethtool_k(self):
cmd = f'ethtool -k {self.name}'
output = CmdUtil.execCmd(cmd)
opt_map = {}
for line in output.split('\n'):
kv = line.split(':')
opt_map[kv[0]] = kv[1].strip()
self.tso = opt_map.get('tcp-segmentation-offload')
self.lro = opt_map.get('large-receive-offload')
class NetworkInfo(ProbeGroup):
def __init__(self):
super(NetworkInfo, self).__init__()
self._gates = []
def detect(self):
ifconfig = CmdUtil.execCmd('ifconfig')
lines = ifconfig.split('\n')
assert lines[-1].strip() == ''
s = 0
for i, line in enumerate(lines):
if line.strip() == '':
device = NetworkGateInfo('\n'.join(lines[s:i]))
self._gates.append(device)
self.add(device)
s = i + 1
super(NetworkInfo, self).detect()
def get_gate(self, argc):
"""
get device in device list
:param argc: device name or ipv4 or mac
:return:
"""
# Handle localhost special case
if argc in ['localhost', '127.0.0.1', '::1']:
argc = '127.0.0.1' if argc == 'localhost' else argc
try:
ip = ipaddress.ip_address(argc)
is_ip = True
except ValueError:
is_ip = False
for gate in self._gates:
if is_ip:
if (ip.version == 4 and gate.ipv4 == argc) or (ip.version == 6 and gate.ipv6 == argc):
return gate
else:
if gate.name == argc or gate.mac == argc:
return gate
return