From 0d7702c0246c5948caf12a3e441f74952c7d0ccf Mon Sep 17 00:00:00 2001 From: Zhenwei Chen Date: Tue, 12 Jul 2022 16:42:08 +0000 Subject: Refactor getValidChassisPath getValidChassisPath shouldn't rely on SensorAsyncResp object. Move it to utils to wider use. Tested: Redfish service Validator passed. Change-Id: I418b7f0f3846fd001392536e2943f062b1bdb5cd Signed-off-by: Zhenwei Chen --- redfish-core/include/utils/chassis_utils.hpp | 67 ++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 redfish-core/include/utils/chassis_utils.hpp (limited to 'redfish-core/include/utils') diff --git a/redfish-core/include/utils/chassis_utils.hpp b/redfish-core/include/utils/chassis_utils.hpp new file mode 100644 index 0000000000..0acbf33b7a --- /dev/null +++ b/redfish-core/include/utils/chassis_utils.hpp @@ -0,0 +1,67 @@ +#pragma once +#include + +namespace redfish +{ + +namespace chassis_utils +{ +/** + * @brief Retrieves valid chassis path + * @param asyncResp Pointer to object holding response data + * @param callback Callback for next step to get valid chassis path + */ +template +void getValidChassisPath(const std::shared_ptr& asyncResp, + const std::string& chassisId, Callback&& callback) +{ + BMCWEB_LOG_DEBUG << "checkChassisId enter"; + const std::array interfaces = { + "xyz.openbmc_project.Inventory.Item.Board", + "xyz.openbmc_project.Inventory.Item.Chassis"}; + + auto respHandler = + [callback{std::forward(callback)}, asyncResp, + chassisId](const boost::system::error_code ec, + const dbus::utility::MapperGetSubTreePathsResponse& + chassisPaths) mutable { + BMCWEB_LOG_DEBUG << "getValidChassisPath respHandler enter"; + if (ec) + { + BMCWEB_LOG_ERROR << "getValidChassisPath respHandler DBUS error: " + << ec; + messages::internalError(asyncResp->res); + return; + } + + std::optional chassisPath; + std::string chassisName; + for (const std::string& chassis : chassisPaths) + { + sdbusplus::message::object_path path(chassis); + chassisName = path.filename(); + if (chassisName.empty()) + { + BMCWEB_LOG_ERROR << "Failed to find '/' in " << chassis; + continue; + } + if (chassisName == chassisId) + { + chassisPath = chassis; + break; + } + } + callback(chassisPath); + }; + + // Get the Chassis Collection + crow::connections::systemBus->async_method_call( + respHandler, "xyz.openbmc_project.ObjectMapper", + "/xyz/openbmc_project/object_mapper", + "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", + "/xyz/openbmc_project/inventory", 0, interfaces); + BMCWEB_LOG_DEBUG << "checkChassisId exit"; +} + +} // namespace chassis_utils +} // namespace redfish -- cgit v1.2.3