blob: 77fc10eba988189e3c04b341405e4e16ff4e4a42 [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"
Jason M. Billsfbe83782019-03-27 14:14:53 -070021#include "registries/openbmc_message_registry.hpp"
Sunitha Harish74eec262020-06-25 10:00:01 -050022#include "registries/resource_event_message_registry.hpp"
James Feiste51c7102020-03-17 10:38:18 -070023#include "registries/task_event_message_registry.hpp"
Jason M. Bills70304cb2019-03-27 12:03:59 -070024
25namespace redfish
26{
27
28class MessageRegistryFileCollection : public Node
29{
30 public:
Ed Tanous52cc1122020-07-18 13:51:21 -070031 MessageRegistryFileCollection(App& app) :
Jason M. Bills70304cb2019-03-27 12:03:59 -070032 Node(app, "/redfish/v1/Registries/")
33 {
34 entityPrivileges = {
35 {boost::beast::http::verb::get, {{"Login"}}},
36 {boost::beast::http::verb::head, {{"Login"}}},
37 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
38 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
39 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
40 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
41 }
42
43 private:
44 /**
45 * Functions triggers appropriate requests on DBus
46 */
Ed Tanouscb13a392020-07-25 19:02:03 +000047 void doGet(crow::Response& res, const crow::Request&,
48 const std::vector<std::string>&) override
Jason M. Bills70304cb2019-03-27 12:03:59 -070049 {
Jason M. Bills70304cb2019-03-27 12:03:59 -070050 // Collections don't include the static data added by SubRoute because
51 // it has a duplicate entry for members
Ed Tanous14c8aee2019-06-13 13:39:16 -070052
53 res.jsonValue = {
54 {"@odata.type",
55 "#MessageRegistryFileCollection.MessageRegistryFileCollection"},
Ed Tanous14c8aee2019-06-13 13:39:16 -070056 {"@odata.id", "/redfish/v1/Registries"},
57 {"Name", "MessageRegistryFile Collection"},
58 {"Description", "Collection of MessageRegistryFiles"},
Sunitha Harish74eec262020-06-25 10:00:01 -050059 {"Members@odata.count", 4},
Ed Tanous14c8aee2019-06-13 13:39:16 -070060 {"Members",
61 {{{"@odata.id", "/redfish/v1/Registries/Base"}},
James Feiste51c7102020-03-17 10:38:18 -070062 {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
Sunitha Harish74eec262020-06-25 10:00:01 -050063 {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
Ed Tanous14c8aee2019-06-13 13:39:16 -070064 {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
65
66 res.end();
Jason M. Bills70304cb2019-03-27 12:03:59 -070067 }
68};
69
James Feiste51c7102020-03-17 10:38:18 -070070class MessageRegistryFile : public Node
Jason M. Bills70304cb2019-03-27 12:03:59 -070071{
72 public:
Ed Tanous52cc1122020-07-18 13:51:21 -070073 MessageRegistryFile(App& app) :
James Feiste51c7102020-03-17 10:38:18 -070074 Node(app, "/redfish/v1/Registries/<str>/", std::string())
Jason M. Bills70304cb2019-03-27 12:03:59 -070075 {
76 entityPrivileges = {
77 {boost::beast::http::verb::get, {{"Login"}}},
78 {boost::beast::http::verb::head, {{"Login"}}},
79 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
80 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
81 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
82 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
83 }
84
85 private:
Ed Tanouscb13a392020-07-25 19:02:03 +000086 void doGet(crow::Response& res, const crow::Request&,
Gunnar Mills1214b7e2020-06-04 10:11:30 -050087 const std::vector<std::string>& params) override
Jason M. Bills70304cb2019-03-27 12:03:59 -070088 {
James Feiste51c7102020-03-17 10:38:18 -070089 if (params.size() != 1)
90 {
91 messages::internalError(res);
92 res.end();
93 return;
94 }
95
Gunnar Mills1214b7e2020-06-04 10:11:30 -050096 const std::string& registry = params[0];
97 const message_registries::Header* header;
James Feiste51c7102020-03-17 10:38:18 -070098 std::string dmtf = "DMTF ";
Gunnar Mills1214b7e2020-06-04 10:11:30 -050099 const char* url = nullptr;
James Feiste51c7102020-03-17 10:38:18 -0700100
101 if (registry == "Base")
102 {
103 header = &message_registries::base::header;
104 url = message_registries::base::url;
105 }
106 else if (registry == "TaskEvent")
107 {
108 header = &message_registries::task_event::header;
109 url = message_registries::task_event::url;
110 }
111 else if (registry == "OpenBMC")
112 {
113 header = &message_registries::openbmc::header;
114 dmtf.clear();
115 }
Sunitha Harish74eec262020-06-25 10:00:01 -0500116 else if (registry == "ResourceEvent")
117 {
118 header = &message_registries::resource_event::header;
119 url = message_registries::resource_event::url;
120 }
James Feiste51c7102020-03-17 10:38:18 -0700121 else
122 {
123 messages::resourceNotFound(
124 res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
125 registry);
126 res.end();
127 return;
128 }
129
Ed Tanous14c8aee2019-06-13 13:39:16 -0700130 res.jsonValue = {
James Feiste51c7102020-03-17 10:38:18 -0700131 {"@odata.id", "/redfish/v1/Registries/" + registry},
Ed Tanous14c8aee2019-06-13 13:39:16 -0700132 {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
James Feiste51c7102020-03-17 10:38:18 -0700133 {"Name", registry + " Message Registry File"},
134 {"Description",
135 dmtf + registry + " Message Registry File Location"},
136 {"Id", header->registryPrefix},
137 {"Registry", header->id},
Ed Tanous14c8aee2019-06-13 13:39:16 -0700138 {"Languages", {"en"}},
139 {"Languages@odata.count", 1},
140 {"Location",
141 {{{"Language", "en"},
James Feiste51c7102020-03-17 10:38:18 -0700142 {"Uri",
143 "/redfish/v1/Registries/" + registry + "/" + registry}}}},
Ed Tanous14c8aee2019-06-13 13:39:16 -0700144 {"Location@odata.count", 1}};
James Feiste51c7102020-03-17 10:38:18 -0700145
146 if (url != nullptr)
147 {
148 res.jsonValue["Location"][0]["PublicationUri"] = url;
149 }
150
Ed Tanous14c8aee2019-06-13 13:39:16 -0700151 res.end();
Jason M. Bills70304cb2019-03-27 12:03:59 -0700152 }
153};
154
James Feiste51c7102020-03-17 10:38:18 -0700155class MessageRegistry : public Node
Jason M. Bills70304cb2019-03-27 12:03:59 -0700156{
157 public:
Ed Tanous52cc1122020-07-18 13:51:21 -0700158 MessageRegistry(App& app) :
James Feiste51c7102020-03-17 10:38:18 -0700159 Node(app, "/redfish/v1/Registries/<str>/<str>/", std::string(),
160 std::string())
Jason M. Bills70304cb2019-03-27 12:03:59 -0700161 {
162 entityPrivileges = {
163 {boost::beast::http::verb::get, {{"Login"}}},
164 {boost::beast::http::verb::head, {{"Login"}}},
165 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
166 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
167 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
168 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
169 }
170
171 private:
Ed Tanouscb13a392020-07-25 19:02:03 +0000172 void doGet(crow::Response& res, const crow::Request&,
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500173 const std::vector<std::string>& params) override
Jason M. Bills70304cb2019-03-27 12:03:59 -0700174 {
James Feiste51c7102020-03-17 10:38:18 -0700175 if (params.size() != 2)
176 {
177 messages::internalError(res);
178 res.end();
179 return;
180 }
181
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500182 const std::string& registry = params[0];
183 const std::string& registry1 = params[1];
James Feiste51c7102020-03-17 10:38:18 -0700184
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500185 const message_registries::Header* header;
186 std::vector<const message_registries::MessageEntry*> registryEntries;
James Feiste51c7102020-03-17 10:38:18 -0700187 if (registry == "Base")
188 {
189 header = &message_registries::base::header;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500190 for (const message_registries::MessageEntry& entry :
James Feiste51c7102020-03-17 10:38:18 -0700191 message_registries::base::registry)
192 {
193 registryEntries.emplace_back(&entry);
194 }
195 }
196 else if (registry == "TaskEvent")
197 {
198 header = &message_registries::task_event::header;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500199 for (const message_registries::MessageEntry& entry :
James Feiste51c7102020-03-17 10:38:18 -0700200 message_registries::task_event::registry)
201 {
202 registryEntries.emplace_back(&entry);
203 }
204 }
205 else if (registry == "OpenBMC")
206 {
207 header = &message_registries::openbmc::header;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500208 for (const message_registries::MessageEntry& entry :
James Feiste51c7102020-03-17 10:38:18 -0700209 message_registries::openbmc::registry)
210 {
211 registryEntries.emplace_back(&entry);
212 }
213 }
Sunitha Harish74eec262020-06-25 10:00:01 -0500214 else if (registry == "ResourceEvent")
215 {
216 header = &message_registries::resource_event::header;
217 for (const message_registries::MessageEntry& entry :
218 message_registries::resource_event::registry)
219 {
220 registryEntries.emplace_back(&entry);
221 }
222 }
James Feiste51c7102020-03-17 10:38:18 -0700223 else
224 {
225 messages::resourceNotFound(
226 res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
227 registry);
228 res.end();
229 return;
230 }
231
232 if (registry != registry1)
233 {
234 messages::resourceNotFound(res, header->type, registry1);
235 res.end();
236 return;
237 }
238
239 res.jsonValue = {{"@Redfish.Copyright", header->copyright},
240 {"@odata.type", header->type},
241 {"Id", header->id},
242 {"Name", header->name},
243 {"Language", header->language},
244 {"Description", header->description},
245 {"RegistryPrefix", header->registryPrefix},
246 {"RegistryVersion", header->registryVersion},
247 {"OwningEntity", header->owningEntity}};
Jason M. Bills70304cb2019-03-27 12:03:59 -0700248
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500249 nlohmann::json& messageObj = res.jsonValue["Messages"];
Jason M. Bills70304cb2019-03-27 12:03:59 -0700250
251 // Go through the Message Registry and populate each Message
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500252 for (const message_registries::MessageEntry* message : registryEntries)
Jason M. Bills70304cb2019-03-27 12:03:59 -0700253 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500254 nlohmann::json& obj = messageObj[message->first];
James Feiste51c7102020-03-17 10:38:18 -0700255 obj = {{"Description", message->second.description},
256 {"Message", message->second.message},
257 {"Severity", message->second.severity},
Gunnar Millse7808c92020-07-08 21:17:44 -0500258 {"MessageSeverity", message->second.messageSeverity},
James Feiste51c7102020-03-17 10:38:18 -0700259 {"NumberOfArgs", message->second.numberOfArgs},
260 {"Resolution", message->second.resolution}};
261 if (message->second.numberOfArgs > 0)
Jason M. Bills70304cb2019-03-27 12:03:59 -0700262 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500263 nlohmann::json& messageParamArray = obj["ParamTypes"];
264 for (const char* str : message->second.paramTypes)
Jason M. Bills70304cb2019-03-27 12:03:59 -0700265 {
266 if (str == nullptr)
267 {
268 break;
269 }
270 messageParamArray.push_back(str);
271 }
272 }
273 }
Ed Tanous14c8aee2019-06-13 13:39:16 -0700274 res.end();
Jason M. Bills70304cb2019-03-27 12:03:59 -0700275 }
276};
277
Jason M. Bills70304cb2019-03-27 12:03:59 -0700278} // namespace redfish