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