9 from vstf.agent.perf import netns
10 from vstf.common.utils import check_output, get_device_name, my_sleep, check_call, call, IPCommandHelper
12 LOG = logging.getLogger(__name__)
20 class LspciHelper(object):
22 self.bdf_desc_map = {}
23 self.bdf_device_map = {}
24 self.device_bdf_map = {}
26 self.bdf_driver_map = {}
35 self.bdf_desc_map = {}
36 out = check_output('lspci |grep Eth', shell=True)
37 for line in out.splitlines():
38 bdf, desc = line.split(' ', 1)
39 self.bdf_desc_map[bdf] = desc
41 def _get_devices(self):
42 for bdf, desc in self.bdf_desc_map.items():
43 device = get_device_name(bdf)
45 LOG.info("cann't find device name for bdf:%s, no driver is available.", bdf)
47 self._load_driver(desc)
49 LOG.warn("!!!unable to load_driver for device:%s", bdf)
51 device = get_device_name(bdf)
52 self.bdf_device_map[bdf] = device
54 self.device_bdf_map[device] = bdf
55 check_call("ip link set dev %s up" % device, shell=True)
57 def _get_drivers(self):
58 for device, bdf in self.device_bdf_map.items():
59 buf = check_output('ethtool -i %s | head -n1' % device, shell=True)
60 driver = buf.split()[1]
61 self.bdf_driver_map[bdf] = driver
63 def _get_ip_macs(self):
64 for device, bdf in self.device_bdf_map.items():
65 buf = check_output("ip addr show dev %s" % device, shell=True)
66 macs = re.compile("[A-F0-9]{2}(?::[A-F0-9]{2}){5}", re.IGNORECASE | re.MULTILINE)
67 for mac in macs.findall(buf):
68 if mac.lower() in ('00:00:00:00:00:00', 'ff:ff:ff:ff:ff:ff'):
72 ips = re.compile(r"inet (\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}/\d{1,2})", re.MULTILINE)
75 self.bdf_ip_map[bdf] = ip[0]
77 self.bdf_ip_map[bdf] = None
78 self.bdf_mac_map[bdf] = mac
79 self.mac_bdf_map[mac] = bdf
81 def _load_driver(self, desc):
82 for key in default_drivers:
84 driver = default_drivers[key]
85 LOG.info("try to load default driver [%s]", driver)
86 check_call('modprobe %s' % driver, shell=True)
89 LOG.warn("unsupported nic type:%s", desc)
92 class DeviceManager(object):
94 super(DeviceManager, self).__init__()
95 mgr = netns.NetnsManager()
96 mgr.clean_all_namespace()
97 self.lspci_helper = LspciHelper()
99 def _get_device_detail(self, bdf):
100 device = self.lspci_helper.bdf_device_map[bdf]
101 mac = self.lspci_helper.bdf_mac_map[bdf]
102 ip = self.lspci_helper.bdf_ip_map[bdf]
103 desc = self.lspci_helper.bdf_desc_map[bdf]
104 driver = self.lspci_helper.bdf_driver_map[bdf]
115 def get_device_detail(self, identity):
117 Gets the detail of a network card.
119 :param identity: be it the mac address, bdf, device name of a network card.
120 :return: device detail of a network card.
122 if identity in self.lspci_helper.bdf_device_map:
124 elif identity in self.lspci_helper.device_bdf_map:
125 bdf = self.lspci_helper.device_bdf_map[identity]
126 elif identity in self.lspci_helper.mac_bdf_map:
127 bdf = self.lspci_helper.mac_bdf_map[identity]
129 raise Exception("cann't find the device by identity:%s" % identity)
130 return self._get_device_detail(bdf)
132 def get_device_verbose(self, identity):
133 return IPCommandHelper().get_device_verbose(identity)
135 def list_nic_devices(self):
137 Get all the details of network devices in the host.
138 :return: a list of network card detail.
141 for bdf in self.lspci_helper.bdf_device_map.keys():
142 detail = self._get_device_detail(bdf)
143 device_list.append(detail)