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