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