xref: /openbmc/bmcweb/features/redfish/include/utils/chassis_utils.hpp (revision f8fe53e7114ab10c9059377541277739ace5c1ff)
10d7702c0SZhenwei Chen #pragma once
20d7702c0SZhenwei Chen #include <async_resp.hpp>
30d7702c0SZhenwei Chen 
40d7702c0SZhenwei Chen namespace redfish
50d7702c0SZhenwei Chen {
60d7702c0SZhenwei Chen 
70d7702c0SZhenwei Chen namespace chassis_utils
80d7702c0SZhenwei Chen {
90d7702c0SZhenwei Chen /**
100d7702c0SZhenwei Chen  * @brief Retrieves valid chassis path
110d7702c0SZhenwei Chen  * @param asyncResp   Pointer to object holding response data
120d7702c0SZhenwei Chen  * @param callback  Callback for next step to get valid chassis path
130d7702c0SZhenwei Chen  */
140d7702c0SZhenwei Chen template <typename Callback>
150d7702c0SZhenwei Chen void getValidChassisPath(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
160d7702c0SZhenwei Chen                          const std::string& chassisId, Callback&& callback)
170d7702c0SZhenwei Chen {
180d7702c0SZhenwei Chen     BMCWEB_LOG_DEBUG << "checkChassisId enter";
190d7702c0SZhenwei Chen     const std::array<const char*, 2> interfaces = {
200d7702c0SZhenwei Chen         "xyz.openbmc_project.Inventory.Item.Board",
210d7702c0SZhenwei Chen         "xyz.openbmc_project.Inventory.Item.Chassis"};
220d7702c0SZhenwei Chen 
230d7702c0SZhenwei Chen     auto respHandler =
240d7702c0SZhenwei Chen         [callback{std::forward<Callback>(callback)}, asyncResp,
250d7702c0SZhenwei Chen          chassisId](const boost::system::error_code ec,
260d7702c0SZhenwei Chen                     const dbus::utility::MapperGetSubTreePathsResponse&
270d7702c0SZhenwei Chen                         chassisPaths) mutable {
280d7702c0SZhenwei Chen         BMCWEB_LOG_DEBUG << "getValidChassisPath respHandler enter";
290d7702c0SZhenwei Chen         if (ec)
300d7702c0SZhenwei Chen         {
310d7702c0SZhenwei Chen             BMCWEB_LOG_ERROR << "getValidChassisPath respHandler DBUS error: "
320d7702c0SZhenwei Chen                              << ec;
330d7702c0SZhenwei Chen             messages::internalError(asyncResp->res);
340d7702c0SZhenwei Chen             return;
350d7702c0SZhenwei Chen         }
360d7702c0SZhenwei Chen 
370d7702c0SZhenwei Chen         std::optional<std::string> chassisPath;
380d7702c0SZhenwei Chen         for (const std::string& chassis : chassisPaths)
390d7702c0SZhenwei Chen         {
400d7702c0SZhenwei Chen             sdbusplus::message::object_path path(chassis);
41*f8fe53e7SEd Tanous             std::string chassisName = path.filename();
420d7702c0SZhenwei Chen             if (chassisName.empty())
430d7702c0SZhenwei Chen             {
440d7702c0SZhenwei Chen                 BMCWEB_LOG_ERROR << "Failed to find '/' in " << chassis;
450d7702c0SZhenwei Chen                 continue;
460d7702c0SZhenwei Chen             }
470d7702c0SZhenwei Chen             if (chassisName == chassisId)
480d7702c0SZhenwei Chen             {
490d7702c0SZhenwei Chen                 chassisPath = chassis;
500d7702c0SZhenwei Chen                 break;
510d7702c0SZhenwei Chen             }
520d7702c0SZhenwei Chen         }
530d7702c0SZhenwei Chen         callback(chassisPath);
540d7702c0SZhenwei Chen     };
550d7702c0SZhenwei Chen 
560d7702c0SZhenwei Chen     // Get the Chassis Collection
570d7702c0SZhenwei Chen     crow::connections::systemBus->async_method_call(
580d7702c0SZhenwei Chen         respHandler, "xyz.openbmc_project.ObjectMapper",
590d7702c0SZhenwei Chen         "/xyz/openbmc_project/object_mapper",
600d7702c0SZhenwei Chen         "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
610d7702c0SZhenwei Chen         "/xyz/openbmc_project/inventory", 0, interfaces);
620d7702c0SZhenwei Chen     BMCWEB_LOG_DEBUG << "checkChassisId exit";
630d7702c0SZhenwei Chen }
640d7702c0SZhenwei Chen 
650d7702c0SZhenwei Chen } // namespace chassis_utils
660d7702c0SZhenwei Chen } // namespace redfish
67