示例#1
0
    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())
示例#2
0
    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())