xref: /openbmc/bmcweb/redfish-core/lib/power_subsystem.hpp (revision 40e9b92ec19acffb46f83a6e55b18974da5d708e)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors
3 #pragma once
4 
5 #include "app.hpp"
6 #include "generated/enums/resource.hpp"
7 #include "logging.hpp"
8 #include "query.hpp"
9 #include "registries/privilege_registry.hpp"
10 #include "utils/chassis_utils.hpp"
11 
12 #include <boost/url/format.hpp>
13 
14 #include <memory>
15 #include <optional>
16 #include <string>
17 
18 namespace redfish
19 {
20 
doPowerSubsystemCollection(const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId,const std::optional<std::string> & validChassisPath)21 inline void doPowerSubsystemCollection(
22     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
23     const std::string& chassisId,
24     const std::optional<std::string>& validChassisPath)
25 {
26     if (!validChassisPath)
27     {
28         messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
29         return;
30     }
31 
32     asyncResp->res.addHeader(
33         boost::beast::http::field::link,
34         "</redfish/v1/JsonSchemas/PowerSubsystem/PowerSubsystem.json>; rel=describedby");
35     asyncResp->res.jsonValue["@odata.type"] =
36         "#PowerSubsystem.v1_1_0.PowerSubsystem";
37     asyncResp->res.jsonValue["Name"] = "Power Subsystem";
38     asyncResp->res.jsonValue["Id"] = "PowerSubsystem";
39     asyncResp->res.jsonValue["@odata.id"] =
40         boost::urls::format("/redfish/v1/Chassis/{}/PowerSubsystem", chassisId);
41     asyncResp->res.jsonValue["Status"]["State"] = resource::State::Enabled;
42     asyncResp->res.jsonValue["Status"]["Health"] = resource::Health::OK;
43     asyncResp->res.jsonValue["PowerSupplies"]["@odata.id"] =
44         boost::urls::format(
45             "/redfish/v1/Chassis/{}/PowerSubsystem/PowerSupplies", chassisId);
46 }
47 
handlePowerSubsystemCollectionHead(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId)48 inline void handlePowerSubsystemCollectionHead(
49     App& app, const crow::Request& req,
50     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
51     const std::string& chassisId)
52 {
53     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
54     {
55         return;
56     }
57 
58     auto respHandler = [asyncResp, chassisId](
59                            const std::optional<std::string>& validChassisPath) {
60         if (!validChassisPath)
61         {
62             messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
63             return;
64         }
65         asyncResp->res.addHeader(
66             boost::beast::http::field::link,
67             "</redfish/v1/JsonSchemas/PowerSubsystem/PowerSubsystem.json>; rel=describedby");
68     };
69     redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
70                                                 std::move(respHandler));
71 }
72 
handlePowerSubsystemCollectionGet(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId)73 inline void handlePowerSubsystemCollectionGet(
74     App& app, const crow::Request& req,
75     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
76     const std::string& chassisId)
77 {
78     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
79     {
80         return;
81     }
82 
83     redfish::chassis_utils::getValidChassisPath(
84         asyncResp, chassisId,
85         std::bind_front(doPowerSubsystemCollection, asyncResp, chassisId));
86 }
87 
requestRoutesPowerSubsystem(App & app)88 inline void requestRoutesPowerSubsystem(App& app)
89 {
90     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/PowerSubsystem/")
91         .privileges(redfish::privileges::headPowerSubsystem)
92         .methods(boost::beast::http::verb::head)(
93             std::bind_front(handlePowerSubsystemCollectionHead, std::ref(app)));
94 
95     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/PowerSubsystem/")
96         .privileges(redfish::privileges::getPowerSubsystem)
97         .methods(boost::beast::http::verb::get)(
98             std::bind_front(handlePowerSubsystemCollectionGet, std::ref(app)));
99 }
100 
101 } // namespace redfish
102