blob: c52f395686a51f8bfa335111b957dd663a9e49c5 [file] [log] [blame]
Xiaochao Ma29739632021-03-02 15:53:13 +08001#pragma once
2
3#include "app.hpp"
Nan Zhouce05f6c2022-11-09 21:41:18 +00004#include "logging.hpp"
Xiaochao Ma29739632021-03-02 15:53:13 +08005#include "query.hpp"
6#include "registries/privilege_registry.hpp"
7#include "utils/chassis_utils.hpp"
8#include "utils/json_utils.hpp"
9
Ed Tanousef4c65b2023-04-24 15:28:50 -070010#include <boost/url/format.hpp>
11
Nan Zhouce05f6c2022-11-09 21:41:18 +000012#include <optional>
13#include <string>
14
Xiaochao Ma29739632021-03-02 15:53:13 +080015namespace redfish
16{
17
18inline 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 {
Ed Tanous62598e32023-07-17 17:06:25 -070025 BMCWEB_LOG_WARNING("Not a valid chassis ID{}", chassisId);
Xiaochao Ma29739632021-03-02 15:53:13 +080026 messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
27 return;
28 }
George Liu1aee7512022-11-16 11:12:21 +080029
30 asyncResp->res.addHeader(
31 boost::beast::http::field::link,
32 "</redfish/v1/JsonSchemas/ThermalSubsystem/ThermalSubsystem.json>; rel=describedby");
Xiaochao Ma29739632021-03-02 15:53:13 +080033 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
Ed Tanousef4c65b2023-04-24 15:28:50 -070038 asyncResp->res.jsonValue["@odata.id"] = boost::urls::format(
39 "/redfish/v1/Chassis/{}/ThermalSubsystem", chassisId);
Xiaochao Ma29739632021-03-02 15:53:13 +080040
George Liu9516f412022-09-29 17:21:41 +080041 asyncResp->res.jsonValue["Fans"]["@odata.id"] = boost::urls::format(
42 "/redfish/v1/Chassis/{}/ThermalSubsystem/Fans", chassisId);
43
zhanghch055ae1f7f2021-03-08 19:04:35 +080044 asyncResp->res.jsonValue["ThermalMetrics"]["@odata.id"] =
45 boost::urls::format(
46 "/redfish/v1/Chassis/{}/ThermalSubsystem/ThermalMetrics",
47 chassisId);
48
Xiaochao Ma29739632021-03-02 15:53:13 +080049 asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
50 asyncResp->res.jsonValue["Status"]["Health"] = "OK";
51}
52
George Liu1aee7512022-11-16 11:12:21 +080053inline void handleThermalSubsystemCollectionHead(
Xiaochao Ma29739632021-03-02 15:53:13 +080054 App& app, const crow::Request& req,
55 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
George Liu1aee7512022-11-16 11:12:21 +080056 const std::string& chassisId)
Xiaochao Ma29739632021-03-02 15:53:13 +080057{
58 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
59 {
60 return;
61 }
George Liu1aee7512022-11-16 11:12:21 +080062
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
78inline 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 }
Xiaochao Ma29739632021-03-02 15:53:13 +080087
88 redfish::chassis_utils::getValidChassisPath(
89 asyncResp, chassisId,
90 std::bind_front(doThermalSubsystemCollection, asyncResp, chassisId));
91}
92
93inline void requestRoutesThermalSubsystem(App& app)
94{
95 BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/")
George Liu1aee7512022-11-16 11:12:21 +080096 .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/")
Xiaochao Ma29739632021-03-02 15:53:13 +0800101 .privileges(redfish::privileges::getThermalSubsystem)
102 .methods(boost::beast::http::verb::get)(std::bind_front(
103 handleThermalSubsystemCollectionGet, std::ref(app)));
104}
105
106} // namespace redfish