xref: /openbmc/bmcweb/features/redfish/include/utils/chassis_utils.hpp (revision 0d7702c0246c5948caf12a3e441f74952c7d0ccf)
1*0d7702c0SZhenwei Chen #pragma once
2*0d7702c0SZhenwei Chen #include <async_resp.hpp>
3*0d7702c0SZhenwei Chen 
4*0d7702c0SZhenwei Chen namespace redfish
5*0d7702c0SZhenwei Chen {
6*0d7702c0SZhenwei Chen 
7*0d7702c0SZhenwei Chen namespace chassis_utils
8*0d7702c0SZhenwei Chen {
9*0d7702c0SZhenwei Chen /**
10*0d7702c0SZhenwei Chen  * @brief Retrieves valid chassis path
11*0d7702c0SZhenwei Chen  * @param asyncResp   Pointer to object holding response data
12*0d7702c0SZhenwei Chen  * @param callback  Callback for next step to get valid chassis path
13*0d7702c0SZhenwei Chen  */
14*0d7702c0SZhenwei Chen template <typename Callback>
15*0d7702c0SZhenwei Chen void getValidChassisPath(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
16*0d7702c0SZhenwei Chen                          const std::string& chassisId, Callback&& callback)
17*0d7702c0SZhenwei Chen {
18*0d7702c0SZhenwei Chen     BMCWEB_LOG_DEBUG << "checkChassisId enter";
19*0d7702c0SZhenwei Chen     const std::array<const char*, 2> interfaces = {
20*0d7702c0SZhenwei Chen         "xyz.openbmc_project.Inventory.Item.Board",
21*0d7702c0SZhenwei Chen         "xyz.openbmc_project.Inventory.Item.Chassis"};
22*0d7702c0SZhenwei Chen 
23*0d7702c0SZhenwei Chen     auto respHandler =
24*0d7702c0SZhenwei Chen         [callback{std::forward<Callback>(callback)}, asyncResp,
25*0d7702c0SZhenwei Chen          chassisId](const boost::system::error_code ec,
26*0d7702c0SZhenwei Chen                     const dbus::utility::MapperGetSubTreePathsResponse&
27*0d7702c0SZhenwei Chen                         chassisPaths) mutable {
28*0d7702c0SZhenwei Chen         BMCWEB_LOG_DEBUG << "getValidChassisPath respHandler enter";
29*0d7702c0SZhenwei Chen         if (ec)
30*0d7702c0SZhenwei Chen         {
31*0d7702c0SZhenwei Chen             BMCWEB_LOG_ERROR << "getValidChassisPath respHandler DBUS error: "
32*0d7702c0SZhenwei Chen                              << ec;
33*0d7702c0SZhenwei Chen             messages::internalError(asyncResp->res);
34*0d7702c0SZhenwei Chen             return;
35*0d7702c0SZhenwei Chen         }
36*0d7702c0SZhenwei Chen 
37*0d7702c0SZhenwei Chen         std::optional<std::string> chassisPath;
38*0d7702c0SZhenwei Chen         std::string chassisName;
39*0d7702c0SZhenwei Chen         for (const std::string& chassis : chassisPaths)
40*0d7702c0SZhenwei Chen         {
41*0d7702c0SZhenwei Chen             sdbusplus::message::object_path path(chassis);
42*0d7702c0SZhenwei Chen             chassisName = path.filename();
43*0d7702c0SZhenwei Chen             if (chassisName.empty())
44*0d7702c0SZhenwei Chen             {
45*0d7702c0SZhenwei Chen                 BMCWEB_LOG_ERROR << "Failed to find '/' in " << chassis;
46*0d7702c0SZhenwei Chen                 continue;
47*0d7702c0SZhenwei Chen             }
48*0d7702c0SZhenwei Chen             if (chassisName == chassisId)
49*0d7702c0SZhenwei Chen             {
50*0d7702c0SZhenwei Chen                 chassisPath = chassis;
51*0d7702c0SZhenwei Chen                 break;
52*0d7702c0SZhenwei Chen             }
53*0d7702c0SZhenwei Chen         }
54*0d7702c0SZhenwei Chen         callback(chassisPath);
55*0d7702c0SZhenwei Chen     };
56*0d7702c0SZhenwei Chen 
57*0d7702c0SZhenwei Chen     // Get the Chassis Collection
58*0d7702c0SZhenwei Chen     crow::connections::systemBus->async_method_call(
59*0d7702c0SZhenwei Chen         respHandler, "xyz.openbmc_project.ObjectMapper",
60*0d7702c0SZhenwei Chen         "/xyz/openbmc_project/object_mapper",
61*0d7702c0SZhenwei Chen         "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
62*0d7702c0SZhenwei Chen         "/xyz/openbmc_project/inventory", 0, interfaces);
63*0d7702c0SZhenwei Chen     BMCWEB_LOG_DEBUG << "checkChassisId exit";
64*0d7702c0SZhenwei Chen }
65*0d7702c0SZhenwei Chen 
66*0d7702c0SZhenwei Chen } // namespace chassis_utils
67*0d7702c0SZhenwei Chen } // namespace redfish
68