From ffa924ef204930a5bb442bf654eac02543acfb8f Mon Sep 17 00:00:00 2001 From: Krzysztof Grobelny Date: Wed, 30 Jun 2021 15:18:46 +0000 Subject: [PATCH 2/5] BaseBiosTable: Add support for PATCH operation This commit brings in support for PATCH operation of the bios variables that updates the BaseBiosTable. Tested-By: * Passed Redfish validator * Single Attribute: PATCH https://${bmc}/redfish/v1/Systems/system/Bios/Settings -d '{"data":[{"AttributeName": , "AttributeType": , "AttributeValue": }]}' * Multiple Attributes: PATCH https://${bmc}/redfish/v1/Systems/system/Bios/Settings -d '{"data":[{"AttributeName": , "AttributeType": , "AttributeValue": }, {"AttributeName": , "AttributeType": , "AttributeValue": }]}' This makes use of the "Set" of "PendingAttributes" in the backend and that updates the BaseBiosTable. Signed-off-by: Kuiying Wang Change-Id: I12e78e5ac623c264c7a3e1dd5198aca67172736d --- redfish-core/lib/bios.hpp | 95 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/redfish-core/lib/bios.hpp b/redfish-core/lib/bios.hpp index c1a5c56..14d2171 100644 --- a/redfish-core/lib/bios.hpp +++ b/redfish-core/lib/bios.hpp @@ -96,6 +96,29 @@ static std::string mapAttrTypeToRedfish(const std::string_view typeDbus) return ret; } +static std::string mapRedfishToAttrType(const std::string_view type) +{ + std::string ret; + if (type == "string") + { + ret = "xyz.openbmc_project.BIOSConfig.Manager.AttributeType.String"; + } + else if (type == "int") + { + ret = "xyz.openbmc_project.BIOSConfig.Manager.AttributeType.Integer"; + } + else if (type == "enum") + { + ret = "xyz.openbmc_project.BIOSConfig.Manager.AttributeType." + "Enumeration"; + } + else + { + ret = "UNKNOWN"; + } + + return ret; +} static std::string mapBoundTypeToRedfish(const std::string_view typeDbus) { std::string ret; @@ -370,6 +393,78 @@ inline void requestRoutesBiosSettings(App& app) "/xyz/openbmc_project/bios_config/manager", std::array()); }); + + BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/Bios/Settings") + .privileges({{"ConfigureComponents"}}) + .methods(boost::beast::http::verb::patch)( + [](const crow::Request& req, + const std::shared_ptr& asyncResp) { + nlohmann::json inpJson; + + if (!redfish::json_util::readJsonPatch(req, asyncResp->res, "data", + inpJson)) + { + return; + } + + for (auto& attrInfo : inpJson) + { + std::optional attrName; + std::optional attrType; + std::optional attrValue; + if (!json_util::getValueFromJsonObject( + attrInfo, "AttributeName", attrName)) + { + messages::propertyMissing(asyncResp->res, + "AttributeName"); + return; + } + if (!json_util::getValueFromJsonObject( + attrInfo, "AttributeType", attrType)) + { + messages::propertyMissing(asyncResp->res, + "AttributeType"); + return; + } + if (!json_util::getValueFromJsonObject( + attrInfo, "AttributeValue", attrValue)) + { + messages::propertyMissing(asyncResp->res, + "AttributeValue"); + return; + } + std::string biosAttrType = mapRedfishToAttrType(*attrType); + + if (biosAttrType == "UNKNOWN") + { + BMCWEB_LOG_ERROR << "Invalid attribute type"; + messages::propertyValueNotInList( + asyncResp->res, "AttributeType", *attrType); + return; + } + + PendingAttributesType pendingAttributes; + pendingAttributes.emplace_back(std::make_pair( + *attrName, std::make_tuple(biosAttrType, *attrValue))); + + crow::connections::systemBus->async_method_call( + [asyncResp](const boost::system::error_code ec) { + if (ec) + { + BMCWEB_LOG_ERROR + << "doPatch resp_handler got error " << ec; + messages::internalError(asyncResp->res); + return; + } + }, + "xyz.openbmc_project.BIOSConfigManager", + "/xyz/openbmc_project/bios_config/manager", + "org.freedesktop.DBus.Properties", "Set", + "xyz.openbmc_project.BIOSConfig.Manager", + "PendingAttributes", + std::variant(pendingAttributes)); + } + }); } /** * BiosAttributeRegistry class supports handle get method for BIOS attribute -- 2.17.1