summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/biosconfig/0002-BaseBiosTable-Add-support-for-PATCH-operation.patch
blob: a52a1614f648c11dd5091ddf04f37c12fb1f525b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
From ffa924ef204930a5bb442bf654eac02543acfb8f Mon Sep 17 00:00:00 2001
From: Krzysztof Grobelny <krzysztof.grobelny@intel.com>
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": <attribute name>, "AttributeType":
<attribute type>, "AttributeValue": <attribute value>}]}'

* Multiple Attributes:
PATCH https://${bmc}/redfish/v1/Systems/system/Bios/Settings -d
'{"data":[{"AttributeName": <attribute name>, "AttributeType":
<attribute type>, "AttributeValue": <attribute value>},
{"AttributeName": <attribute name>, "AttributeType":
<attribute type>, "AttributeValue": <attribute value>}]}'

This makes use of the "Set" of "PendingAttributes" in the
backend and that updates the BaseBiosTable.

Signed-off-by: Kuiying Wang <kuiying.wang@intel.com>
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<const char*, 0>());
             });
+
+    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<bmcweb::AsyncResp>& asyncResp) {
+                nlohmann::json inpJson;
+
+                if (!redfish::json_util::readJsonPatch(req, asyncResp->res, "data",
+                                                  inpJson))
+                {
+                    return;
+                }
+
+                for (auto& attrInfo : inpJson)
+                {
+                    std::optional<std::string> attrName;
+                    std::optional<std::string> attrType;
+                    std::optional<std::string> 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<PendingAttributesType>(pendingAttributes));
+                }
+            });
 }
 /**
  * BiosAttributeRegistry class supports handle get method for BIOS attribute
-- 
2.17.1