#pragma once #include "async_resp.hpp" #include "dbus_utility.hpp" #include "error_messages.hpp" #include "http/utility.hpp" #include #include #include #include #include #include #include namespace redfish { namespace pcie_util { /** * @brief Populate the PCIe Device list from a GetSubTreePaths search of * inventory * * @param[i,o] aResp Async response object * @param[i] Name Key to store the list of PCIe devices in aResp * * @return void */ inline void getPCIeDeviceList(const std::shared_ptr& asyncResp, const std::string& name) { static constexpr std::array pcieDeviceInterface = { "xyz.openbmc_project.Inventory.Item.PCIeDevice"}; dbus::utility::getSubTreePaths( "/xyz/openbmc_project/inventory", 0, pcieDeviceInterface, [asyncResp, name](const boost::system::error_code& ec, const dbus::utility::MapperGetSubTreePathsResponse& pcieDevicePaths) { if (ec) { BMCWEB_LOG_DEBUG << "no PCIe device paths found ec: " << ec.message(); // Not an error, system just doesn't have PCIe info return; } nlohmann::json& pcieDeviceList = asyncResp->res.jsonValue[name]; pcieDeviceList = nlohmann::json::array(); for (const std::string& pcieDevicePath : pcieDevicePaths) { size_t devStart = pcieDevicePath.rfind('/'); if (devStart == std::string::npos) { continue; } std::string devName = pcieDevicePath.substr(devStart + 1); if (devName.empty()) { continue; } nlohmann::json::object_t pcieDevice; pcieDevice["@odata.id"] = boost::urls::format( "/redfish/v1/Systems/system/PCIeDevices/{}", devName); pcieDeviceList.emplace_back(std::move(pcieDevice)); } asyncResp->res.jsonValue[name + "@odata.count"] = pcieDeviceList.size(); }); } } // namespace pcie_util } // namespace redfish