Systems: Add support for new eco power modes
Add support for the following new power modes:
- Efficiency Favor Performance
- Efficiency Favor Power
- Balanced Performance
New modes were added in ComputerSystem schema to v1.22
Tested on Rainier and passed Validator
'''
GET /redfish/v1/Systems/system:
"@odata.type": "#ComputerSystem.v1_22_0.ComputerSystem",
...
"PowerMode": "EfficiencyFavorPerformance",
"PowerMode@Redfish.AllowableValues": [
"Static",
"MaximumPerformance",
"PowerSaving"
],
PATCH -d '{ "PowerMode":"BalancedPerformance"}' https://$bmc/redfish/v1/Systems/system
"PowerMode": "BalancedPerformance",
PATCH -d '{ "PowerMode":"EfficiencyFavorPerformance"}' https://$bmc/redfish/v1/Systems/system
"PowerMode": "EfficiencyFavorPerformance",
PATCH -d '{ "PowerMode":"EfficiencyFavorPower"}' https://$bmc/redfish/v1/Systems/system
"PowerMode": "EfficiencyFavorPower",
PATCH -d '{ "PowerMode":"MaximumPerformance"}' https://$bmc/redfish/v1/Systems/system
"PowerMode": "MaximumPerformance",
PATCH -d '{ "PowerMode":"NotARealMode"}' https://$bmc/redfish/v1/Systems/system
{
"PowerMode@Message.ExtendedInfo": [
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The value '\"NotARealMode\"' for the property PowerMode is not in the list of acceptable values.",
"MessageArgs": [
"\"NotARealMode\"",
"PowerMode"
],
"MessageId": "Base.1.13.0.PropertyValueNotInList",
"MessageSeverity": "Warning",
"Resolution": "Choose a value from the enumeration list that the implementation can support and resubmit the request if the operation failed."
}
]
'''
Validator Results:
'''
Type (ComputerSystem.v1_22_0.ComputerSystem), GET SUCCESS (time: 0:00:00.107269)
...
PASS
...
Elapsed time: 0:15:07
invalidPropertyValue: 62
metadataNamespaces: 4324
pass: 14323
passAction: 20
passGet: 1051
passRedfishUri: 1002
skipNoSchema: 3
skipOptional: 25582
unverifiedAdditional.complex: 21
warnDeprecated: 8
warningPresent: 83
warnings: 67
Validation has succeeded.
'''
Change-Id: I56296a524b01d64adccad2d3da1757056900b6db
Signed-off-by: Chris Cain <cjcain@us.ibm.com>
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 5f6cd87..2d62763 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -37,6 +37,7 @@
#include <boost/container/flat_map.hpp>
#include <boost/system/error_code.hpp>
#include <boost/url/format.hpp>
+#include <generated/enums/computer_system.hpp>
#include <sdbusplus/asio/property.hpp>
#include <sdbusplus/message.hpp>
#include <sdbusplus/unpack_properties.hpp>
@@ -2176,25 +2177,46 @@
translatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const std::string& modeValue)
{
+ using PowerMode = computer_system::PowerMode;
+
if (modeValue == "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static")
{
- asyncResp->res.jsonValue["PowerMode"] = "Static";
+ asyncResp->res.jsonValue["PowerMode"] = PowerMode::Static;
}
else if (
modeValue ==
"xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance")
{
- asyncResp->res.jsonValue["PowerMode"] = "MaximumPerformance";
+ asyncResp->res.jsonValue["PowerMode"] = PowerMode::MaximumPerformance;
}
else if (modeValue ==
"xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving")
{
- asyncResp->res.jsonValue["PowerMode"] = "PowerSaving";
+ asyncResp->res.jsonValue["PowerMode"] = PowerMode::PowerSaving;
+ }
+ else if (
+ modeValue ==
+ "xyz.openbmc_project.Control.Power.Mode.PowerMode.BalancedPerformance")
+ {
+ asyncResp->res.jsonValue["PowerMode"] = PowerMode::BalancedPerformance;
+ }
+ else if (
+ modeValue ==
+ "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPerformance")
+ {
+ asyncResp->res.jsonValue["PowerMode"] =
+ PowerMode::EfficiencyFavorPerformance;
+ }
+ else if (
+ modeValue ==
+ "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPower")
+ {
+ asyncResp->res.jsonValue["PowerMode"] = PowerMode::EfficiencyFavorPower;
}
else if (modeValue ==
"xyz.openbmc_project.Control.Power.Mode.PowerMode.OEM")
{
- asyncResp->res.jsonValue["PowerMode"] = "OEM";
+ asyncResp->res.jsonValue["PowerMode"] = PowerMode::OEM;
}
else
{
@@ -2288,32 +2310,48 @@
* name associated with that string
*
* @param[in] asyncResp Shared pointer for generating response message.
- * @param[in] modeString String representing the desired PowerMode
+ * @param[in] modeValue String representing the desired PowerMode
*
* @return PowerMode value or empty string if mode is not valid
*/
inline std::string
validatePowerMode(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
- const std::string& modeString)
+ const nlohmann::json& modeValue)
{
+ using PowerMode = computer_system::PowerMode;
std::string mode;
- if (modeString == "Static")
+ if (modeValue == PowerMode::Static)
{
mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.Static";
}
- else if (modeString == "MaximumPerformance")
+ else if (modeValue == PowerMode::MaximumPerformance)
{
mode =
"xyz.openbmc_project.Control.Power.Mode.PowerMode.MaximumPerformance";
}
- else if (modeString == "PowerSaving")
+ else if (modeValue == PowerMode::PowerSaving)
{
mode = "xyz.openbmc_project.Control.Power.Mode.PowerMode.PowerSaving";
}
+ else if (modeValue == PowerMode::BalancedPerformance)
+ {
+ mode =
+ "xyz.openbmc_project.Control.Power.Mode.PowerMode.BalancedPerformance";
+ }
+ else if (modeValue == PowerMode::EfficiencyFavorPerformance)
+ {
+ mode =
+ "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPerformance";
+ }
+ else if (modeValue == PowerMode::EfficiencyFavorPower)
+ {
+ mode =
+ "xyz.openbmc_project.Control.Power.Mode.PowerMode.EfficiencyFavorPower";
+ }
else
{
- messages::propertyValueNotInList(asyncResp->res, modeString,
+ messages::propertyValueNotInList(asyncResp->res, modeValue.dump(),
"PowerMode");
}
return mode;
@@ -3233,7 +3271,7 @@
boost::beast::http::field::link,
"</redfish/v1/JsonSchemas/ComputerSystem/ComputerSystem.json>; rel=describedby");
asyncResp->res.jsonValue["@odata.type"] =
- "#ComputerSystem.v1_16_0.ComputerSystem";
+ "#ComputerSystem.v1_22_0.ComputerSystem";
asyncResp->res.jsonValue["Name"] = "system";
asyncResp->res.jsonValue["Id"] = "system";
asyncResp->res.jsonValue["SystemType"] = "Physical";