1 #pragma once
2
3 #include "app.hpp"
4 #include "logging.hpp"
5 #include "query.hpp"
6 #include "registries/privilege_registry.hpp"
7 #include "utils/chassis_utils.hpp"
8 #include "utils/json_utils.hpp"
9
10 #include <boost/url/format.hpp>
11
12 #include <optional>
13 #include <string>
14
15 namespace redfish
16 {
17
doThermalSubsystemCollection(const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId,const std::optional<std::string> & validChassisPath)18 inline void doThermalSubsystemCollection(
19 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
20 const std::string& chassisId,
21 const std::optional<std::string>& validChassisPath)
22 {
23 if (!validChassisPath)
24 {
25 BMCWEB_LOG_WARNING("Not a valid chassis ID{}", chassisId);
26 messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
27 return;
28 }
29
30 asyncResp->res.addHeader(
31 boost::beast::http::field::link,
32 "</redfish/v1/JsonSchemas/ThermalSubsystem/ThermalSubsystem.json>; rel=describedby");
33 asyncResp->res.jsonValue["@odata.type"] =
34 "#ThermalSubsystem.v1_0_0.ThermalSubsystem";
35 asyncResp->res.jsonValue["Name"] = "Thermal Subsystem";
36 asyncResp->res.jsonValue["Id"] = "ThermalSubsystem";
37
38 asyncResp->res.jsonValue["@odata.id"] = boost::urls::format(
39 "/redfish/v1/Chassis/{}/ThermalSubsystem", chassisId);
40
41 asyncResp->res.jsonValue["Fans"]["@odata.id"] = boost::urls::format(
42 "/redfish/v1/Chassis/{}/ThermalSubsystem/Fans", chassisId);
43
44 asyncResp->res.jsonValue["ThermalMetrics"]["@odata.id"] =
45 boost::urls::format(
46 "/redfish/v1/Chassis/{}/ThermalSubsystem/ThermalMetrics",
47 chassisId);
48
49 asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
50 asyncResp->res.jsonValue["Status"]["Health"] = "OK";
51 }
52
handleThermalSubsystemCollectionHead(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId)53 inline void handleThermalSubsystemCollectionHead(
54 App& app, const crow::Request& req,
55 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
56 const std::string& chassisId)
57 {
58 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
59 {
60 return;
61 }
62
63 auto respHandler = [asyncResp, chassisId](
64 const std::optional<std::string>& validChassisPath) {
65 if (!validChassisPath)
66 {
67 messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
68 return;
69 }
70 asyncResp->res.addHeader(
71 boost::beast::http::field::link,
72 "</redfish/v1/JsonSchemas/ThermalSubsystem/ThermalSubsystem.json>; rel=describedby");
73 };
74 redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
75 std::bind_front(respHandler));
76 }
77
handleThermalSubsystemCollectionGet(App & app,const crow::Request & req,const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & chassisId)78 inline void handleThermalSubsystemCollectionGet(
79 App& app, const crow::Request& req,
80 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
81 const std::string& chassisId)
82 {
83 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
84 {
85 return;
86 }
87
88 redfish::chassis_utils::getValidChassisPath(
89 asyncResp, chassisId,
90 std::bind_front(doThermalSubsystemCollection, asyncResp, chassisId));
91 }
92
requestRoutesThermalSubsystem(App & app)93 inline void requestRoutesThermalSubsystem(App& app)
94 {
95 BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
96 .privileges(redfish::privileges::headThermalSubsystem)
97 .methods(boost::beast::http::verb::head)(std::bind_front(
98 handleThermalSubsystemCollectionHead, std::ref(app)));
99
100 BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
101 .privileges(redfish::privileges::getThermalSubsystem)
102 .methods(boost::beast::http::verb::get)(std::bind_front(
103 handleThermalSubsystemCollectionGet, std::ref(app)));
104 }
105
106 } // namespace redfish
107