blob: 0caf01c3e558f14acc0124af53d13b4ff5cc973a [file] [log] [blame]
Jason M. Bills70304cb2019-03-27 12:03:59 -07001/*
2// Copyright (c) 2019 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16#pragma once
17
18#include "node.hpp"
19#include "registries.hpp"
20#include "registries/base_message_registry.hpp"
Kuiying Wang212f6bc2020-09-04 19:24:25 +080021#include "registries/bios_registry.hpp"
Jason M. Billsfbe83782019-03-27 14:14:53 -070022#include "registries/openbmc_message_registry.hpp"
Sunitha Harish74eec262020-06-25 10:00:01 -050023#include "registries/resource_event_message_registry.hpp"
James Feiste51c7102020-03-17 10:38:18 -070024#include "registries/task_event_message_registry.hpp"
Jason M. Bills70304cb2019-03-27 12:03:59 -070025
26namespace redfish
27{
28
29class MessageRegistryFileCollection : public Node
30{
31 public:
Ed Tanous52cc1122020-07-18 13:51:21 -070032 MessageRegistryFileCollection(App& app) :
Jason M. Bills70304cb2019-03-27 12:03:59 -070033 Node(app, "/redfish/v1/Registries/")
34 {
35 entityPrivileges = {
36 {boost::beast::http::verb::get, {{"Login"}}},
37 {boost::beast::http::verb::head, {{"Login"}}},
38 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
39 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
40 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
41 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
42 }
43
44 private:
45 /**
46 * Functions triggers appropriate requests on DBus
47 */
Ed Tanouscb13a392020-07-25 19:02:03 +000048 void doGet(crow::Response& res, const crow::Request&,
49 const std::vector<std::string>&) override
Jason M. Bills70304cb2019-03-27 12:03:59 -070050 {
Jason M. Bills70304cb2019-03-27 12:03:59 -070051 // Collections don't include the static data added by SubRoute because
52 // it has a duplicate entry for members
Ed Tanous14c8aee2019-06-13 13:39:16 -070053
54 res.jsonValue = {
55 {"@odata.type",
56 "#MessageRegistryFileCollection.MessageRegistryFileCollection"},
Ed Tanous14c8aee2019-06-13 13:39:16 -070057 {"@odata.id", "/redfish/v1/Registries"},
58 {"Name", "MessageRegistryFile Collection"},
59 {"Description", "Collection of MessageRegistryFiles"},
Kuiying Wang212f6bc2020-09-04 19:24:25 +080060 {"Members@odata.count", 5},
Ed Tanous14c8aee2019-06-13 13:39:16 -070061 {"Members",
62 {{{"@odata.id", "/redfish/v1/Registries/Base"}},
James Feiste51c7102020-03-17 10:38:18 -070063 {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
Sunitha Harish74eec262020-06-25 10:00:01 -050064 {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
Kuiying Wang212f6bc2020-09-04 19:24:25 +080065 {{"@odata.id", "/redfish/v1/Registries/BiosAttributeRegistry"}},
Ed Tanous14c8aee2019-06-13 13:39:16 -070066 {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
67
68 res.end();
Jason M. Bills70304cb2019-03-27 12:03:59 -070069 }
70};
71
James Feiste51c7102020-03-17 10:38:18 -070072class MessageRegistryFile : public Node
Jason M. Bills70304cb2019-03-27 12:03:59 -070073{
74 public:
Ed Tanous52cc1122020-07-18 13:51:21 -070075 MessageRegistryFile(App& app) :
James Feiste51c7102020-03-17 10:38:18 -070076 Node(app, "/redfish/v1/Registries/<str>/", std::string())
Jason M. Bills70304cb2019-03-27 12:03:59 -070077 {
78 entityPrivileges = {
79 {boost::beast::http::verb::get, {{"Login"}}},
80 {boost::beast::http::verb::head, {{"Login"}}},
81 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
82 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
83 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
84 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
85 }
86
87 private:
Ed Tanouscb13a392020-07-25 19:02:03 +000088 void doGet(crow::Response& res, const crow::Request&,
Gunnar Mills1214b7e2020-06-04 10:11:30 -050089 const std::vector<std::string>& params) override
Jason M. Bills70304cb2019-03-27 12:03:59 -070090 {
James Feiste51c7102020-03-17 10:38:18 -070091 if (params.size() != 1)
92 {
93 messages::internalError(res);
94 res.end();
95 return;
96 }
97
Gunnar Mills1214b7e2020-06-04 10:11:30 -050098 const std::string& registry = params[0];
99 const message_registries::Header* header;
James Feiste51c7102020-03-17 10:38:18 -0700100 std::string dmtf = "DMTF ";
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500101 const char* url = nullptr;
James Feiste51c7102020-03-17 10:38:18 -0700102
103 if (registry == "Base")
104 {
105 header = &message_registries::base::header;
106 url = message_registries::base::url;
107 }
108 else if (registry == "TaskEvent")
109 {
110 header = &message_registries::task_event::header;
111 url = message_registries::task_event::url;
112 }
113 else if (registry == "OpenBMC")
114 {
115 header = &message_registries::openbmc::header;
116 dmtf.clear();
117 }
Sunitha Harish74eec262020-06-25 10:00:01 -0500118 else if (registry == "ResourceEvent")
119 {
120 header = &message_registries::resource_event::header;
121 url = message_registries::resource_event::url;
122 }
Kuiying Wang212f6bc2020-09-04 19:24:25 +0800123 else if (registry == "BiosAttributeRegistry")
124 {
125 header = &message_registries::bios::header;
126 dmtf.clear();
127 }
James Feiste51c7102020-03-17 10:38:18 -0700128 else
129 {
130 messages::resourceNotFound(
131 res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
132 registry);
133 res.end();
134 return;
135 }
136
Ed Tanous14c8aee2019-06-13 13:39:16 -0700137 res.jsonValue = {
James Feiste51c7102020-03-17 10:38:18 -0700138 {"@odata.id", "/redfish/v1/Registries/" + registry},
Ed Tanous14c8aee2019-06-13 13:39:16 -0700139 {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
James Feiste51c7102020-03-17 10:38:18 -0700140 {"Name", registry + " Message Registry File"},
141 {"Description",
142 dmtf + registry + " Message Registry File Location"},
143 {"Id", header->registryPrefix},
144 {"Registry", header->id},
Ed Tanous14c8aee2019-06-13 13:39:16 -0700145 {"Languages", {"en"}},
146 {"Languages@odata.count", 1},
147 {"Location",
148 {{{"Language", "en"},
James Feiste51c7102020-03-17 10:38:18 -0700149 {"Uri",
150 "/redfish/v1/Registries/" + registry + "/" + registry}}}},
Ed Tanous14c8aee2019-06-13 13:39:16 -0700151 {"Location@odata.count", 1}};
James Feiste51c7102020-03-17 10:38:18 -0700152
153 if (url != nullptr)
154 {
155 res.jsonValue["Location"][0]["PublicationUri"] = url;
156 }
157
Ed Tanous14c8aee2019-06-13 13:39:16 -0700158 res.end();
Jason M. Bills70304cb2019-03-27 12:03:59 -0700159 }
160};
161
James Feiste51c7102020-03-17 10:38:18 -0700162class MessageRegistry : public Node
Jason M. Bills70304cb2019-03-27 12:03:59 -0700163{
164 public:
Ed Tanous52cc1122020-07-18 13:51:21 -0700165 MessageRegistry(App& app) :
James Feiste51c7102020-03-17 10:38:18 -0700166 Node(app, "/redfish/v1/Registries/<str>/<str>/", std::string(),
167 std::string())
Jason M. Bills70304cb2019-03-27 12:03:59 -0700168 {
169 entityPrivileges = {
170 {boost::beast::http::verb::get, {{"Login"}}},
171 {boost::beast::http::verb::head, {{"Login"}}},
172 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
173 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
174 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
175 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
176 }
177
178 private:
Ed Tanouscb13a392020-07-25 19:02:03 +0000179 void doGet(crow::Response& res, const crow::Request&,
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500180 const std::vector<std::string>& params) override
Jason M. Bills70304cb2019-03-27 12:03:59 -0700181 {
James Feiste51c7102020-03-17 10:38:18 -0700182 if (params.size() != 2)
183 {
184 messages::internalError(res);
185 res.end();
186 return;
187 }
188
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500189 const std::string& registry = params[0];
190 const std::string& registry1 = params[1];
James Feiste51c7102020-03-17 10:38:18 -0700191
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500192 const message_registries::Header* header;
193 std::vector<const message_registries::MessageEntry*> registryEntries;
James Feiste51c7102020-03-17 10:38:18 -0700194 if (registry == "Base")
195 {
196 header = &message_registries::base::header;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500197 for (const message_registries::MessageEntry& entry :
James Feiste51c7102020-03-17 10:38:18 -0700198 message_registries::base::registry)
199 {
200 registryEntries.emplace_back(&entry);
201 }
202 }
203 else if (registry == "TaskEvent")
204 {
205 header = &message_registries::task_event::header;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500206 for (const message_registries::MessageEntry& entry :
James Feiste51c7102020-03-17 10:38:18 -0700207 message_registries::task_event::registry)
208 {
209 registryEntries.emplace_back(&entry);
210 }
211 }
212 else if (registry == "OpenBMC")
213 {
214 header = &message_registries::openbmc::header;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500215 for (const message_registries::MessageEntry& entry :
James Feiste51c7102020-03-17 10:38:18 -0700216 message_registries::openbmc::registry)
217 {
218 registryEntries.emplace_back(&entry);
219 }
220 }
Sunitha Harish74eec262020-06-25 10:00:01 -0500221 else if (registry == "ResourceEvent")
222 {
223 header = &message_registries::resource_event::header;
224 for (const message_registries::MessageEntry& entry :
225 message_registries::resource_event::registry)
226 {
227 registryEntries.emplace_back(&entry);
228 }
229 }
James Feiste51c7102020-03-17 10:38:18 -0700230 else
231 {
232 messages::resourceNotFound(
233 res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
234 registry);
235 res.end();
236 return;
237 }
238
239 if (registry != registry1)
240 {
241 messages::resourceNotFound(res, header->type, registry1);
242 res.end();
243 return;
244 }
245
246 res.jsonValue = {{"@Redfish.Copyright", header->copyright},
247 {"@odata.type", header->type},
248 {"Id", header->id},
249 {"Name", header->name},
250 {"Language", header->language},
251 {"Description", header->description},
252 {"RegistryPrefix", header->registryPrefix},
253 {"RegistryVersion", header->registryVersion},
254 {"OwningEntity", header->owningEntity}};
Jason M. Bills70304cb2019-03-27 12:03:59 -0700255
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500256 nlohmann::json& messageObj = res.jsonValue["Messages"];
Jason M. Bills70304cb2019-03-27 12:03:59 -0700257
258 // Go through the Message Registry and populate each Message
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500259 for (const message_registries::MessageEntry* message : registryEntries)
Jason M. Bills70304cb2019-03-27 12:03:59 -0700260 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500261 nlohmann::json& obj = messageObj[message->first];
James Feiste51c7102020-03-17 10:38:18 -0700262 obj = {{"Description", message->second.description},
263 {"Message", message->second.message},
264 {"Severity", message->second.severity},
Gunnar Millse7808c92020-07-08 21:17:44 -0500265 {"MessageSeverity", message->second.messageSeverity},
James Feiste51c7102020-03-17 10:38:18 -0700266 {"NumberOfArgs", message->second.numberOfArgs},
267 {"Resolution", message->second.resolution}};
268 if (message->second.numberOfArgs > 0)
Jason M. Bills70304cb2019-03-27 12:03:59 -0700269 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500270 nlohmann::json& messageParamArray = obj["ParamTypes"];
271 for (const char* str : message->second.paramTypes)
Jason M. Bills70304cb2019-03-27 12:03:59 -0700272 {
273 if (str == nullptr)
274 {
275 break;
276 }
277 messageParamArray.push_back(str);
278 }
279 }
280 }
Ed Tanous14c8aee2019-06-13 13:39:16 -0700281 res.end();
Jason M. Bills70304cb2019-03-27 12:03:59 -0700282 }
283};
284
Jason M. Bills70304cb2019-03-27 12:03:59 -0700285} // namespace redfish