From 8b21bce7fa0974c454e4bed539be0475738ee21e Mon Sep 17 00:00:00 2001 From: Kuiying Wang Date: Fri, 4 Sep 2020 19:24:25 +0800 Subject: [PATCH] Define Redfish interface "/Registries/Bios" and enable Attributes property 1. Define Redfish interface "/Registries/Bios" for BIOS Attribute Registry RBC Daemon provide method to get BIOS attribute registry. 2. Eanble Attributes property for BIOS resource 3. Define Redfish interface "/Systems/system/Bios/Settings" for BIOS settings 4. RBC daemon is at https://gerrit.openbmc-project.xyz/#/c/openbmc/bios-settings-mgr/+/35563/ 5. IPMI command implementation is at https://gerrit.openbmc-project.xyz/#/c/openbmc/intel-ipmi-oem/+/30827/ 6. Property design is at https://github.com/openbmc/phosphor-dbus-interfaces/tree/master/xyz/openbmc_project/BIOSConfig 7. Design doc is at https://github.com/openbmc/docs/blob/master/designs/remote-bios-configuration.md 8. There will be 95 test cases for this feature in the validation team. Tested: 1. Use postman (Redfish tool) could get all the attributes in bios resouce, get bios settings, get bios attribute registry. https://IP_ADDR/redfish/v1/Systems/system/Bios { "@Redfish.Settings": { "@odata.type": "#Settings.v1_3_0.Settings", "SettingsObject": { "@odata.id": "/redfish/v1/Systems/system/Bios/Settings" } }, "@odata.id": "/redfish/v1/Systems/system/Bios", "@odata.type": "#Bios.v1_1_0.Bios", "Actions": { "#Bios.ChangePassword": { "target": "/redfish/v1/Systems/system/Bios/Actions/Bios.ChangePassword" }, "#Bios.ResetBios": { "target": "/redfish/v1/Systems/system/Bios/Actions/Bios.ResetBios" } }, "AttributeRegistry": "BiosAttributeRegistry", "Attributes": { "attr0": "current value" }, "Description": "BIOS Configuration Service", "Id": "BIOS", "Links": { "ActiveSoftwareImage": { "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/bios_active" }, "SoftwareImages": [ { "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/bios_active" } ], "SoftwareImages@odata.count": 1 }, "Name": "BIOS Configuration" } Redfish interface: https://BMCIP/redfish/v1/Registries/BiosAttributeRegistry { "@odata.id": "/redfish/v1/Registries/BiosAttributeRegistry", "@odata.type": "#MessageRegistryFile.v1_1_0.MessageRegistryFile", "Description": "BiosAttributeRegistry Message Registry File Location", "Id": "BiosAttributeRegistry", "Languages": [ "en" ], "Languages@odata.count": 1, "Location": [ { "Language": "en", "Uri": "/redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry" } ], "Location@odata.count": 1, "Name": "BiosAttributeRegistry Message Registry File", "Registry": "BiosAttributeRegistry.1.0.0" } Redfish interface: https://BMCIP/redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry { "@odata.id": "/redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry", "@odata.type": "#AttributeRegistry.v1_3_2.AttributeRegistry", "Id": "BiosAttributeRegistry", "Language": "en", "Name": "Bios Attribute Registry", "OwningEntity": "OpenBMC", "RegistryEntries": { "Attributes": [ { "AttributeName": "attr0", "CurrentValue": "current value", "DefaultValue": "default value", "DisplayName": "display name for attr0", "HelpText": "description for attr0", "MenuPath": "./menu/path/for/attr0", "ReadOnly": false, "Type": "String", "Value": [] } ] }, "RegistryVersion": "1.0.0" } https://BMC_IPADDR/redfish/v1/Systems/system/Bios/Settings { "@odata.id": "/redfish/v1/Systems/system/Bios/Settings", "@odata.type": "#Bios.v1_1_0.Bios", "AttributeRegistry": "BiosAttributeRegistry", "Attributes": { "QuietBoot": "0x0" }, "Id": "BiosSettingsV1", "Name": "Bios Settings Version 1" } 2. Passed Validator check for bios resource and bios attribute registry *** /redfish/v1/Systems/system/Bios INFO - Type (#Bios.v1_1_0.Bios), GET SUCCESS (time: 1.57377) INFO - PASS *** /redfish/v1/Registries/BiosAttributeRegistry INFO - Type (#MessageRegistryFile.v1_1_0.MessageRegistryFile), GET SUCCESS (time: 0.075438) INFO - PASS INFO - *** /redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry INFO - Type (#AttributeRegistry.v1_3_2.AttributeRegistry), GET SUCCESS (time: 0.075751) INFO - PASS @odata.id /redfish/v1/Systems/system/Bios odata Exists PASS @odata.type #Settings.v1_3_0.Settings odata Exists PASS Links [JSON Object] Bios.v1_1_0.Links Yes complex Links.ActiveSoftwareImage Link: /redfish/v1/UpdateService/FirmwareInventory/bios_active link to: SoftwareInventory Yes PASS Links.SoftwareImages Array (size: 1) array of: SoftwareInventory Yes ... Links.SoftwareImages[0] Link: /redfish/v1/UpdateService/FirmwareInventory/bios_active SoftwareInventory Yes PASS Links.Oem - Resource.Oem No Optional SoftwareImages@odata.count 1 odata Exists PASS AttributeRegistry BiosAttributeRegistry string Yes PASS Actions [JSON Object] Bios.v1_0_0.Actions Yes complex Actions.#Bios.ResetBios Action - Yes PASS Actions.#Bios.ChangePassword Action - Yes PASS Attributes [JSON Object] Bios.v1_0_0.Attributes Yes complex Attributes.attr0 current value primitive Yes PASS Id BIOS string Yes PASS Description BIOS Configuration Service string Yes PASS Name BIOS Configuration string Yes PASS Oem - Resource.Oem No Optional @Redfish.Settings [JSON Object] Settings.Settings Yes complex @Redfish.Settings.MaintenanceWindowResource - link to: ItemOrCollection No Optional @Redfish.Settings.SupportedApplyTimes - string (enum) No Optional @Redfish.Settings.Time - date No Optional @Redfish.Settings.ETag - string No Optional @Redfish.Settings.SettingsObject Link: /redfish/v1/Systems/system/Bios/Settings link to: Item Yes PASS @Redfish.Settings.Messages - Message No Optional @odata.id /redfish/v1/Registries/BiosAttributeRegistry odata Exists PASS @odata.type #MessageRegistryFile.v1_1_0.MessageRegistryFile odata Exists PASS Languages@odata.count 1 odata Exists PASS Location@odata.count 1 odata Exists PASS Actions - MessageRegistryFile.v1_1_0.Actions No Optional Languages Array (size: 1) string Yes ... Languages[0] en string Yes PASS Registry BiosAttributeRegistry.1.0.0 string Yes PASS Location Array (size: 1) array of: Location Yes ... Location[0] [JSON Object] Location Yes complex Location[0].Language en string Yes PASS Location[0].Uri /redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry string Yes PASS Location[0].ArchiveUri - string No Optional Location[0].PublicationUri - string No Optional Location[0].ArchiveFile - string No Optional Id BiosAttributeRegistry string Yes PASS Description BiosAttributeRegistry Message Registry File Location string Yes PASS Name BiosAttributeRegistry Message Registry File string Yes PASS Oem - Resource.Oem No Optional @odata.id /redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry odata Exists PASS @odata.type #AttributeRegistry.v1_3_2.AttributeRegistry odata Exists PASS Actions - AttributeRegistry.v1_1_0.Actions No Optional Language en string Yes PASS RegistryVersion 1.0.0 string Yes PASS OwningEntity OpenBMC string Yes PASS SupportedSystems - SupportedSystems No Optional RegistryEntries [JSON Object] AttributeRegistry.v1_0_0.RegistryEntries Yes complex RegistryEntries.Attributes Array (size: 1) array of: Attributes Yes ... RegistryEntries.Attributes[0] [JSON Object] Attributes Yes complex RegistryEntries.Attributes[0].Oem - Resource.Oem No Optional RegistryEntries.Attributes[0].ResetRequired - boolean No Optional RegistryEntries.Attributes[0].UefiDevicePath - string No Optional RegistryEntries.Attributes[0].UefiKeywordName - string No Optional RegistryEntries.Attributes[0].UefiNamespaceId - string No Optional RegistryEntries.Attributes[0].AttributeName attr0 string Yes PASS RegistryEntries.Attributes[0].Type String string (enum) Yes PASS RegistryEntries.Attributes[0].Value Array (size: 0) array of: AttributeValue Yes ... RegistryEntries.Attributes[0].DisplayName display name for attr0 string Yes PASS RegistryEntries.Attributes[0].HelpText description for attr0 string Yes PASS RegistryEntries.Attributes[0].WarningText - string No Optional RegistryEntries.Attributes[0].CurrentValue current value primitive Yes PASS RegistryEntries.Attributes[0].DefaultValue default value primitive Yes PASS RegistryEntries.Attributes[0].DisplayOrder - number No Optional RegistryEntries.Attributes[0].MenuPath ./menu/path/for/attr0 string Yes PASS RegistryEntries.Attributes[0].ReadOnly False boolean Yes PASS RegistryEntries.Attributes[0].WriteOnly - boolean No Optional RegistryEntries.Attributes[0].GrayOut - boolean No Optional RegistryEntries.Attributes[0].Hidden - boolean No Optional RegistryEntries.Attributes[0].Immutable - boolean No Optional RegistryEntries.Attributes[0].IsSystemUniqueProperty - boolean No Optional RegistryEntries.Attributes[0].MaxLength - number No Optional RegistryEntries.Attributes[0].MinLength - number No Optional RegistryEntries.Attributes[0].ScalarIncrement - number No Optional RegistryEntries.Attributes[0].UpperBound - number No Optional RegistryEntries.Attributes[0].LowerBound - number No Optional RegistryEntries.Attributes[0].ValueExpression - string No Optional RegistryEntries.Menus - Menus No Optional RegistryEntries.Dependencies - Dependencies No Optional Id BiosAttributeRegistry string Yes PASS Description - string No Optional Name Bios Attribute Registry string Yes PASS Oem - Resource.Oem No Optional Change-Id: Iecc61018c350f0b8c89df59b2864b941508b1916 Signed-off-by: Kuiying Wang Signed-off-by: Snehalatha Venkatesh Signed-off-by: Smriti Ayushi --- redfish-core/include/redfish.hpp | 3 + .../include/registries/bios_registry.hpp | 40 ++ redfish-core/lib/bios.hpp | 511 ++++++++++++++++++ redfish-core/lib/message_registries.hpp | 10 +- 4 files changed, 563 insertions(+), 1 deletion(-) create mode 100644 redfish-core/include/registries/bios_registry.hpp diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp index a9704d6..e4881ff 100644 --- a/redfish-core/include/redfish.hpp +++ b/redfish-core/include/redfish.hpp @@ -152,7 +152,10 @@ class RedfishService requestRoutesSystemActionsReset(app); requestRoutesSystemResetActionInfo(app); requestRoutesBiosService(app); + requestRoutesBiosSettings(app); + requestRoutesBiosAttributeRegistry(app); requestRoutesBiosReset(app); + requestRoutesBiosChangePassword(app); #ifdef BMCWEB_ENABLE_VM_NBDPROXY requestNBDVirtualMediaRoutes(app); diff --git a/redfish-core/include/registries/bios_registry.hpp b/redfish-core/include/registries/bios_registry.hpp new file mode 100644 index 0000000..bcf6b73 --- /dev/null +++ b/redfish-core/include/registries/bios_registry.hpp @@ -0,0 +1,40 @@ +/* +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +*/ +#pragma once +#include + +namespace redfish::registries::bios +{ +const Header header = { + "Copyright 2020 OpenBMC. All rights reserved.", + "#MessageRegistry.v1_4_0.MessageRegistry", + "BiosAttributeRegistry.1.0.0", + "Bios Attribute Registry", + "en", + "This registry defines the messages for bios attribute registry.", + "BiosAttributeRegistry", + "1.0.0", + "OpenBMC", +}; +// BiosAttributeRegistry registry is not defined in DMTF, We should use +// OEM defined registries for this purpose. +// Below link is wrong - We need to define OEM registries and use +// appropriate data here. +constexpr const char* url = + "https://redfish.dmtf.org/registries/BiosAttributeRegistry.1.0.0.json"; + +constexpr std::array registry = {}; +} // namespace redfish::registries::bios diff --git a/redfish-core/lib/bios.hpp b/redfish-core/lib/bios.hpp index d8475ae..e92e842 100644 --- a/redfish-core/lib/bios.hpp +++ b/redfish-core/lib/bios.hpp @@ -3,8 +3,140 @@ #include #include #include + namespace redfish { + +/*baseBIOSTable +map{attributeName,struct{attributeType,readonlyStatus,displayname, + description,menuPath,current,default, + array{struct{optionstring,optionvalue}}}} +*/ +using BiosBaseTableType = std::vector, std::variant, + std::vector< + std::tuple>>>>>; +using BiosBaseTableItemType = std::pair< + std::string, + std::tuple< + std::string, bool, std::string, std::string, std::string, + std::variant, std::variant, + std::vector< + std::tuple>>>>; +using OptionsItemType = + std::tuple>; + +enum BiosBaseTableIndex +{ + biosBaseAttrType = 0, + biosBaseReadonlyStatus, + biosBaseDisplayName, + biosBaseDescription, + biosBaseMenuPath, + biosBaseCurrValue, + biosBaseDefaultValue, + biosBaseOptions +}; +enum OptionsItemIndex +{ + optItemType = 0, + optItemValue +}; +/* + The Pending attribute name and new value. + ex- { {"QuietBoot",Type.Integer, 0x1}, + { "DdrFreqLimit",Type.String,"2933"} + } +*/ +using PendingAttributesType = std::vector>>>; +using PendingAttributesItemType = + std::pair>>; +enum PendingAttributesIndex +{ + pendingAttrType = 0, + pendingAttrValue +}; +static std::string mapAttrTypeToRedfish(const std::string_view typeDbus) +{ + std::string ret; + if (typeDbus == "xyz.openbmc_project.BIOSConfig.Manager." + "AttributeType.Enumeration") + { + ret = "Enumeration"; + } + else if (typeDbus == "xyz.openbmc_project.BIOSConfig." + "Manager.AttributeType.String") + { + ret = "String"; + } + else if (typeDbus == "xyz.openbmc_project.BIOSConfig." + "Manager.AttributeType.Password") + { + ret = "Password"; + } + else if (typeDbus == "xyz.openbmc_project.BIOSConfig." + "Manager.AttributeType.Integer") + { + ret = "Integer"; + } + else if (typeDbus == "xyz.openbmc_project.BIOSConfig." + "Manager.AttributeType.Boolean") + { + ret = "Boolean"; + } + else + { + ret = "UNKNOWN"; + } + + return ret; +} +static std::string mapBoundTypeToRedfish(const std::string_view typeDbus) +{ + std::string ret; + if (typeDbus == + "xyz.openbmc_project.BIOSConfig.Manager.BoundType.ScalarIncrement") + { + ret = "ScalarIncrement"; + } + else if (typeDbus == + "xyz.openbmc_project.BIOSConfig.Manager.BoundType.LowerBound") + { + ret = "LowerBound"; + } + else if (typeDbus == + "xyz.openbmc_project.BIOSConfig.Manager.BoundType.UpperBound") + { + ret = "UpperBound"; + } + else if (typeDbus == + "xyz.openbmc_project.BIOSConfig.Manager.BoundType.MinStringLength") + { + ret = "MinStringLength"; + } + else if (typeDbus == + "xyz.openbmc_project.BIOSConfig.Manager.BoundType.MaxStringLength") + { + ret = "MaxStringLength"; + } + else if (typeDbus == + "xyz.openbmc_project.BIOSConfig.Manager.BoundType.OneOf") + { + ret = "OneOf"; + } + else + { + ret = "UNKNOWN"; + } + + return ret; +} + /** * BiosService class supports handle get method for bios. */ @@ -23,6 +155,85 @@ inline void // Get the ActiveSoftwareImage and SoftwareImages fw_util::populateFirmwareInformation(asyncResp, fw_util::biosPurpose, "", true); + + asyncResp->res.jsonValue["@Redfish.Settings"] = { + {"@odata.type", "#Settings.v1_3_0.Settings"}, + {"SettingsObject", + {{"@odata.id", "/redfish/v1/Systems/system/Bios/Settings"}}}}; + asyncResp->res.jsonValue["AttributeRegistry"] = "BiosAttributeRegistry"; + asyncResp->res.jsonValue["Attributes"] = nlohmann::json::object(); + + crow::connections::systemBus->async_method_call( + [asyncResp](const boost::system::error_code ec, + const GetObjectType& getObjectType) { + if (ec) + { + BMCWEB_LOG_ERROR << "ObjectMapper::GetObject call failed: " + << ec; + messages::internalError(asyncResp->res); + + return; + } + const std::string& service = getObjectType.begin()->first; + + crow::connections::systemBus->async_method_call( + [asyncResp]( + const boost::system::error_code ec, + const std::variant& retBiosTable) { + if (ec) + { + BMCWEB_LOG_ERROR << "getBiosAttributes DBUS error: " + << ec; + messages::internalError(asyncResp->res); + return; + } + const BiosBaseTableType* baseBiosTable = + std::get_if(&retBiosTable); + nlohmann::json& attributesJson = + asyncResp->res.jsonValue["Attributes"]; + if (baseBiosTable == nullptr) + { + BMCWEB_LOG_ERROR << "baseBiosTable == nullptr "; + messages::internalError(asyncResp->res); + return; + } + for (const BiosBaseTableItemType& item : *baseBiosTable) + { + const std::string& key = item.first; + const std::string& itemType = + std::get(item.second); + std::string attrType = mapAttrTypeToRedfish(itemType); + if (attrType == "String") + { + const std::string* currValue = + std::get_if( + &std::get(item.second)); + attributesJson.emplace( + key, currValue != nullptr ? *currValue : ""); + } + else if (attrType == "Integer") + { + const int64_t* currValue = std::get_if( + &std::get(item.second)); + attributesJson.emplace( + key, currValue != nullptr ? *currValue : 0); + } + else + { + BMCWEB_LOG_ERROR << "Unsupported attribute type."; + messages::internalError(asyncResp->res); + } + } + }, + service, "/xyz/openbmc_project/bios_config/manager", + "org.freedesktop.DBus.Properties", "Get", + "xyz.openbmc_project.BIOSConfig.Manager", "BaseBIOSTable"); + }, + "xyz.openbmc_project.ObjectMapper", + "/xyz/openbmc_project/object_mapper", + "xyz.openbmc_project.ObjectMapper", "GetObject", + "/xyz/openbmc_project/bios_config/manager", + std::array()); } inline void requestRoutesBiosService(App& app) { @@ -31,6 +242,306 @@ inline void requestRoutesBiosService(App& app) .methods(boost::beast::http::verb::get)(handleBiosServiceGet); } +/** + * BiosSettings class supports handle GET/PATCH method for + * BIOS configuration pending settings. + */ +inline void requestRoutesBiosSettings(App& app) +{ + BMCWEB_ROUTE(app, "/redfish/v1/Systems/system/Bios/Settings") + .privileges(redfish::privileges::getBios) + .methods(boost::beast::http::verb::get)( + [](const crow::Request&, + const std::shared_ptr& asyncResp) { + asyncResp->res.jsonValue["@odata.id"] = + asyncResp->res.jsonValue["@odata.id"] = + "/redfish/v1/Systems/system/Bios/Settings"; + asyncResp->res.jsonValue["@odata.type"] = "#Bios.v1_1_0.Bios"; + asyncResp->res.jsonValue["Name"] = "Bios Settings Version 1"; + asyncResp->res.jsonValue["Id"] = "BiosSettingsV1"; + asyncResp->res.jsonValue["AttributeRegistry"] = + "BiosAttributeRegistry"; + asyncResp->res.jsonValue["Attributes"] = {}; + + crow::connections::systemBus->async_method_call( + [asyncResp](const boost::system::error_code ec, + const GetObjectType& getObjectType) { + if (ec) + { + BMCWEB_LOG_ERROR + << "ObjectMapper::GetObject call failed: " + << ec; + messages::internalError(asyncResp->res); + + return; + } + std::string service = getObjectType.begin()->first; + + crow::connections::systemBus->async_method_call( + [asyncResp]( + const boost::system::error_code ec, + const std::variant& + retPendingAttributes) { + if (ec) + { + BMCWEB_LOG_ERROR + << "getBiosSettings DBUS error: " << ec; + messages::resourceNotFound( + asyncResp->res, "Systems/system/Bios", + "Settings"); + return; + } + const PendingAttributesType* pendingAttributes = + std::get_if( + &retPendingAttributes); + nlohmann::json& attributesJson = + asyncResp->res.jsonValue["Attributes"]; + if (pendingAttributes == nullptr) + { + BMCWEB_LOG_ERROR + << "pendingAttributes == nullptr "; + messages::internalError(asyncResp->res); + return; + } + for (const PendingAttributesItemType& item : + *pendingAttributes) + { + const std::string& key = item.first; + const std::string& itemType = + std::get(item.second); + std::string attrType = + mapAttrTypeToRedfish(itemType); + if (attrType == "String") + { + const std::string* currValue = + std::get_if( + &std::get( + item.second)); + attributesJson.emplace( + key, currValue != nullptr + ? *currValue + : ""); + } + else if (attrType == "Integer") + { + const int64_t* currValue = + std::get_if( + &std::get( + item.second)); + attributesJson.emplace( + key, currValue != nullptr + ? *currValue + : 0); + } + else + { + BMCWEB_LOG_ERROR + << "Unsupported attribute type."; + messages::internalError(asyncResp->res); + } + } + }, + service, "/xyz/openbmc_project/bios_config/manager", + "org.freedesktop.DBus.Properties", "Get", + "xyz.openbmc_project.BIOSConfig.Manager", + "PendingAttributes"); + }, + "xyz.openbmc_project.ObjectMapper", + "/xyz/openbmc_project/object_mapper", + "xyz.openbmc_project.ObjectMapper", "GetObject", + "/xyz/openbmc_project/bios_config/manager", + std::array()); + }); +} +/** + * BiosAttributeRegistry class supports handle get method for BIOS attribute + * registry. + */ +inline void requestRoutesBiosAttributeRegistry(App& app) +{ + BMCWEB_ROUTE( + app, + "/redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry/") + .privileges(redfish::privileges::getBios) + .methods( + boost::beast::http::verb:: + get)([](const crow::Request&, + const std::shared_ptr& asyncResp) { + asyncResp->res.jsonValue["@odata.id"] = + "/redfish/v1/Registries/BiosAttributeRegistry/" + "BiosAttributeRegistry"; + asyncResp->res.jsonValue["@odata.type"] = + "#AttributeRegistry.v1_3_2.AttributeRegistry"; + asyncResp->res.jsonValue["Name"] = "Bios Attribute Registry"; + asyncResp->res.jsonValue["Id"] = "BiosAttributeRegistry"; + asyncResp->res.jsonValue["RegistryVersion"] = "1.0.0"; + asyncResp->res.jsonValue["Language"] = "en"; + asyncResp->res.jsonValue["OwningEntity"] = "OpenBMC"; + asyncResp->res.jsonValue["RegistryEntries"]["Attributes"] = + nlohmann::json::array(); + + crow::connections::systemBus->async_method_call( + [asyncResp](const boost::system::error_code ec, + const GetObjectType& getObjectType) { + if (ec) + { + BMCWEB_LOG_ERROR + << "ObjectMapper::GetObject call failed: " << ec; + messages::internalError(asyncResp->res); + + return; + } + std::string service = getObjectType.begin()->first; + + crow::connections::systemBus->async_method_call( + [asyncResp](const boost::system::error_code ec, + const std::variant& + retBiosTable) { + if (ec) + { + BMCWEB_LOG_ERROR + << "getBiosAttributeRegistry DBUS error: " + << ec; + messages::resourceNotFound( + asyncResp->res, "Registries/Bios", "Bios"); + return; + } + const BiosBaseTableType* baseBiosTable = + std::get_if(&retBiosTable); + nlohmann::json& attributeArray = + asyncResp->res + .jsonValue["RegistryEntries"]["Attributes"]; + nlohmann::json optionsArray = + nlohmann::json::array(); + if (baseBiosTable == nullptr) + { + BMCWEB_LOG_ERROR << "baseBiosTable == nullptr "; + messages::internalError(asyncResp->res); + return; + } + for (const BiosBaseTableItemType& item : + *baseBiosTable) + { + const std::string& itemType = + std::get(item.second); + std::string attrType = + mapAttrTypeToRedfish(itemType); + if (attrType == "UNKNOWN") + { + BMCWEB_LOG_ERROR << "attrType == UNKNOWN"; + messages::internalError(asyncResp->res); + return; + } + nlohmann::json attributeItem; + attributeItem["AttributeName"] = item.first; + attributeItem["Type"] = attrType; + attributeItem["ReadOnly"] = + std::get( + item.second); + attributeItem["DisplayName"] = + std::get(item.second); + attributeItem["HelpText"] = + std::get(item.second); + attributeItem["MenuPath"] = + std::get(item.second); + + if (attrType == "String") + { + const std::string* currValue = + std::get_if( + &std::get( + item.second)); + const std::string* defValue = + std::get_if( + &std::get( + item.second)); + attributeItem["CurrentValue"] = + currValue != nullptr ? *currValue : ""; + attributeItem["DefaultValue"] = + defValue != nullptr ? *defValue : ""; + } + else if (attrType == "Integer") + { + const int64_t* currValue = + std::get_if( + &std::get( + item.second)); + const int64_t* defValue = + std::get_if( + &std::get( + item.second)); + attributeItem["CurrentValue"] = + currValue != nullptr ? *currValue : 0; + attributeItem["DefaultValue"] = + defValue != nullptr ? *defValue : 0; + } + else + { + BMCWEB_LOG_ERROR + << "Unsupported attribute type."; + messages::internalError(asyncResp->res); + return; + } + + const std::vector& + optionsVector = + std::get(item.second); + for (const OptionsItemType& optItem : + optionsVector) + { + nlohmann::json optItemJson; + const std::string& strOptItemType = + std::get(optItem); + std::string optItemTypeRedfish = + mapBoundTypeToRedfish(strOptItemType); + if (optItemTypeRedfish == "UNKNOWN") + { + BMCWEB_LOG_ERROR + << "optItemTypeRedfish == UNKNOWN"; + messages::internalError(asyncResp->res); + return; + } + if (optItemTypeRedfish == "OneOf") + { + const std::string* currValue = + std::get_if( + &std::get( + optItem)); + optItemJson[optItemTypeRedfish] = + currValue != nullptr ? *currValue + : ""; + } + else + { + const int64_t* currValue = + std::get_if( + &std::get( + optItem)); + optItemJson[optItemTypeRedfish] = + currValue != nullptr ? *currValue + : 0; + } + + optionsArray.push_back(optItemJson); + } + + attributeItem["Value"] = optionsArray; + attributeArray.push_back(attributeItem); + } + }, + service, "/xyz/openbmc_project/bios_config/manager", + "org.freedesktop.DBus.Properties", "Get", + "xyz.openbmc_project.BIOSConfig.Manager", + "BaseBIOSTable"); + }, + "xyz.openbmc_project.ObjectMapper", + "/xyz/openbmc_project/object_mapper", + "xyz.openbmc_project.ObjectMapper", "GetObject", + "/xyz/openbmc_project/bios_config/manager", + std::array()); + }); +} + /** * BiosReset class supports handle POST method for Reset bios. * The class retrieves and sends data directly to D-Bus. diff --git a/redfish-core/lib/message_registries.hpp b/redfish-core/lib/message_registries.hpp index c030e5a..d76f70b 100644 --- a/redfish-core/lib/message_registries.hpp +++ b/redfish-core/lib/message_registries.hpp @@ -17,6 +17,7 @@ #include "registries.hpp" #include "registries/base_message_registry.hpp" +#include "registries/bios_registry.hpp" #include "registries/openbmc_message_registry.hpp" #include "registries/resource_event_message_registry.hpp" #include "registries/task_event_message_registry.hpp" @@ -128,7 +129,6 @@ inline void handleMessageRegistryGet( const crow::Request& /*req*/, const std::shared_ptr& asyncResp, const std::string& registry, const std::string& registryMatch) - { const registries::Header* header = nullptr; std::vector registryEntries; @@ -167,6 +167,14 @@ inline void handleMessageRegistryGet( registryEntries.emplace_back(&entry); } } + else if (registry == "BiosAttributeRegistry") + { + header = ®istries::bios::header; + for (const registries::MessageEntry& entry : registries::bios::registry) + { + registryEntries.emplace_back(&entry); + } + } else { messages::resourceNotFound( -- 2.25.1