blob: 4511f6177b0ea8d357b2281076e382e9eee390f5 [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/**
Jonathan Domandea43dd2020-12-02 15:21:24 -080014 * @brief Populate the collection "Members" from a GetSubTreePaths search of
Gunnar Mills05030b82020-10-14 15:51:31 -050015 * 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
Jonathan Domandea43dd2020-12-02 15:21:24 -080021 * @param[in] subtree D-Bus base path to constrain search to.
Gunnar Mills05030b82020-10-14 15:51:31 -050022 *
23 * @return void
24 */
Jonathan Domandea43dd2020-12-02 15:21:24 -080025inline void
zhanghch058d1b46d2021-04-01 11:18:24 +080026 getCollectionMembers(std::shared_ptr<bmcweb::AsyncResp> aResp,
Jonathan Domandea43dd2020-12-02 15:21:24 -080027 const std::string& collectionPath,
28 const std::vector<const char*>& interfaces,
29 const char* subtree = "/xyz/openbmc_project/inventory")
Gunnar Mills116bcc52020-10-14 15:23:42 -050030{
Gunnar Mills05030b82020-10-14 15:51:31 -050031 BMCWEB_LOG_DEBUG << "Get collection members for: " << collectionPath;
Gunnar Mills116bcc52020-10-14 15:23:42 -050032 crow::connections::systemBus->async_method_call(
Jonathan Domandea43dd2020-12-02 15:21:24 -080033 [collectionPath,
34 aResp{std::move(aResp)}](const boost::system::error_code ec,
35 const std::vector<std::string>& objects) {
Ed Tanous27ea7db2021-10-01 12:05:44 -070036 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
Gunnar Mills116bcc52020-10-14 15:23:42 -050043 if (ec)
44 {
Ed Tanous27ea7db2021-10-01 12:05:44 -070045 BMCWEB_LOG_DEBUG << "DBUS response error " << ec.value();
Gunnar Mills116bcc52020-10-14 15:23:42 -050046 messages::internalError(aResp->res);
47 return;
48 }
49 nlohmann::json& members = aResp->res.jsonValue["Members"];
50 members = nlohmann::json::array();
51
Jonathan Domandea43dd2020-12-02 15:21:24 -080052 for (const auto& object : objects)
Gunnar Mills116bcc52020-10-14 15:23:42 -050053 {
Ed Tanous2dfd18e2020-12-18 00:41:31 +000054 sdbusplus::message::object_path path(object);
55 std::string leaf = path.filename();
56 if (leaf.empty())
Gunnar Mills116bcc52020-10-14 15:23:42 -050057 {
Ed Tanous2dfd18e2020-12-18 00:41:31 +000058 continue;
Gunnar Mills116bcc52020-10-14 15:23:42 -050059 }
Ed Tanous2dfd18e2020-12-18 00:41:31 +000060 std::string newPath = collectionPath;
61 newPath += '/';
62 newPath += leaf;
63 members.push_back({{"@odata.id", std::move(newPath)}});
Gunnar Mills116bcc52020-10-14 15:23:42 -050064 }
65 aResp->res.jsonValue["Members@odata.count"] = members.size();
66 },
67 "xyz.openbmc_project.ObjectMapper",
68 "/xyz/openbmc_project/object_mapper",
Jonathan Domandea43dd2020-12-02 15:21:24 -080069 "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", subtree, 0,
70 interfaces);
Gunnar Mills116bcc52020-10-14 15:23:42 -050071}
72
73} // namespace collection_util
74} // namespace redfish