def _get_pcidp_network_resources_by_ifclass(self, ifclass): resources = {} interfaces = self._get_network_interfaces_by_class(ifclass) for iface in interfaces: if ifclass == constants.INTERFACE_CLASS_PCI_SRIOV: port = interface.get_sriov_interface_port(self.context, iface) else: port = interface.get_interface_port(self.context, iface) if not port: continue datanets = interface.get_interface_datanets(self.context, iface) for datanet in datanets: dn_name = datanet['name'].strip() resource = resources.get(dn_name, None) if not resource: resource = { "resourceName": "{}_net_{}".format(ifclass, dn_name).replace("-", "_"), "selectors": { "vendors": [], "devices": [], "drivers": [], "pfNames": [] } } vendor = self._get_pcidp_vendor_id(port) if not vendor: LOG.error("Failed to get vendor id for pci device %s", port['pciaddr']) continue device = self._get_pcidp_device_id(port, ifclass) if not device: LOG.error("Failed to get device id for pci device %s", port['pciaddr']) continue driver = self._get_pcidp_driver(port, iface, ifclass) if not driver: LOG.error("Failed to get driver for pci device %s", port['pciaddr']) continue vendor_list = resource['selectors']['vendors'] if vendor not in vendor_list: vendor_list.append(vendor) device_list = resource['selectors']['devices'] if device not in device_list: device_list.append(device) driver_list = resource['selectors']['drivers'] if driver not in driver_list: driver_list.append(driver) pf_name_list = resource['selectors']['pfNames'] if port['name'] not in pf_name_list: pf_name_list.append(port['name']) if interface.is_a_mellanox_device(self.context, iface): resource['selectors']['isRdma'] = True resources[dn_name] = resource return list(resources.values())
def _get_pcidp_network_resources_by_ifclass(self, ifclass): resources = {} interfaces = self._get_network_interfaces_by_class(ifclass) for iface in interfaces: if ifclass == constants.INTERFACE_CLASS_PCI_SRIOV: port = interface.get_sriov_interface_port(self.context, iface) else: port = interface.get_interface_port(self.context, iface) if not port: continue datanets = interface.get_interface_datanets(self.context, iface) for datanet in datanets: dn_name = datanet['name'].strip() resource = resources.get(dn_name, None) if not resource: resource = { "resourceName": "{}_net_{}".format(ifclass, dn_name).replace("-", "_"), "selectors": { "vendors": [], "devices": [], "drivers": [], "pfNames": [] } } vendor = self._get_pcidp_vendor_id(port) if not vendor: LOG.error("Failed to get vendor id for pci device %s", port['pciaddr']) continue device = self._get_pcidp_device_id(port, ifclass) if not device: LOG.error("Failed to get device id for pci device %s", port['pciaddr']) continue driver = self._get_pcidp_driver(port, iface, ifclass) if not driver: LOG.error("Failed to get driver for pci device %s", port['pciaddr']) continue vendor_list = resource['selectors']['vendors'] if vendor not in vendor_list: vendor_list.append(vendor) device_list = resource['selectors']['devices'] if device not in device_list: device_list.append(device) driver_list = resource['selectors']['drivers'] if driver not in driver_list: driver_list.append(driver) pf_name_list = resource['selectors']['pfNames'] if ifclass == constants.INTERFACE_CLASS_PCI_SRIOV: # In sriov case, we need specify each VF for resource pool # Get VF addresses assigned to this logical VF interface vf_addr_list = [] all_vf_addr_list = [] vf_addrs = port.get('sriov_vfs_pci_address', None) if vf_addrs: all_vf_addr_list = vf_addrs.split(',') vf_addr_list = interface.get_sriov_interface_vf_addrs( self.context, iface, all_vf_addr_list) vfnolst = [ utils.get_sriov_vf_index(addr, all_vf_addr_list) for addr in vf_addr_list ] vfnolst = [str(vfno) for vfno in vfnolst] vfnolist_str = ",".join(vfnolst) if vfnolist_str: # concat into the form of 'ens785f0#0,2,7,9' pfname_with_vfs = "%s#%s" % (port['name'], vfnolist_str) pf_name_list.append(pfname_with_vfs) else: # error case, cannot find the vf numbers in sriov case LOG.error("Failed to get vf numbers for pci device %s", port['name']) continue else: if port['name'] not in pf_name_list: pf_name_list.append(port['name']) if interface.is_a_mellanox_device(self.context, iface): resource['selectors']['isRdma'] = True resources[dn_name] = resource return list(resources.values())