xref: /openbmc/bmcweb/features/redfish/include/utils/chassis_utils.hpp (revision 7a1dbc4803bf78bfc0c574e6676b3c5def4cdae3)
10d7702c0SZhenwei Chen #pragma once
2*7a1dbc48SGeorge Liu 
3*7a1dbc48SGeorge Liu #include "dbus_utility.hpp"
4*7a1dbc48SGeorge Liu 
50d7702c0SZhenwei Chen #include <async_resp.hpp>
60d7702c0SZhenwei Chen 
7*7a1dbc48SGeorge Liu #include <array>
8*7a1dbc48SGeorge Liu #include <string_view>
9*7a1dbc48SGeorge Liu 
100d7702c0SZhenwei Chen namespace redfish
110d7702c0SZhenwei Chen {
120d7702c0SZhenwei Chen 
130d7702c0SZhenwei Chen namespace chassis_utils
140d7702c0SZhenwei Chen {
150d7702c0SZhenwei Chen /**
160d7702c0SZhenwei Chen  * @brief Retrieves valid chassis path
170d7702c0SZhenwei Chen  * @param asyncResp   Pointer to object holding response data
180d7702c0SZhenwei Chen  * @param callback  Callback for next step to get valid chassis path
190d7702c0SZhenwei Chen  */
200d7702c0SZhenwei Chen template <typename Callback>
210d7702c0SZhenwei Chen void getValidChassisPath(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
220d7702c0SZhenwei Chen                          const std::string& chassisId, Callback&& callback)
230d7702c0SZhenwei Chen {
240d7702c0SZhenwei Chen     BMCWEB_LOG_DEBUG << "checkChassisId enter";
25*7a1dbc48SGeorge Liu     constexpr std::array<std::string_view, 2> interfaces = {
260d7702c0SZhenwei Chen         "xyz.openbmc_project.Inventory.Item.Board",
270d7702c0SZhenwei Chen         "xyz.openbmc_project.Inventory.Item.Chassis"};
280d7702c0SZhenwei Chen 
29*7a1dbc48SGeorge Liu     // Get the Chassis Collection
30*7a1dbc48SGeorge Liu     dbus::utility::getSubTreePaths(
31*7a1dbc48SGeorge Liu         "/xyz/openbmc_project/inventory", 0, interfaces,
320d7702c0SZhenwei Chen         [callback{std::forward<Callback>(callback)}, asyncResp,
33*7a1dbc48SGeorge Liu          chassisId](const boost::system::error_code& ec,
340d7702c0SZhenwei Chen                     const dbus::utility::MapperGetSubTreePathsResponse&
350d7702c0SZhenwei Chen                         chassisPaths) mutable {
360d7702c0SZhenwei Chen         BMCWEB_LOG_DEBUG << "getValidChassisPath respHandler enter";
370d7702c0SZhenwei Chen         if (ec)
380d7702c0SZhenwei Chen         {
390d7702c0SZhenwei Chen             BMCWEB_LOG_ERROR << "getValidChassisPath respHandler DBUS error: "
400d7702c0SZhenwei Chen                              << ec;
410d7702c0SZhenwei Chen             messages::internalError(asyncResp->res);
420d7702c0SZhenwei Chen             return;
430d7702c0SZhenwei Chen         }
440d7702c0SZhenwei Chen 
450d7702c0SZhenwei Chen         std::optional<std::string> chassisPath;
460d7702c0SZhenwei Chen         for (const std::string& chassis : chassisPaths)
470d7702c0SZhenwei Chen         {
480d7702c0SZhenwei Chen             sdbusplus::message::object_path path(chassis);
49f8fe53e7SEd Tanous             std::string chassisName = path.filename();
500d7702c0SZhenwei Chen             if (chassisName.empty())
510d7702c0SZhenwei Chen             {
520d7702c0SZhenwei Chen                 BMCWEB_LOG_ERROR << "Failed to find '/' in " << chassis;
530d7702c0SZhenwei Chen                 continue;
540d7702c0SZhenwei Chen             }
550d7702c0SZhenwei Chen             if (chassisName == chassisId)
560d7702c0SZhenwei Chen             {
570d7702c0SZhenwei Chen                 chassisPath = chassis;
580d7702c0SZhenwei Chen                 break;
590d7702c0SZhenwei Chen             }
600d7702c0SZhenwei Chen         }
610d7702c0SZhenwei Chen         callback(chassisPath);
62*7a1dbc48SGeorge Liu         });
630d7702c0SZhenwei Chen     BMCWEB_LOG_DEBUG << "checkChassisId exit";
640d7702c0SZhenwei Chen }
650d7702c0SZhenwei Chen 
660d7702c0SZhenwei Chen } // namespace chassis_utils
670d7702c0SZhenwei Chen } // namespace redfish
68