summaryrefslogtreecommitdiff
path: root/redfish-core
diff options
context:
space:
mode:
authorEd Tanous <ed@tanous.net>2024-03-07 01:18:28 +0300
committerEd Tanous <ed@tanous.net>2024-03-21 02:29:38 +0300
commit9e9b6049332c485123e1222ae9ee555d016c0066 (patch)
tree669538faae0133bb402bbecc4aba7e5e50a2fddb /redfish-core
parentb14f357f527eae05aa1bd7a115d3f6ed237a35bb (diff)
downloadbmcweb-9e9b6049332c485123e1222ae9ee555d016c0066.tar.xz
Clean up Manager to use readJson
Change-Id: If4237a21aa0c5f414e20cd9e7eee2f1188097e14 Signed-off-by: Ed Tanous <ed@tanous.net>
Diffstat (limited to 'redfish-core')
-rw-r--r--redfish-core/lib/managers.hpp193
1 files changed, 86 insertions, 107 deletions
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 26abec0f8e..2f50ca0f16 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -709,7 +709,7 @@ enum class CreatePIDRet
inline bool
getZonesFromJsonReq(const std::shared_ptr<bmcweb::AsyncResp>& response,
- std::vector<nlohmann::json>& config,
+ std::vector<nlohmann::json::object_t>& config,
std::vector<std::string>& zones)
{
if (config.empty())
@@ -721,8 +721,8 @@ inline bool
for (auto& odata : config)
{
std::string path;
- if (!redfish::json_util::readJson(odata, response->res, "@odata.id",
- path))
+ if (!redfish::json_util::readJsonObject(odata, response->res,
+ "@odata.id", path))
{
return false;
}
@@ -746,11 +746,11 @@ inline bool
inline const dbus::utility::ManagedObjectType::value_type*
findChassis(const dbus::utility::ManagedObjectType& managedObj,
- const std::string& value, std::string& chassis)
+ std::string_view value, std::string& chassis)
{
BMCWEB_LOG_DEBUG("Find Chassis: {}", value);
- std::string escaped = value;
+ std::string escaped(value);
std::replace(escaped.begin(), escaped.end(), ' ', '_');
escaped = "/" + escaped;
auto it = std::ranges::find_if(managedObj, [&escaped](const auto& obj) {
@@ -778,13 +778,13 @@ inline const dbus::utility::ManagedObjectType::value_type*
inline CreatePIDRet createPidInterface(
const std::shared_ptr<bmcweb::AsyncResp>& response, const std::string& type,
- const nlohmann::json::iterator& it, const std::string& path,
+ std::string_view name, nlohmann::json& jsonValue, const std::string& path,
const dbus::utility::ManagedObjectType& managedObj, bool createNewObject,
dbus::utility::DBusPropertiesMap& output, std::string& chassis,
const std::string& profile)
{
// common deleter
- if (it.value() == nullptr)
+ if (jsonValue == nullptr)
{
std::string iface;
if (type == "PidControllers" || type == "FanControllers")
@@ -827,7 +827,7 @@ inline CreatePIDRet createPidInterface(
{
// if we aren't creating a new object, we should be able to find it on
// d-bus
- managedItem = findChassis(managedObj, it.key(), chassis);
+ managedItem = findChassis(managedObj, name, chassis);
if (managedItem == nullptr)
{
BMCWEB_LOG_ERROR("Failed to get chassis from config patch");
@@ -909,13 +909,13 @@ inline CreatePIDRet createPidInterface(
output.emplace_back("Type", "Pid");
}
- std::optional<std::vector<nlohmann::json>> zones;
+ std::optional<std::vector<nlohmann::json::object_t>> zones;
std::optional<std::vector<std::string>> inputs;
std::optional<std::vector<std::string>> outputs;
std::map<std::string, std::optional<double>> doubles;
std::optional<std::string> setpointOffset;
if (!redfish::json_util::readJson(
- it.value(), response->res, "Inputs", inputs, "Outputs", outputs,
+ jsonValue, response->res, "Inputs", inputs, "Outputs", outputs,
"Zones", zones, "FFGainCoefficient",
doubles["FFGainCoefficient"], "FFOffCoefficient",
doubles["FFOffCoefficient"], "ICoefficient",
@@ -990,7 +990,7 @@ inline CreatePIDRet createPidInterface(
else
{
BMCWEB_LOG_ERROR("Invalid setpointoffset {}", *setpointOffset);
- messages::propertyValueNotInList(response->res, it.key(),
+ messages::propertyValueNotInList(response->res, name,
"SetPointOffset");
return CreatePIDRet::fail;
}
@@ -1012,33 +1012,26 @@ inline CreatePIDRet createPidInterface(
{
output.emplace_back("Type", "Pid.Zone");
- std::optional<nlohmann::json> chassisContainer;
+ std::optional<std::string> chassisId;
std::optional<double> failSafePercent;
std::optional<double> minThermalOutput;
- if (!redfish::json_util::readJson(it.value(), response->res, "Chassis",
- chassisContainer, "FailSafePercent",
- failSafePercent, "MinThermalOutput",
- minThermalOutput))
+ if (!redfish::json_util::readJson(jsonValue, response->res,
+ "Chassis/@odata.id", chassisId,
+ "FailSafePercent", failSafePercent,
+ "MinThermalOutput", minThermalOutput))
{
return CreatePIDRet::fail;
}
- if (chassisContainer)
+ if (chassisId)
{
- std::string chassisId;
- if (!redfish::json_util::readJson(*chassisContainer, response->res,
- "@odata.id", chassisId))
- {
- return CreatePIDRet::fail;
- }
-
// /redfish/v1/chassis/chassis_name/
- if (!dbus::utility::getNthStringFromPath(chassisId, 3, chassis))
+ if (!dbus::utility::getNthStringFromPath(*chassisId, 3, chassis))
{
- BMCWEB_LOG_ERROR("Got invalid path {}", chassisId);
+ BMCWEB_LOG_ERROR("Got invalid path {}", *chassisId);
messages::invalidObject(
response->res,
- boost::urls::format("/redfish/v1/Chassis/{}", chassisId));
+ boost::urls::format("/redfish/v1/Chassis/{}", *chassisId));
return CreatePIDRet::fail;
}
}
@@ -1055,14 +1048,14 @@ inline CreatePIDRet createPidInterface(
{
output.emplace_back("Type", "Stepwise");
- std::optional<std::vector<nlohmann::json>> zones;
- std::optional<std::vector<nlohmann::json>> steps;
+ std::optional<std::vector<nlohmann::json::object_t>> zones;
+ std::optional<std::vector<nlohmann::json::object_t>> steps;
std::optional<std::vector<std::string>> inputs;
std::optional<double> positiveHysteresis;
std::optional<double> negativeHysteresis;
std::optional<std::string> direction; // upper clipping curve vs lower
if (!redfish::json_util::readJson(
- it.value(), response->res, "Zones", zones, "Steps", steps,
+ jsonValue, response->res, "Zones", zones, "Steps", steps,
"Inputs", inputs, "PositiveHysteresis", positiveHysteresis,
"NegativeHysteresis", negativeHysteresis, "Direction",
direction))
@@ -1098,8 +1091,8 @@ inline CreatePIDRet createPidInterface(
double target = 0.0;
double out = 0.0;
- if (!redfish::json_util::readJson(step, response->res, "Target",
- target, "Output", out))
+ if (!redfish::json_util::readJsonObject(
+ step, response->res, "Target", target, "Output", out))
{
return CreatePIDRet::fail;
}
@@ -1324,28 +1317,16 @@ struct GetPIDValues : std::enable_shared_from_this<GetPIDValues>
struct SetPIDValues : std::enable_shared_from_this<SetPIDValues>
{
- SetPIDValues(const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn,
- nlohmann::json& data) :
- asyncResp(asyncRespIn)
- {
- std::optional<nlohmann::json> pidControllers;
- std::optional<nlohmann::json> fanControllers;
- std::optional<nlohmann::json> fanZones;
- std::optional<nlohmann::json> stepwiseControllers;
-
- if (!redfish::json_util::readJson(
- data, asyncResp->res, "PidControllers", pidControllers,
- "FanControllers", fanControllers, "FanZones", fanZones,
- "StepwiseControllers", stepwiseControllers, "Profile", profile))
- {
- return;
- }
- configuration.emplace_back("PidControllers", std::move(pidControllers));
- configuration.emplace_back("FanControllers", std::move(fanControllers));
- configuration.emplace_back("FanZones", std::move(fanZones));
- configuration.emplace_back("StepwiseControllers",
- std::move(stepwiseControllers));
- }
+ SetPIDValues(
+ const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn,
+ std::vector<
+ std::pair<std::string, std::optional<nlohmann::json::object_t>>>&&
+ configurationsIn,
+ std::optional<std::string>& profileIn) :
+ asyncResp(asyncRespIn),
+ configuration(std::move(configurationsIn)),
+ profile(std::move(profileIn))
+ {}
SetPIDValues(const SetPIDValues&) = delete;
SetPIDValues(SetPIDValues&&) = delete;
@@ -1489,14 +1470,11 @@ struct SetPIDValues : std::enable_shared_from_this<SetPIDValues>
{
continue;
}
- BMCWEB_LOG_DEBUG("{}", *container);
const std::string& type = containerPair.first;
- for (nlohmann::json::iterator it = container->begin();
- it != container->end(); ++it)
+ for (auto& [name, value] : *container)
{
- const auto& name = it.key();
std::string dbusObjName = name;
std::replace(dbusObjName.begin(), dbusObjName.end(), ' ', '_');
BMCWEB_LOG_DEBUG("looking for {}", name);
@@ -1557,10 +1535,10 @@ struct SetPIDValues : std::enable_shared_from_this<SetPIDValues>
}
}
- if (createNewObject && it.value() == nullptr)
+ if (createNewObject && value == nullptr)
{
// can't delete a non-existent object
- messages::propertyValueNotInList(response->res, it.value(),
+ messages::propertyValueNotInList(response->res, value,
name);
continue;
}
@@ -1586,8 +1564,8 @@ struct SetPIDValues : std::enable_shared_from_this<SetPIDValues>
std::string chassis;
CreatePIDRet ret = createPidInterface(
- response, type, it, path, managedObj, createNewObject,
- output, chassis, currentProfile);
+ response, type, name, value, path, managedObj,
+ createNewObject, output, chassis, currentProfile);
if (ret == CreatePIDRet::fail)
{
return;
@@ -1678,7 +1656,7 @@ struct SetPIDValues : std::enable_shared_from_this<SetPIDValues>
}
std::shared_ptr<bmcweb::AsyncResp> asyncResp;
- std::vector<std::pair<std::string, std::optional<nlohmann::json>>>
+ std::vector<std::pair<std::string, std::optional<nlohmann::json::object_t>>>
configuration;
std::optional<std::string> profile;
dbus::utility::ManagedObjectType managedObj;
@@ -2219,68 +2197,69 @@ inline void requestRoutesManager(App& app)
{
return;
}
- std::optional<nlohmann::json> oem;
- std::optional<nlohmann::json> links;
+ std::optional<std::string> activeSoftwareImageOdataId;
std::optional<std::string> datetime;
-
- if (!json_util::readJsonPatch(req, asyncResp->res, "Oem", oem,
- "DateTime", datetime, "Links", links))
+ std::optional<nlohmann::json::object_t> pidControllers;
+ std::optional<nlohmann::json::object_t> fanControllers;
+ std::optional<nlohmann::json::object_t> fanZones;
+ std::optional<nlohmann::json::object_t> stepwiseControllers;
+ std::optional<std::string> profile;
+
+ // clang-format off
+ if (!json_util::readJsonPatch(req, asyncResp->res,
+ "DateTime", datetime,
+ "Links/ActiveSoftwareImage/@odata.id", activeSoftwareImageOdataId,
+ "Oem/OpenBmc/Fan/FanControllers", fanControllers,
+ "Oem/OpenBmc/Fan/FanZones", fanZones,
+ "Oem/OpenBmc/Fan/PidControllers", pidControllers,
+ "Oem/OpenBmc/Fan/Profile", profile,
+ "Oem/OpenBmc/Fan/StepwiseControllers", stepwiseControllers
+ ))
{
return;
}
+ // clang-format on
- if (oem)
+ if (pidControllers || fanControllers || fanZones ||
+ stepwiseControllers || profile)
{
#ifdef BMCWEB_ENABLE_REDFISH_OEM_MANAGER_FAN_DATA
- std::optional<nlohmann::json> openbmc;
- if (!redfish::json_util::readJson(*oem, asyncResp->res, "OpenBmc",
- openbmc))
+ std::vector<
+ std::pair<std::string, std::optional<nlohmann::json::object_t>>>
+ configuration;
+ if (pidControllers)
{
- return;
+ configuration.emplace_back("PidControllers",
+ std::move(pidControllers));
}
- if (openbmc)
+ if (fanControllers)
{
- std::optional<nlohmann::json> fan;
- if (!redfish::json_util::readJson(*openbmc, asyncResp->res,
- "Fan", fan))
- {
- return;
- }
- if (fan)
- {
- auto pid = std::make_shared<SetPIDValues>(asyncResp, *fan);
- pid->run();
- }
+ configuration.emplace_back("FanControllers",
+ std::move(fanControllers));
+ }
+ if (fanZones)
+ {
+ configuration.emplace_back("FanZones", std::move(fanZones));
+ }
+ if (stepwiseControllers)
+ {
+ configuration.emplace_back("StepwiseControllers",
+ std::move(stepwiseControllers));
}
+ auto pid = std::make_shared<SetPIDValues>(
+ asyncResp, std::move(configuration), profile);
+ pid->run();
#else
messages::propertyUnknown(asyncResp->res, "Oem");
return;
#endif
}
- if (links)
- {
- std::optional<nlohmann::json> activeSoftwareImage;
- if (!redfish::json_util::readJson(*links, asyncResp->res,
- "ActiveSoftwareImage",
- activeSoftwareImage))
- {
- return;
- }
- if (activeSoftwareImage)
- {
- std::optional<std::string> odataId;
- if (!json_util::readJson(*activeSoftwareImage, asyncResp->res,
- "@odata.id", odataId))
- {
- return;
- }
- if (odataId)
- {
- setActiveFirmwareImage(asyncResp, *odataId);
- }
- }
+ if (activeSoftwareImageOdataId)
+ {
+ setActiveFirmwareImage(asyncResp, *activeSoftwareImageOdataId);
}
+
if (datetime)
{
setDateTime(asyncResp, *datetime);