xref: /openbmc/bmcweb/features/redfish/lib/environment_metrics.hpp (revision d78572018fc2022091ff8b8eb5a7fef2172ba3d6)
140e9b92eSEd Tanous // SPDX-License-Identifier: Apache-2.0
240e9b92eSEd Tanous // SPDX-FileCopyrightText: Copyright OpenBMC Authors
34ca3ec3cSAlbert Zhang #pragma once
44ca3ec3cSAlbert Zhang 
54ca3ec3cSAlbert Zhang #include "app.hpp"
6*d7857201SEd Tanous #include "async_resp.hpp"
7*d7857201SEd Tanous #include "error_messages.hpp"
8*d7857201SEd Tanous #include "http_request.hpp"
93ccb3adbSEd Tanous #include "query.hpp"
103ccb3adbSEd Tanous #include "registries/privilege_registry.hpp"
114ca3ec3cSAlbert Zhang #include "utils/chassis_utils.hpp"
124ca3ec3cSAlbert Zhang 
13*d7857201SEd Tanous #include <boost/beast/http/field.hpp>
14*d7857201SEd Tanous #include <boost/beast/http/verb.hpp>
15ef4c65b7SEd Tanous #include <boost/url/format.hpp>
16ef4c65b7SEd Tanous 
17*d7857201SEd Tanous #include <functional>
184ca3ec3cSAlbert Zhang #include <memory>
194ca3ec3cSAlbert Zhang #include <optional>
204ca3ec3cSAlbert Zhang #include <string>
21*d7857201SEd Tanous #include <utility>
224ca3ec3cSAlbert Zhang 
234ca3ec3cSAlbert Zhang namespace redfish
244ca3ec3cSAlbert Zhang {
254ca3ec3cSAlbert Zhang 
264ca3ec3cSAlbert Zhang inline void handleEnvironmentMetricsHead(
274ca3ec3cSAlbert Zhang     App& app, const crow::Request& req,
284ca3ec3cSAlbert Zhang     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
294ca3ec3cSAlbert Zhang     const std::string& chassisId)
304ca3ec3cSAlbert Zhang {
314ca3ec3cSAlbert Zhang     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
324ca3ec3cSAlbert Zhang     {
334ca3ec3cSAlbert Zhang         return;
344ca3ec3cSAlbert Zhang     }
354ca3ec3cSAlbert Zhang 
364ca3ec3cSAlbert Zhang     auto respHandler = [asyncResp, chassisId](
374ca3ec3cSAlbert Zhang                            const std::optional<std::string>& validChassisPath) {
384ca3ec3cSAlbert Zhang         if (!validChassisPath)
394ca3ec3cSAlbert Zhang         {
404ca3ec3cSAlbert Zhang             messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
414ca3ec3cSAlbert Zhang             return;
424ca3ec3cSAlbert Zhang         }
434ca3ec3cSAlbert Zhang 
444ca3ec3cSAlbert Zhang         asyncResp->res.addHeader(
454ca3ec3cSAlbert Zhang             boost::beast::http::field::link,
464ca3ec3cSAlbert Zhang             "</redfish/v1/JsonSchemas/EnvironmentMetrics/EnvironmentMetrics.json>; rel=describedby");
474ca3ec3cSAlbert Zhang     };
484ca3ec3cSAlbert Zhang 
494ca3ec3cSAlbert Zhang     redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
504ca3ec3cSAlbert Zhang                                                 std::move(respHandler));
514ca3ec3cSAlbert Zhang }
524ca3ec3cSAlbert Zhang 
534ca3ec3cSAlbert Zhang inline void handleEnvironmentMetricsGet(
544ca3ec3cSAlbert Zhang     App& app, const crow::Request& req,
554ca3ec3cSAlbert Zhang     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
564ca3ec3cSAlbert Zhang     const std::string& chassisId)
574ca3ec3cSAlbert Zhang {
584ca3ec3cSAlbert Zhang     if (!redfish::setUpRedfishRoute(app, req, asyncResp))
594ca3ec3cSAlbert Zhang     {
604ca3ec3cSAlbert Zhang         return;
614ca3ec3cSAlbert Zhang     }
624ca3ec3cSAlbert Zhang 
634ca3ec3cSAlbert Zhang     auto respHandler = [asyncResp, chassisId](
644ca3ec3cSAlbert Zhang                            const std::optional<std::string>& validChassisPath) {
654ca3ec3cSAlbert Zhang         if (!validChassisPath)
664ca3ec3cSAlbert Zhang         {
674ca3ec3cSAlbert Zhang             messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
684ca3ec3cSAlbert Zhang             return;
694ca3ec3cSAlbert Zhang         }
704ca3ec3cSAlbert Zhang 
714ca3ec3cSAlbert Zhang         asyncResp->res.addHeader(
724ca3ec3cSAlbert Zhang             boost::beast::http::field::link,
734ca3ec3cSAlbert Zhang             "</redfish/v1/JsonSchemas/EnvironmentMetrics/EnvironmentMetrics.json>; rel=describedby");
744ca3ec3cSAlbert Zhang         asyncResp->res.jsonValue["@odata.type"] =
754ca3ec3cSAlbert Zhang             "#EnvironmentMetrics.v1_3_0.EnvironmentMetrics";
764ca3ec3cSAlbert Zhang         asyncResp->res.jsonValue["Name"] = "Chassis Environment Metrics";
774ca3ec3cSAlbert Zhang         asyncResp->res.jsonValue["Id"] = "EnvironmentMetrics";
78ef4c65b7SEd Tanous         asyncResp->res.jsonValue["@odata.id"] = boost::urls::format(
79ef4c65b7SEd Tanous             "/redfish/v1/Chassis/{}/EnvironmentMetrics", chassisId);
804ca3ec3cSAlbert Zhang     };
814ca3ec3cSAlbert Zhang 
824ca3ec3cSAlbert Zhang     redfish::chassis_utils::getValidChassisPath(asyncResp, chassisId,
834ca3ec3cSAlbert Zhang                                                 std::move(respHandler));
844ca3ec3cSAlbert Zhang }
854ca3ec3cSAlbert Zhang 
864ca3ec3cSAlbert Zhang inline void requestRoutesEnvironmentMetrics(App& app)
874ca3ec3cSAlbert Zhang {
884ca3ec3cSAlbert Zhang     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/EnvironmentMetrics/")
894ca3ec3cSAlbert Zhang         .privileges(redfish::privileges::headEnvironmentMetrics)
904ca3ec3cSAlbert Zhang         .methods(boost::beast::http::verb::head)(
914ca3ec3cSAlbert Zhang             std::bind_front(handleEnvironmentMetricsHead, std::ref(app)));
924ca3ec3cSAlbert Zhang 
934ca3ec3cSAlbert Zhang     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/EnvironmentMetrics/")
944ca3ec3cSAlbert Zhang         .privileges(redfish::privileges::getEnvironmentMetrics)
954ca3ec3cSAlbert Zhang         .methods(boost::beast::http::verb::get)(
964ca3ec3cSAlbert Zhang             std::bind_front(handleEnvironmentMetricsGet, std::ref(app)));
974ca3ec3cSAlbert Zhang }
984ca3ec3cSAlbert Zhang 
994ca3ec3cSAlbert Zhang } // namespace redfish
100