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