xref: /openbmc/bmcweb/features/redfish/lib/thermal_metrics.hpp (revision bd79bce8c3f1deb1fb2773868b9ece25233cf27b)
15ae1f7f3Szhanghch05 #pragma once
25ae1f7f3Szhanghch05 
35ae1f7f3Szhanghch05 #include "app.hpp"
45ae1f7f3Szhanghch05 #include "query.hpp"
55ae1f7f3Szhanghch05 #include "registries/privilege_registry.hpp"
65ae1f7f3Szhanghch05 #include "utils/chassis_utils.hpp"
75ae1f7f3Szhanghch05 
85ae1f7f3Szhanghch05 #include <functional>
95ae1f7f3Szhanghch05 #include <memory>
105ae1f7f3Szhanghch05 #include <optional>
115ae1f7f3Szhanghch05 #include <string>
125ae1f7f3Szhanghch05 
135ae1f7f3Szhanghch05 namespace redfish
145ae1f7f3Szhanghch05 {
155ae1f7f3Szhanghch05 inline void
165ae1f7f3Szhanghch05     doThermalMetrics(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
175ae1f7f3Szhanghch05                      const std::string& chassisId,
185ae1f7f3Szhanghch05                      const std::optional<std::string>& validChassisPath)
195ae1f7f3Szhanghch05 {
205ae1f7f3Szhanghch05     if (!validChassisPath)
215ae1f7f3Szhanghch05     {
225ae1f7f3Szhanghch05         messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
235ae1f7f3Szhanghch05         return;
245ae1f7f3Szhanghch05     }
255ae1f7f3Szhanghch05 
265ae1f7f3Szhanghch05     asyncResp->res.addHeader(
275ae1f7f3Szhanghch05         boost::beast::http::field::link,
285ae1f7f3Szhanghch05         "</redfish/v1/JsonSchemas/ThermalMetrics/ThermalMetrics.json>; rel=describedby");
295ae1f7f3Szhanghch05     asyncResp->res.jsonValue["@odata.type"] =
305ae1f7f3Szhanghch05         "#ThermalMetrics.v1_0_1.ThermalMetrics";
315ae1f7f3Szhanghch05     asyncResp->res.jsonValue["@odata.id"] = boost::urls::format(
325ae1f7f3Szhanghch05         "/redfish/v1/Chassis/{}/ThermalSubsystem/ThermalMetrics", chassisId);
335ae1f7f3Szhanghch05     asyncResp->res.jsonValue["Id"] = "ThermalMetrics";
345ae1f7f3Szhanghch05     asyncResp->res.jsonValue["Name"] = "Thermal Metrics";
355ae1f7f3Szhanghch05 }
365ae1f7f3Szhanghch05 
375ae1f7f3Szhanghch05 inline void handleThermalMetricsHead(
385ae1f7f3Szhanghch05     App& app, const crow::Request& req,
395ae1f7f3Szhanghch05     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
405ae1f7f3Szhanghch05     const std::string& chassisId)
415ae1f7f3Szhanghch05 {
425ae1f7f3Szhanghch05     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
435ae1f7f3Szhanghch05     {
445ae1f7f3Szhanghch05         return;
455ae1f7f3Szhanghch05     }
465ae1f7f3Szhanghch05 
475ae1f7f3Szhanghch05     redfish::chassis_utils::getValidChassisPath(
485ae1f7f3Szhanghch05         asyncResp, chassisId,
495ae1f7f3Szhanghch05         [asyncResp,
505ae1f7f3Szhanghch05          chassisId](const std::optional<std::string>& validChassisPath) {
515ae1f7f3Szhanghch05             if (!validChassisPath)
525ae1f7f3Szhanghch05             {
53*bd79bce8SPatrick Williams                 messages::resourceNotFound(asyncResp->res, "Chassis",
54*bd79bce8SPatrick Williams                                            chassisId);
555ae1f7f3Szhanghch05                 return;
565ae1f7f3Szhanghch05             }
575ae1f7f3Szhanghch05             asyncResp->res.addHeader(
585ae1f7f3Szhanghch05                 boost::beast::http::field::link,
595ae1f7f3Szhanghch05                 "</redfish/v1/JsonSchemas/ThermalMetrics/ThermalMetrics.json>; rel=describedby");
605ae1f7f3Szhanghch05         });
615ae1f7f3Szhanghch05 }
625ae1f7f3Szhanghch05 
635ae1f7f3Szhanghch05 inline void
645ae1f7f3Szhanghch05     handleThermalMetricsGet(App& app, const crow::Request& req,
655ae1f7f3Szhanghch05                             const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
665ae1f7f3Szhanghch05                             const std::string& chassisId)
675ae1f7f3Szhanghch05 {
685ae1f7f3Szhanghch05     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
695ae1f7f3Szhanghch05     {
705ae1f7f3Szhanghch05         return;
715ae1f7f3Szhanghch05     }
725ae1f7f3Szhanghch05 
735ae1f7f3Szhanghch05     redfish::chassis_utils::getValidChassisPath(
745ae1f7f3Szhanghch05         asyncResp, chassisId,
755ae1f7f3Szhanghch05         std::bind_front(doThermalMetrics, asyncResp, chassisId));
765ae1f7f3Szhanghch05 }
775ae1f7f3Szhanghch05 
785ae1f7f3Szhanghch05 inline void requestRoutesThermalMetrics(App& app)
795ae1f7f3Szhanghch05 {
805ae1f7f3Szhanghch05     BMCWEB_ROUTE(app,
815ae1f7f3Szhanghch05                  "/redfish/v1/Chassis/<str>/ThermalSubsystem/ThermalMetrics/")
825ae1f7f3Szhanghch05         .privileges(redfish::privileges::headThermalMetrics)
835ae1f7f3Szhanghch05         .methods(boost::beast::http::verb::head)(
845ae1f7f3Szhanghch05             std::bind_front(handleThermalMetricsHead, std::ref(app)));
855ae1f7f3Szhanghch05 
865ae1f7f3Szhanghch05     BMCWEB_ROUTE(app,
875ae1f7f3Szhanghch05                  "/redfish/v1/Chassis/<str>/ThermalSubsystem/ThermalMetrics/")
885ae1f7f3Szhanghch05         .privileges(redfish::privileges::getThermalMetrics)
895ae1f7f3Szhanghch05         .methods(boost::beast::http::verb::get)(
905ae1f7f3Szhanghch05             std::bind_front(handleThermalMetricsGet, std::ref(app)));
915ae1f7f3Szhanghch05 }
925ae1f7f3Szhanghch05 } // namespace redfish
93