diff options
author | Zhenwei Chen <zhenweichen0207@gmail.com> | 2022-07-12 19:42:08 +0300 |
---|---|---|
committer | Ed Tanous <ed@tanous.net> | 2022-07-22 18:41:09 +0300 |
commit | 0d7702c0246c5948caf12a3e441f74952c7d0ccf (patch) | |
tree | a662c9085809f12e74950654f05df81d36154056 /redfish-core/include/utils | |
parent | cf7eba094fd41b2e5236af935a8113db387e647c (diff) | |
download | bmcweb-0d7702c0246c5948caf12a3e441f74952c7d0ccf.tar.xz |
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 <zhenweichen0207@gmail.com>
Diffstat (limited to 'redfish-core/include/utils')
-rw-r--r-- | redfish-core/include/utils/chassis_utils.hpp | 67 |
1 files changed, 67 insertions, 0 deletions
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 <async_resp.hpp> + +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 <typename Callback> +void getValidChassisPath(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const std::string& chassisId, Callback&& callback) +{ + BMCWEB_LOG_DEBUG << "checkChassisId enter"; + const std::array<const char*, 2> interfaces = { + "xyz.openbmc_project.Inventory.Item.Board", + "xyz.openbmc_project.Inventory.Item.Chassis"}; + + auto respHandler = + [callback{std::forward<Callback>(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<std::string> 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 |