blob: 85a462aab0d3ca68c690d66254ccb9a11e1e901b [file] [log] [blame]
Gunnar Mills116bcc52020-10-14 15:23:42 -05001#pragma once
2
3#include <boost/container/flat_map.hpp>
4
5#include <string>
6#include <vector>
7
8namespace redfish
9{
10namespace collection_util
11{
12
Gunnar Mills05030b82020-10-14 15:51:31 -050013/**
14 * @brief Populate the collection "Members" from a GetSubTree 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 *
22 * @return void
23 */
24inline void getCollectionMembers(std::shared_ptr<AsyncResp> aResp,
25 const std::string& collectionPath,
26 const std::vector<const char*>& interfaces)
Gunnar Mills116bcc52020-10-14 15:23:42 -050027{
Gunnar Mills05030b82020-10-14 15:51:31 -050028 BMCWEB_LOG_DEBUG << "Get collection members for: " << collectionPath;
Gunnar Mills116bcc52020-10-14 15:23:42 -050029 crow::connections::systemBus->async_method_call(
Gunnar Mills05030b82020-10-14 15:51:31 -050030 [collectionPath, aResp{std::move(aResp)}](
Gunnar Mills116bcc52020-10-14 15:23:42 -050031 const boost::system::error_code ec,
32 const boost::container::flat_map<
33 std::string, boost::container::flat_map<
34 std::string, std::vector<std::string>>>&
35 subtree) {
36 if (ec)
37 {
38 BMCWEB_LOG_DEBUG << "DBUS response error";
39 messages::internalError(aResp->res);
40 return;
41 }
42 nlohmann::json& members = aResp->res.jsonValue["Members"];
43 members = nlohmann::json::array();
44
45 for (const auto& object : subtree)
46 {
Ed Tanousf23b7292020-10-15 09:41:17 -070047 auto iter = object.first.rfind('/');
Gunnar Mills116bcc52020-10-14 15:23:42 -050048 if ((iter != std::string::npos) && (iter < object.first.size()))
49 {
50 members.push_back(
Gunnar Mills05030b82020-10-14 15:51:31 -050051 {{"@odata.id", collectionPath + "/" +
Gunnar Mills116bcc52020-10-14 15:23:42 -050052 object.first.substr(iter + 1)}});
53 }
54 }
55 aResp->res.jsonValue["Members@odata.count"] = members.size();
56 },
57 "xyz.openbmc_project.ObjectMapper",
58 "/xyz/openbmc_project/object_mapper",
59 "xyz.openbmc_project.ObjectMapper", "GetSubTree",
Gunnar Mills05030b82020-10-14 15:51:31 -050060 "/xyz/openbmc_project/inventory", 0, interfaces);
Gunnar Mills116bcc52020-10-14 15:23:42 -050061}
62
63} // namespace collection_util
64} // namespace redfish