xref: /openbmc/bmcweb/features/redfish/lib/message_registries.hpp (revision ed3982131dcef2b499da36e674d2d21b2289ef29)
1 /*
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 "registries.hpp"
19 #include "registries/base_message_registry.hpp"
20 #include "registries/openbmc_message_registry.hpp"
21 #include "registries/resource_event_message_registry.hpp"
22 #include "registries/task_event_message_registry.hpp"
23 
24 #include <app.hpp>
25 #include <registries/privilege_registry.hpp>
26 
27 namespace redfish
28 {
29 
30 inline void requestRoutesMessageRegistryFileCollection(App& app)
31 {
32     /**
33      * Functions triggers appropriate requests on DBus
34      */
35     BMCWEB_ROUTE(app, "/redfish/v1/Registries/")
36         .privileges(redfish::privileges::getMessageRegistryFileCollection)
37         .methods(boost::beast::http::verb::get)(
38             [](const crow::Request&,
39                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
40                 // Collections don't include the static data added by SubRoute
41                 // because it has a duplicate entry for members
42 
43                 asyncResp->res.jsonValue = {
44                     {"@odata.type", "#MessageRegistryFileCollection."
45                                     "MessageRegistryFileCollection"},
46                     {"@odata.id", "/redfish/v1/Registries"},
47                     {"Name", "MessageRegistryFile Collection"},
48                     {"Description", "Collection of MessageRegistryFiles"},
49                     {"Members@odata.count", 4},
50                     {"Members",
51                      {{{"@odata.id", "/redfish/v1/Registries/Base"}},
52                       {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
53                       {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
54                       {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
55             });
56 }
57 
58 inline void requestRoutesMessageRegistryFile(App& app)
59 {
60     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/")
61         .privileges(redfish::privileges::getMessageRegistryFile)
62         .methods(boost::beast::http::verb::get)(
63             [](const crow::Request&,
64                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
65                const std::string& registry) {
66                 const message_registries::Header* header;
67                 std::string dmtf = "DMTF ";
68                 const char* url = nullptr;
69 
70                 if (registry == "Base")
71                 {
72                     header = &message_registries::base::header;
73                     url = message_registries::base::url;
74                 }
75                 else if (registry == "TaskEvent")
76                 {
77                     header = &message_registries::task_event::header;
78                     url = message_registries::task_event::url;
79                 }
80                 else if (registry == "OpenBMC")
81                 {
82                     header = &message_registries::openbmc::header;
83                     dmtf.clear();
84                 }
85                 else if (registry == "ResourceEvent")
86                 {
87                     header = &message_registries::resource_event::header;
88                     url = message_registries::resource_event::url;
89                 }
90                 else
91                 {
92                     messages::resourceNotFound(
93                         asyncResp->res,
94                         "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
95                         registry);
96                     return;
97                 }
98 
99                 asyncResp->res.jsonValue = {
100                     {"@odata.id", "/redfish/v1/Registries/" + registry},
101                     {"@odata.type",
102                      "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
103                     {"Name", registry + " Message Registry File"},
104                     {"Description",
105                      dmtf + registry + " Message Registry File Location"},
106                     {"Id", header->registryPrefix},
107                     {"Registry", header->id},
108                     {"Languages", {"en"}},
109                     {"Languages@odata.count", 1},
110                     {"Location",
111                      {{{"Language", "en"},
112                        {"Uri", "/redfish/v1/Registries/" + registry + "/" +
113                                    registry}}}},
114                     {"Location@odata.count", 1}};
115 
116                 if (url != nullptr)
117                 {
118                     asyncResp->res.jsonValue["Location"][0]["PublicationUri"] =
119                         url;
120                 }
121             });
122 }
123 
124 inline void requestRoutesMessageRegistry(App& app)
125 {
126     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/")
127         .privileges(redfish::privileges::getMessageRegistryFile)
128         .methods(boost::beast::http::verb::get)(
129             [](const crow::Request&,
130                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
131                const std::string& registry, const std::string& registry1)
132 
133             {
134                 const message_registries::Header* header;
135                 std::vector<const message_registries::MessageEntry*>
136                     registryEntries;
137                 if (registry == "Base")
138                 {
139                     header = &message_registries::base::header;
140                     for (const message_registries::MessageEntry& entry :
141                          message_registries::base::registry)
142                     {
143                         registryEntries.emplace_back(&entry);
144                     }
145                 }
146                 else if (registry == "TaskEvent")
147                 {
148                     header = &message_registries::task_event::header;
149                     for (const message_registries::MessageEntry& entry :
150                          message_registries::task_event::registry)
151                     {
152                         registryEntries.emplace_back(&entry);
153                     }
154                 }
155                 else if (registry == "OpenBMC")
156                 {
157                     header = &message_registries::openbmc::header;
158                     for (const message_registries::MessageEntry& entry :
159                          message_registries::openbmc::registry)
160                     {
161                         registryEntries.emplace_back(&entry);
162                     }
163                 }
164                 else if (registry == "ResourceEvent")
165                 {
166                     header = &message_registries::resource_event::header;
167                     for (const message_registries::MessageEntry& entry :
168                          message_registries::resource_event::registry)
169                     {
170                         registryEntries.emplace_back(&entry);
171                     }
172                 }
173                 else
174                 {
175                     messages::resourceNotFound(
176                         asyncResp->res,
177                         "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
178                         registry);
179                     return;
180                 }
181 
182                 if (registry != registry1)
183                 {
184                     messages::resourceNotFound(asyncResp->res, header->type,
185                                                registry1);
186                     return;
187                 }
188 
189                 asyncResp->res.jsonValue = {
190                     {"@Redfish.Copyright", header->copyright},
191                     {"@odata.type", header->type},
192                     {"Id", header->id},
193                     {"Name", header->name},
194                     {"Language", header->language},
195                     {"Description", header->description},
196                     {"RegistryPrefix", header->registryPrefix},
197                     {"RegistryVersion", header->registryVersion},
198                     {"OwningEntity", header->owningEntity}};
199 
200                 nlohmann::json& messageObj =
201                     asyncResp->res.jsonValue["Messages"];
202 
203                 // Go through the Message Registry and populate each Message
204                 for (const message_registries::MessageEntry* message :
205                      registryEntries)
206                 {
207                     nlohmann::json& obj = messageObj[message->first];
208                     obj = {{"Description", message->second.description},
209                            {"Message", message->second.message},
210                            {"Severity", message->second.severity},
211                            {"MessageSeverity", message->second.messageSeverity},
212                            {"NumberOfArgs", message->second.numberOfArgs},
213                            {"Resolution", message->second.resolution}};
214                     if (message->second.numberOfArgs > 0)
215                     {
216                         nlohmann::json& messageParamArray = obj["ParamTypes"];
217                         messageParamArray = nlohmann::json::array();
218                         for (const char* str : message->second.paramTypes)
219                         {
220                             if (str == nullptr)
221                             {
222                                 break;
223                             }
224                             messageParamArray.push_back(str);
225                         }
226                     }
227                 }
228             });
229 }
230 
231 } // namespace redfish
232