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