1 #pragma once 2 3 #include <human_sort.hpp> 4 5 #include <string> 6 #include <vector> 7 8 namespace redfish 9 { 10 namespace collection_util 11 { 12 13 /** 14 * @brief Populate the collection "Members" from a GetSubTreePaths search of 15 * inventory 16 * 17 * @param[i,o] aResp Async response object 18 * @param[i] collectionPath Redfish collection path which is used for the 19 * Members Redfish Path 20 * @param[i] interfaces List of interfaces to constrain the GetSubTree search 21 * @param[in] subtree D-Bus base path to constrain search to. 22 * 23 * @return void 24 */ 25 inline void 26 getCollectionMembers(std::shared_ptr<bmcweb::AsyncResp> aResp, 27 const std::string& collectionPath, 28 const std::vector<const char*>& interfaces, 29 const char* subtree = "/xyz/openbmc_project/inventory") 30 { 31 BMCWEB_LOG_DEBUG << "Get collection members for: " << collectionPath; 32 crow::connections::systemBus->async_method_call( 33 [collectionPath, aResp{std::move(aResp)}]( 34 const boost::system::error_code ec, 35 const dbus::utility::MapperGetSubTreePathsResponse& objects) { 36 if (ec == boost::system::errc::io_error) 37 { 38 aResp->res.jsonValue["Members"] = nlohmann::json::array(); 39 aResp->res.jsonValue["Members@odata.count"] = 0; 40 return; 41 } 42 43 if (ec) 44 { 45 BMCWEB_LOG_DEBUG << "DBUS response error " << ec.value(); 46 messages::internalError(aResp->res); 47 return; 48 } 49 50 std::vector<std::string> pathNames; 51 for (const auto& object : objects) 52 { 53 sdbusplus::message::object_path path(object); 54 std::string leaf = path.filename(); 55 if (leaf.empty()) 56 { 57 continue; 58 } 59 pathNames.push_back(leaf); 60 } 61 std::sort(pathNames.begin(), pathNames.end(), 62 AlphanumLess<std::string>()); 63 64 nlohmann::json& members = aResp->res.jsonValue["Members"]; 65 members = nlohmann::json::array(); 66 for (const std::string& leaf : pathNames) 67 { 68 std::string newPath = collectionPath; 69 newPath += '/'; 70 newPath += leaf; 71 nlohmann::json::object_t member; 72 member["@odata.id"] = std::move(newPath); 73 members.push_back(std::move(member)); 74 } 75 aResp->res.jsonValue["Members@odata.count"] = members.size(); 76 }, 77 "xyz.openbmc_project.ObjectMapper", 78 "/xyz/openbmc_project/object_mapper", 79 "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", subtree, 0, 80 interfaces); 81 } 82 83 } // namespace collection_util 84 } // namespace redfish 85