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 "node.hpp" 19 #include "sensors.hpp" 20 21 namespace redfish 22 { 23 24 class Thermal : public Node 25 { 26 public: 27 Thermal(App& app) : 28 Node((app), "/redfish/v1/Chassis/<str>/Thermal/", std::string()) 29 { 30 entityPrivileges = { 31 {boost::beast::http::verb::get, {{"Login"}}}, 32 {boost::beast::http::verb::head, {{"Login"}}}, 33 {boost::beast::http::verb::patch, {{"ConfigureManager"}}}, 34 {boost::beast::http::verb::put, {{"ConfigureManager"}}}, 35 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}}, 36 {boost::beast::http::verb::post, {{"ConfigureManager"}}}}; 37 } 38 39 private: 40 void doGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 41 const crow::Request&, 42 const std::vector<std::string>& params) override 43 { 44 if (params.size() != 1) 45 { 46 messages::internalError(asyncResp->res); 47 48 return; 49 } 50 51 auto thermalPaths = sensors::dbus::paths.find(sensors::node::thermal); 52 if (thermalPaths == sensors::dbus::paths.end()) 53 { 54 messages::internalError(asyncResp->res); 55 return; 56 } 57 58 const std::string& chassisName = params[0]; 59 auto sensorAsyncResp = std::make_shared<SensorsAsyncResp>( 60 asyncResp, chassisName, thermalPaths->second, 61 sensors::node::thermal); 62 63 // TODO Need to get Chassis Redundancy information. 64 getChassisData(sensorAsyncResp); 65 } 66 void doPatch(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 67 const crow::Request& req, 68 const std::vector<std::string>& params) override 69 { 70 if (params.size() != 1) 71 { 72 73 messages::internalError(asyncResp->res); 74 return; 75 } 76 77 auto thermalPaths = sensors::dbus::paths.find(sensors::node::thermal); 78 if (thermalPaths == sensors::dbus::paths.end()) 79 { 80 messages::internalError(asyncResp->res); 81 return; 82 } 83 84 const std::string& chassisName = params[0]; 85 std::optional<std::vector<nlohmann::json>> temperatureCollections; 86 std::optional<std::vector<nlohmann::json>> fanCollections; 87 std::unordered_map<std::string, std::vector<nlohmann::json>> 88 allCollections; 89 90 auto sensorsAsyncResp = std::make_shared<SensorsAsyncResp>( 91 asyncResp, chassisName, thermalPaths->second, 92 sensors::node::thermal); 93 94 if (!json_util::readJson(req, sensorsAsyncResp->asyncResp->res, 95 "Temperatures", temperatureCollections, "Fans", 96 fanCollections)) 97 { 98 return; 99 } 100 if (!temperatureCollections && !fanCollections) 101 { 102 messages::resourceNotFound(sensorsAsyncResp->asyncResp->res, 103 "Thermal", "Temperatures / Voltages"); 104 return; 105 } 106 if (temperatureCollections) 107 { 108 allCollections.emplace("Temperatures", 109 *std::move(temperatureCollections)); 110 } 111 if (fanCollections) 112 { 113 allCollections.emplace("Fans", *std::move(fanCollections)); 114 } 115 116 checkAndDoSensorsOverride(sensorsAsyncResp, allCollections); 117 } 118 }; 119 120 } // namespace redfish 121