blob: 266bda2fef1b0b06ec21cbe1773ddb0e36409af4 [file] [log] [blame]
George Liua7210022022-10-05 15:44:11 +08001#pragma once
2
3#include "app.hpp"
4#include "dbus_utility.hpp"
5#include "query.hpp"
6#include "registries/privilege_registry.hpp"
7#include "utils/chassis_utils.hpp"
8
9#include <memory>
10#include <optional>
11#include <string>
12
13namespace redfish
14{
15
16inline void updatePowerSupplyList(
17 const std::shared_ptr<bmcweb::AsyncResp>& /* asyncResp */,
18 const std::string& /* chassisId */,
19 const std::string& /* powerSupplyPath */)
20{
21 // TODO In order for the validator to pass, the Members property will be
22 // implemented on the next commit
23}
24
25inline void
26 doPowerSupplyCollection(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
27 const std::string& chassisId,
28 const std::optional<std::string>& validChassisPath)
29{
30 if (!validChassisPath)
31 {
32 messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
33 return;
34 }
35
36 asyncResp->res.addHeader(
37 boost::beast::http::field::link,
38 "</redfish/v1/JsonSchemas/PowerSupplyCollection/PowerSupplyCollection.json>; rel=describedby");
39 asyncResp->res.jsonValue["@odata.type"] =
40 "#PowerSupplyCollection.PowerSupplyCollection";
41 asyncResp->res.jsonValue["Name"] = "Power Supply Collection";
42 asyncResp->res.jsonValue["@odata.id"] =
43 crow::utility::urlFromPieces("redfish", "v1", "Chassis", chassisId,
44 "PowerSubsystem", "PowerSupplies");
45 asyncResp->res.jsonValue["Description"] =
46 "The collection of PowerSupply resource instances.";
George Liu7a2bb2c2023-04-11 10:44:33 +080047 asyncResp->res.jsonValue["Members"] = nlohmann::json::array();
48 asyncResp->res.jsonValue["Members@odata.count"] = 0;
George Liua7210022022-10-05 15:44:11 +080049
50 std::string powerPath = *validChassisPath + "/powered_by";
51 dbus::utility::getAssociationEndPoints(
52 powerPath, [asyncResp, chassisId](
53 const boost::system::error_code& ec,
54 const dbus::utility::MapperEndPoints& endpoints) {
55 if (ec)
56 {
57 if (ec.value() != EBADR)
58 {
59 BMCWEB_LOG_ERROR << "DBUS response error" << ec.value();
60 messages::internalError(asyncResp->res);
61 }
62 return;
63 }
64
65 for (const auto& endpoint : endpoints)
66 {
67 updatePowerSupplyList(asyncResp, chassisId, endpoint);
68 }
69 });
70}
71
72inline void handlePowerSupplyCollectionHead(
73 App& app, const crow::Request& req,
74 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
75 const std::string& chassisId)
76{
77 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
78 {
79 return;
80 }
81
82 redfish::chassis_utils::getValidChassisPath(
83 asyncResp, chassisId,
84 [asyncResp,
85 chassisId](const std::optional<std::string>& validChassisPath) {
86 if (!validChassisPath)
87 {
88 messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
89 return;
90 }
91 asyncResp->res.addHeader(
92 boost::beast::http::field::link,
93 "</redfish/v1/JsonSchemas/PowerSupplyCollection/PowerSupplyCollection.json>; rel=describedby");
94 });
95}
96
97inline void handlePowerSupplyCollectionGet(
98 App& app, const crow::Request& req,
99 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
100 const std::string& chassisId)
101{
102 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
103 {
104 return;
105 }
106
107 redfish::chassis_utils::getValidChassisPath(
108 asyncResp, chassisId,
109 std::bind_front(doPowerSupplyCollection, asyncResp, chassisId));
110}
111
112inline void requestRoutesPowerSupplyCollection(App& app)
113{
114 BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/PowerSubsystem/PowerSupplies/")
115 .privileges(redfish::privileges::headPowerSupplyCollection)
116 .methods(boost::beast::http::verb::head)(
117 std::bind_front(handlePowerSupplyCollectionHead, std::ref(app)));
118
119 BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/PowerSubsystem/PowerSupplies/")
120 .privileges(redfish::privileges::getPowerSupplyCollection)
121 .methods(boost::beast::http::verb::get)(
122 std::bind_front(handlePowerSupplyCollectionGet, std::ref(app)));
123}
124
125} // namespace redfish