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 
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 
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 
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 
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