blob: 7a845d1e3803b782a24400801a95b4665fb8727b [file] [log] [blame]
#pragma once
#include <human_sort.hpp>
#include <string>
#include <vector>
namespace redfish
{
namespace collection_util
{
/**
* @brief Populate the collection "Members" from a GetSubTreePaths search of
* inventory
*
* @param[i,o] aResp Async response object
* @param[i] collectionPath Redfish collection path which is used for the
* Members Redfish Path
* @param[i] interfaces List of interfaces to constrain the GetSubTree search
* @param[in] subtree D-Bus base path to constrain search to.
*
* @return void
*/
inline void
getCollectionMembers(std::shared_ptr<bmcweb::AsyncResp> aResp,
const std::string& collectionPath,
const std::vector<const char*>& interfaces,
const char* subtree = "/xyz/openbmc_project/inventory")
{
BMCWEB_LOG_DEBUG << "Get collection members for: " << collectionPath;
crow::connections::systemBus->async_method_call(
[collectionPath, aResp{std::move(aResp)}](
const boost::system::error_code ec,
const dbus::utility::MapperGetSubTreePathsResponse& objects) {
if (ec == boost::system::errc::io_error)
{
aResp->res.jsonValue["Members"] = nlohmann::json::array();
aResp->res.jsonValue["Members@odata.count"] = 0;
return;
}
if (ec)
{
BMCWEB_LOG_DEBUG << "DBUS response error " << ec.value();
messages::internalError(aResp->res);
return;
}
std::vector<std::string> pathNames;
for (const auto& object : objects)
{
sdbusplus::message::object_path path(object);
std::string leaf = path.filename();
if (leaf.empty())
{
continue;
}
pathNames.push_back(leaf);
}
std::sort(pathNames.begin(), pathNames.end(),
AlphanumLess<std::string>());
nlohmann::json& members = aResp->res.jsonValue["Members"];
members = nlohmann::json::array();
for (const std::string& leaf : pathNames)
{
std::string newPath = collectionPath;
newPath += '/';
newPath += leaf;
nlohmann::json::object_t member;
member["@odata.id"] = std::move(newPath);
members.push_back(std::move(member));
}
aResp->res.jsonValue["Members@odata.count"] = members.size();
},
"xyz.openbmc_project.ObjectMapper",
"/xyz/openbmc_project/object_mapper",
"xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", subtree, 0,
interfaces);
}
} // namespace collection_util
} // namespace redfish