summaryrefslogtreecommitdiff
path: root/redfish-core/lib/power.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'redfish-core/lib/power.hpp')
-rw-r--r--redfish-core/lib/power.hpp163
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)