xref: /openbmc/bmcweb/features/redfish/include/utils/fan_utils.hpp (revision 57d41fed30c140c308155076c0642cca7c418201)
1*57d41fedSJanet Adkins // SPDX-License-Identifier: Apache-2.0
2*57d41fedSJanet Adkins // SPDX-FileCopyrightText: Copyright OpenBMC Authors
3*57d41fedSJanet Adkins #pragma once
4*57d41fedSJanet Adkins 
5*57d41fedSJanet Adkins #include "async_resp.hpp"
6*57d41fedSJanet Adkins #include "dbus_utility.hpp"
7*57d41fedSJanet Adkins #include "error_messages.hpp"
8*57d41fedSJanet Adkins #include "logging.hpp"
9*57d41fedSJanet Adkins 
10*57d41fedSJanet Adkins #include <asm-generic/errno.h>
11*57d41fedSJanet Adkins 
12*57d41fedSJanet Adkins #include <boost/system/error_code.hpp>
13*57d41fedSJanet Adkins #include <sdbusplus/message/native_types.hpp>
14*57d41fedSJanet Adkins 
15*57d41fedSJanet Adkins #include <array>
16*57d41fedSJanet Adkins #include <functional>
17*57d41fedSJanet Adkins #include <memory>
18*57d41fedSJanet Adkins #include <string>
19*57d41fedSJanet Adkins #include <string_view>
20*57d41fedSJanet Adkins 
21*57d41fedSJanet Adkins namespace redfish
22*57d41fedSJanet Adkins {
23*57d41fedSJanet Adkins constexpr std::array<std::string_view, 1> fanInterface = {
24*57d41fedSJanet Adkins     "xyz.openbmc_project.Inventory.Item.Fan"};
25*57d41fedSJanet Adkins 
26*57d41fedSJanet Adkins namespace fan_utils
27*57d41fedSJanet Adkins {
28*57d41fedSJanet Adkins inline void getFanPaths(
29*57d41fedSJanet Adkins     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
30*57d41fedSJanet Adkins     const std::string& validChassisPath,
31*57d41fedSJanet Adkins     const std::function<void(const dbus::utility::MapperGetSubTreePathsResponse&
32*57d41fedSJanet Adkins                                  fanPaths)>& callback)
33*57d41fedSJanet Adkins {
34*57d41fedSJanet Adkins     sdbusplus::message::object_path endpointPath{validChassisPath};
35*57d41fedSJanet Adkins     endpointPath /= "cooled_by";
36*57d41fedSJanet Adkins 
37*57d41fedSJanet Adkins     dbus::utility::getAssociatedSubTreePaths(
38*57d41fedSJanet Adkins         endpointPath,
39*57d41fedSJanet Adkins         sdbusplus::message::object_path("/xyz/openbmc_project/inventory"), 0,
40*57d41fedSJanet Adkins         fanInterface,
41*57d41fedSJanet Adkins         [asyncResp, callback](
42*57d41fedSJanet Adkins             const boost::system::error_code& ec,
43*57d41fedSJanet Adkins             const dbus::utility::MapperGetSubTreePathsResponse& subtreePaths) {
44*57d41fedSJanet Adkins             if (ec)
45*57d41fedSJanet Adkins             {
46*57d41fedSJanet Adkins                 if (ec.value() != EBADR)
47*57d41fedSJanet Adkins                 {
48*57d41fedSJanet Adkins                     BMCWEB_LOG_ERROR(
49*57d41fedSJanet Adkins                         "DBUS response error for getAssociatedSubTreePaths {}",
50*57d41fedSJanet Adkins                         ec.value());
51*57d41fedSJanet Adkins                     messages::internalError(asyncResp->res);
52*57d41fedSJanet Adkins                 }
53*57d41fedSJanet Adkins                 return;
54*57d41fedSJanet Adkins             }
55*57d41fedSJanet Adkins             callback(subtreePaths);
56*57d41fedSJanet Adkins         });
57*57d41fedSJanet Adkins }
58*57d41fedSJanet Adkins 
59*57d41fedSJanet Adkins } // namespace fan_utils
60*57d41fedSJanet Adkins } // namespace redfish
61