xref: /openbmc/bmcweb/redfish-core/lib/thermal.hpp (revision 9d424669)
1 /*
2 // Copyright (c) 2018 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 #pragma once
17 
18 #include "sensors.hpp"
19 
20 #include <app.hpp>
21 #include <registries/privilege_registry.hpp>
22 
23 namespace redfish
24 {
25 
26 inline void requestRoutesThermal(App& app)
27 {
28     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/Thermal/")
29         .privileges(redfish::privileges::getThermal)
30         .methods(boost::beast::http::verb::get)(
31             [](const crow::Request&,
32                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
33                const std::string& chassisName) {
34                 auto thermalPaths =
35                     sensors::dbus::paths.find(sensors::node::thermal);
36                 if (thermalPaths == sensors::dbus::paths.end())
37                 {
38                     messages::internalError(asyncResp->res);
39                     return;
40                 }
41 
42                 auto sensorAsyncResp = std::make_shared<SensorsAsyncResp>(
43                     asyncResp, chassisName, thermalPaths->second,
44                     sensors::node::thermal);
45 
46                 // TODO Need to get Chassis Redundancy information.
47                 getChassisData(sensorAsyncResp);
48             });
49 
50     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/Thermal/")
51         .privileges(redfish::privileges::patchThermal)
52         .methods(boost::beast::http::verb::patch)(
53             [](const crow::Request& req,
54                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
55                const std::string& chassisName) {
56                 auto thermalPaths =
57                     sensors::dbus::paths.find(sensors::node::thermal);
58                 if (thermalPaths == sensors::dbus::paths.end())
59                 {
60                     messages::internalError(asyncResp->res);
61                     return;
62                 }
63 
64                 std::optional<std::vector<nlohmann::json>>
65                     temperatureCollections;
66                 std::optional<std::vector<nlohmann::json>> fanCollections;
67                 std::unordered_map<std::string, std::vector<nlohmann::json>>
68                     allCollections;
69 
70                 auto sensorsAsyncResp = std::make_shared<SensorsAsyncResp>(
71                     asyncResp, chassisName, thermalPaths->second,
72                     sensors::node::thermal);
73 
74                 if (!json_util::readJson(req, sensorsAsyncResp->asyncResp->res,
75                                          "Temperatures", temperatureCollections,
76                                          "Fans", fanCollections))
77                 {
78                     return;
79                 }
80                 if (!temperatureCollections && !fanCollections)
81                 {
82                     messages::resourceNotFound(sensorsAsyncResp->asyncResp->res,
83                                                "Thermal",
84                                                "Temperatures / Voltages");
85                     return;
86                 }
87                 if (temperatureCollections)
88                 {
89                     allCollections.emplace("Temperatures",
90                                            *std::move(temperatureCollections));
91                 }
92                 if (fanCollections)
93                 {
94                     allCollections.emplace("Fans", *std::move(fanCollections));
95                 }
96                 setSensorsOverride(sensorsAsyncResp, allCollections);
97             });
98 }
99 
100 } // namespace redfish
101