diff options
Diffstat (limited to 'redfish-core/lib/power.hpp')
-rw-r--r-- | redfish-core/lib/power.hpp | 163 |
1 files changed, 80 insertions, 83 deletions
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp index bf332502c1..d7fb7dd9be 100644 --- a/redfish-core/lib/power.hpp +++ b/redfish-core/lib/power.hpp @@ -27,102 +27,99 @@ inline void setPowerCapOverride( const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp, std::vector<nlohmann::json>& powerControlCollections) { - auto getChassisPath = - [sensorsAsyncResp, powerControlCollections]( - const std::optional<std::string>& chassisPath) mutable { - if (!chassisPath) + auto getChassisPath = [sensorsAsyncResp, powerControlCollections]( + const std::optional<std::string>& + chassisPath) mutable { + if (!chassisPath) + { + BMCWEB_LOG_ERROR << "Don't find valid chassis path "; + messages::resourceNotFound(sensorsAsyncResp->asyncResp->res, + "Chassis", sensorsAsyncResp->chassisId); + return; + } + + if (powerControlCollections.size() != 1) + { + BMCWEB_LOG_ERROR << "Don't support multiple hosts at present "; + messages::resourceNotFound(sensorsAsyncResp->asyncResp->res, + "Power", "PowerControl"); + return; + } + + auto& item = powerControlCollections[0]; + + std::optional<nlohmann::json> powerLimit; + if (!json_util::readJson(item, sensorsAsyncResp->asyncResp->res, + "PowerLimit", powerLimit)) + { + return; + } + if (!powerLimit) + { + return; + } + std::optional<uint32_t> value; + if (!json_util::readJson(*powerLimit, sensorsAsyncResp->asyncResp->res, + "LimitInWatts", value)) + { + return; + } + if (!value) + { + return; + } + auto valueHandler = [value, sensorsAsyncResp]( + const boost::system::error_code ec, + const SensorVariant& powerCapEnable) { + if (ec) { - BMCWEB_LOG_ERROR << "Don't find valid chassis path "; - messages::resourceNotFound(sensorsAsyncResp->asyncResp->res, - "Chassis", - sensorsAsyncResp->chassisId); + messages::internalError(sensorsAsyncResp->asyncResp->res); + BMCWEB_LOG_ERROR << "powerCapEnable Get handler: Dbus error " + << ec; return; } - - if (powerControlCollections.size() != 1) - { - BMCWEB_LOG_ERROR << "Don't support multiple hosts at present "; - messages::resourceNotFound(sensorsAsyncResp->asyncResp->res, - "Power", "PowerControl"); - return; - } - - auto& item = powerControlCollections[0]; - - std::optional<nlohmann::json> powerLimit; - if (!json_util::readJson(item, sensorsAsyncResp->asyncResp->res, - "PowerLimit", powerLimit)) + // Check PowerCapEnable + const bool* b = std::get_if<bool>(&powerCapEnable); + if (b == nullptr) { + messages::internalError(sensorsAsyncResp->asyncResp->res); + BMCWEB_LOG_ERROR << "Fail to get PowerCapEnable status "; return; } - if (!powerLimit) + if (!(*b)) { + messages::actionNotSupported( + sensorsAsyncResp->asyncResp->res, + "Setting LimitInWatts when PowerLimit feature is disabled"); + BMCWEB_LOG_ERROR << "PowerLimit feature is disabled "; return; } - std::optional<uint32_t> value; - if (!json_util::readJson(*powerLimit, - sensorsAsyncResp->asyncResp->res, - "LimitInWatts", value)) - { - return; - } - if (!value) - { - return; - } - auto valueHandler = [value, sensorsAsyncResp]( - const boost::system::error_code ec, - const SensorVariant& powerCapEnable) { - if (ec) - { - messages::internalError(sensorsAsyncResp->asyncResp->res); - BMCWEB_LOG_ERROR - << "powerCapEnable Get handler: Dbus error " << ec; - return; - } - // Check PowerCapEnable - const bool* b = std::get_if<bool>(&powerCapEnable); - if (b == nullptr) - { - messages::internalError(sensorsAsyncResp->asyncResp->res); - BMCWEB_LOG_ERROR << "Fail to get PowerCapEnable status "; - return; - } - if (!(*b)) - { - messages::actionNotSupported( - sensorsAsyncResp->asyncResp->res, - "Setting LimitInWatts when PowerLimit " - "feature is disabled"); - BMCWEB_LOG_ERROR << "PowerLimit feature is disabled "; - return; - } - crow::connections::systemBus->async_method_call( - [sensorsAsyncResp](const boost::system::error_code ec2) { - if (ec2) - { - BMCWEB_LOG_DEBUG << "Power Limit Set: Dbus error: " - << ec2; - messages::internalError( - sensorsAsyncResp->asyncResp->res); - return; - } - sensorsAsyncResp->asyncResp->res.result( - boost::beast::http::status::no_content); - }, - "xyz.openbmc_project.Settings", - "/xyz/openbmc_project/control/host0/power_cap", - "org.freedesktop.DBus.Properties", "Set", - "xyz.openbmc_project.Control.Power.Cap", "PowerCap", - std::variant<uint32_t>(*value)); - }; crow::connections::systemBus->async_method_call( - std::move(valueHandler), "xyz.openbmc_project.Settings", + [sensorsAsyncResp](const boost::system::error_code ec2) { + if (ec2) + { + BMCWEB_LOG_DEBUG << "Power Limit Set: Dbus error: " + << ec2; + messages::internalError( + sensorsAsyncResp->asyncResp->res); + return; + } + sensorsAsyncResp->asyncResp->res.result( + boost::beast::http::status::no_content); + }, + "xyz.openbmc_project.Settings", "/xyz/openbmc_project/control/host0/power_cap", - "org.freedesktop.DBus.Properties", "Get", - "xyz.openbmc_project.Control.Power.Cap", "PowerCapEnable"); + "org.freedesktop.DBus.Properties", "Set", + "xyz.openbmc_project.Control.Power.Cap", "PowerCap", + std::variant<uint32_t>(*value)); }; + crow::connections::systemBus->async_method_call( + std::move(valueHandler), "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/power_cap", + "org.freedesktop.DBus.Properties", "Get", + "xyz.openbmc_project.Control.Power.Cap", "PowerCapEnable"); + }; getValidChassisPath(sensorsAsyncResp, std::move(getChassisPath)); } inline void requestRoutesPower(App& app) |