xref: /openbmc/bmcweb/features/redfish/lib/message_registries.hpp (revision 45ca1b868e47978a4d2e8ebb680cb384e804c97e)
170304cb5SJason M. Bills /*
270304cb5SJason M. Bills // Copyright (c) 2019 Intel Corporation
370304cb5SJason M. Bills //
470304cb5SJason M. Bills // Licensed under the Apache License, Version 2.0 (the "License");
570304cb5SJason M. Bills // you may not use this file except in compliance with the License.
670304cb5SJason M. Bills // You may obtain a copy of the License at
770304cb5SJason M. Bills //
870304cb5SJason M. Bills //      http://www.apache.org/licenses/LICENSE-2.0
970304cb5SJason M. Bills //
1070304cb5SJason M. Bills // Unless required by applicable law or agreed to in writing, software
1170304cb5SJason M. Bills // distributed under the License is distributed on an "AS IS" BASIS,
1270304cb5SJason M. Bills // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1370304cb5SJason M. Bills // See the License for the specific language governing permissions and
1470304cb5SJason M. Bills // limitations under the License.
1570304cb5SJason M. Bills */
1670304cb5SJason M. Bills #pragma once
1770304cb5SJason M. Bills 
1870304cb5SJason M. Bills #include "registries.hpp"
1970304cb5SJason M. Bills #include "registries/base_message_registry.hpp"
20fbe8378fSJason M. Bills #include "registries/openbmc_message_registry.hpp"
2174eec26bSSunitha Harish #include "registries/resource_event_message_registry.hpp"
22e51c710eSJames Feist #include "registries/task_event_message_registry.hpp"
2370304cb5SJason M. Bills 
247e860f15SJohn Edward Broadbent #include <app.hpp>
25*45ca1b86SEd Tanous #include <query.hpp>
26ed398213SEd Tanous #include <registries/privilege_registry.hpp>
277e860f15SJohn Edward Broadbent 
2870304cb5SJason M. Bills namespace redfish
2970304cb5SJason M. Bills {
3070304cb5SJason M. Bills 
31dff07827SJohn Edward Broadbent inline void handleMessageRegistryFileCollectionGet(
32*45ca1b86SEd Tanous     crow::App& app, const crow::Request& req,
33104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
3470304cb5SJason M. Bills {
35*45ca1b86SEd Tanous     if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
36*45ca1b86SEd Tanous     {
37*45ca1b86SEd Tanous         return;
38*45ca1b86SEd Tanous     }
397e860f15SJohn Edward Broadbent     // Collections don't include the static data added by SubRoute
407e860f15SJohn Edward Broadbent     // because it has a duplicate entry for members
4114c8aee2SEd Tanous 
428d1b46d7Szhanghch05     asyncResp->res.jsonValue = {
430fda0f12SGeorge Liu         {"@odata.type",
440fda0f12SGeorge Liu          "#MessageRegistryFileCollection.MessageRegistryFileCollection"},
4514c8aee2SEd Tanous         {"@odata.id", "/redfish/v1/Registries"},
4614c8aee2SEd Tanous         {"Name", "MessageRegistryFile Collection"},
4714c8aee2SEd Tanous         {"Description", "Collection of MessageRegistryFiles"},
4874eec26bSSunitha Harish         {"Members@odata.count", 4},
4914c8aee2SEd Tanous         {"Members",
5014c8aee2SEd Tanous          {{{"@odata.id", "/redfish/v1/Registries/Base"}},
51e51c710eSJames Feist           {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
5274eec26bSSunitha Harish           {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
5314c8aee2SEd Tanous           {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
5470304cb5SJason M. Bills }
5570304cb5SJason M. Bills 
56dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app)
5770304cb5SJason M. Bills {
58dff07827SJohn Edward Broadbent     /**
59dff07827SJohn Edward Broadbent      * Functions triggers appropriate requests on DBus
60dff07827SJohn Edward Broadbent      */
61dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/")
62dff07827SJohn Edward Broadbent         .privileges(redfish::privileges::getMessageRegistryFileCollection)
63*45ca1b86SEd Tanous         .methods(boost::beast::http::verb::get)(std::bind_front(
64*45ca1b86SEd Tanous             handleMessageRegistryFileCollectionGet, std::ref(app)));
65dff07827SJohn Edward Broadbent }
66dff07827SJohn Edward Broadbent 
67dff07827SJohn Edward Broadbent inline void handleMessageRoutesMessageRegistryFileGet(
68*45ca1b86SEd Tanous     crow::App& app, const crow::Request& req,
69104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
70dff07827SJohn Edward Broadbent     const std::string& registry)
71dff07827SJohn Edward Broadbent {
72*45ca1b86SEd Tanous     if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
73*45ca1b86SEd Tanous     {
74*45ca1b86SEd Tanous         return;
75*45ca1b86SEd Tanous     }
76fffb8c1fSEd Tanous     const registries::Header* header = nullptr;
77e51c710eSJames Feist     std::string dmtf = "DMTF ";
78e51c710eSJames Feist     const char* url = nullptr;
79e51c710eSJames Feist 
80e51c710eSJames Feist     if (registry == "Base")
81e51c710eSJames Feist     {
82fffb8c1fSEd Tanous         header = &registries::base::header;
83fffb8c1fSEd Tanous         url = registries::base::url;
84e51c710eSJames Feist     }
85e51c710eSJames Feist     else if (registry == "TaskEvent")
86e51c710eSJames Feist     {
87fffb8c1fSEd Tanous         header = &registries::task_event::header;
88fffb8c1fSEd Tanous         url = registries::task_event::url;
89e51c710eSJames Feist     }
90e51c710eSJames Feist     else if (registry == "OpenBMC")
91e51c710eSJames Feist     {
92fffb8c1fSEd Tanous         header = &registries::openbmc::header;
93e51c710eSJames Feist         dmtf.clear();
94e51c710eSJames Feist     }
9574eec26bSSunitha Harish     else if (registry == "ResourceEvent")
9674eec26bSSunitha Harish     {
97fffb8c1fSEd Tanous         header = &registries::resource_event::header;
98fffb8c1fSEd Tanous         url = registries::resource_event::url;
9974eec26bSSunitha Harish     }
100e51c710eSJames Feist     else
101e51c710eSJames Feist     {
102e51c710eSJames Feist         messages::resourceNotFound(
103dff07827SJohn Edward Broadbent             asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
1047e860f15SJohn Edward Broadbent             registry);
105e51c710eSJames Feist         return;
106e51c710eSJames Feist     }
107e51c710eSJames Feist 
1088d1b46d7Szhanghch05     asyncResp->res.jsonValue = {
109e51c710eSJames Feist         {"@odata.id", "/redfish/v1/Registries/" + registry},
110dff07827SJohn Edward Broadbent         {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
111e51c710eSJames Feist         {"Name", registry + " Message Registry File"},
112dff07827SJohn Edward Broadbent         {"Description", dmtf + registry + " Message Registry File Location"},
113e51c710eSJames Feist         {"Id", header->registryPrefix},
114e51c710eSJames Feist         {"Registry", header->id},
11514c8aee2SEd Tanous         {"Languages", {"en"}},
11614c8aee2SEd Tanous         {"Languages@odata.count", 1},
11714c8aee2SEd Tanous         {"Location",
11814c8aee2SEd Tanous          {{{"Language", "en"},
119dff07827SJohn Edward Broadbent            {"Uri", "/redfish/v1/Registries/" + registry + "/" + registry}}}},
12014c8aee2SEd Tanous         {"Location@odata.count", 1}};
121e51c710eSJames Feist 
122e51c710eSJames Feist     if (url != nullptr)
123e51c710eSJames Feist     {
124dff07827SJohn Edward Broadbent         asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = url;
125e51c710eSJames Feist     }
12670304cb5SJason M. Bills }
12770304cb5SJason M. Bills 
128dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app)
12970304cb5SJason M. Bills {
130dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/")
131ed398213SEd Tanous         .privileges(redfish::privileges::getMessageRegistryFile)
132*45ca1b86SEd Tanous         .methods(boost::beast::http::verb::get)(std::bind_front(
133*45ca1b86SEd Tanous             handleMessageRoutesMessageRegistryFileGet, std::ref(app)));
134dff07827SJohn Edward Broadbent }
135dff07827SJohn Edward Broadbent 
136dff07827SJohn Edward Broadbent inline void handleMessageRegistryGet(
137*45ca1b86SEd Tanous     crow::App& app, const crow::Request& req,
138104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
1396e8c18f0SJohn Edward Broadbent     const std::string& registry, const std::string& registryMatch)
1407e860f15SJohn Edward Broadbent 
141e51c710eSJames Feist {
142*45ca1b86SEd Tanous     if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
143*45ca1b86SEd Tanous     {
144*45ca1b86SEd Tanous         return;
145*45ca1b86SEd Tanous     }
146fffb8c1fSEd Tanous     const registries::Header* header = nullptr;
147fffb8c1fSEd Tanous     std::vector<const registries::MessageEntry*> registryEntries;
148e51c710eSJames Feist     if (registry == "Base")
149e51c710eSJames Feist     {
150fffb8c1fSEd Tanous         header = &registries::base::header;
151fffb8c1fSEd Tanous         for (const registries::MessageEntry& entry : registries::base::registry)
152e51c710eSJames Feist         {
153e51c710eSJames Feist             registryEntries.emplace_back(&entry);
154e51c710eSJames Feist         }
155e51c710eSJames Feist     }
156e51c710eSJames Feist     else if (registry == "TaskEvent")
157e51c710eSJames Feist     {
158fffb8c1fSEd Tanous         header = &registries::task_event::header;
159fffb8c1fSEd Tanous         for (const registries::MessageEntry& entry :
160fffb8c1fSEd Tanous              registries::task_event::registry)
161e51c710eSJames Feist         {
162e51c710eSJames Feist             registryEntries.emplace_back(&entry);
163e51c710eSJames Feist         }
164e51c710eSJames Feist     }
165e51c710eSJames Feist     else if (registry == "OpenBMC")
166e51c710eSJames Feist     {
167fffb8c1fSEd Tanous         header = &registries::openbmc::header;
168fffb8c1fSEd Tanous         for (const registries::MessageEntry& entry :
169fffb8c1fSEd Tanous              registries::openbmc::registry)
170e51c710eSJames Feist         {
171e51c710eSJames Feist             registryEntries.emplace_back(&entry);
172e51c710eSJames Feist         }
173e51c710eSJames Feist     }
17474eec26bSSunitha Harish     else if (registry == "ResourceEvent")
17574eec26bSSunitha Harish     {
176fffb8c1fSEd Tanous         header = &registries::resource_event::header;
177fffb8c1fSEd Tanous         for (const registries::MessageEntry& entry :
178fffb8c1fSEd Tanous              registries::resource_event::registry)
17974eec26bSSunitha Harish         {
18074eec26bSSunitha Harish             registryEntries.emplace_back(&entry);
18174eec26bSSunitha Harish         }
18274eec26bSSunitha Harish     }
183e51c710eSJames Feist     else
184e51c710eSJames Feist     {
185e51c710eSJames Feist         messages::resourceNotFound(
186dff07827SJohn Edward Broadbent             asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
1877e860f15SJohn Edward Broadbent             registry);
188e51c710eSJames Feist         return;
189e51c710eSJames Feist     }
190e51c710eSJames Feist 
1916e8c18f0SJohn Edward Broadbent     if (registry != registryMatch)
192e51c710eSJames Feist     {
1936e8c18f0SJohn Edward Broadbent         messages::resourceNotFound(asyncResp->res, header->type, registryMatch);
194e51c710eSJames Feist         return;
195e51c710eSJames Feist     }
196e51c710eSJames Feist 
197dff07827SJohn Edward Broadbent     asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright},
198e51c710eSJames Feist                                 {"@odata.type", header->type},
199e51c710eSJames Feist                                 {"Id", header->id},
200e51c710eSJames Feist                                 {"Name", header->name},
201e51c710eSJames Feist                                 {"Language", header->language},
202e51c710eSJames Feist                                 {"Description", header->description},
203e51c710eSJames Feist                                 {"RegistryPrefix", header->registryPrefix},
204e51c710eSJames Feist                                 {"RegistryVersion", header->registryVersion},
205e51c710eSJames Feist                                 {"OwningEntity", header->owningEntity}};
20670304cb5SJason M. Bills 
207dff07827SJohn Edward Broadbent     nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"];
20870304cb5SJason M. Bills 
20970304cb5SJason M. Bills     // Go through the Message Registry and populate each Message
210fffb8c1fSEd Tanous     for (const registries::MessageEntry* message : registryEntries)
21170304cb5SJason M. Bills     {
212e51c710eSJames Feist         nlohmann::json& obj = messageObj[message->first];
213e51c710eSJames Feist         obj = {{"Description", message->second.description},
214e51c710eSJames Feist                {"Message", message->second.message},
2155f2b84eeSEd Tanous                {"Severity", message->second.messageSeverity},
216e7808c93SGunnar Mills                {"MessageSeverity", message->second.messageSeverity},
217e51c710eSJames Feist                {"NumberOfArgs", message->second.numberOfArgs},
218e51c710eSJames Feist                {"Resolution", message->second.resolution}};
219e51c710eSJames Feist         if (message->second.numberOfArgs > 0)
22070304cb5SJason M. Bills         {
22114c8aee2SEd Tanous             nlohmann::json& messageParamArray = obj["ParamTypes"];
222938f2568SEd Tanous             messageParamArray = nlohmann::json::array();
223e51c710eSJames Feist             for (const char* str : message->second.paramTypes)
22470304cb5SJason M. Bills             {
22570304cb5SJason M. Bills                 if (str == nullptr)
22670304cb5SJason M. Bills                 {
22770304cb5SJason M. Bills                     break;
22870304cb5SJason M. Bills                 }
22970304cb5SJason M. Bills                 messageParamArray.push_back(str);
23070304cb5SJason M. Bills             }
23170304cb5SJason M. Bills         }
23270304cb5SJason M. Bills     }
23370304cb5SJason M. Bills }
23470304cb5SJason M. Bills 
235dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app)
236dff07827SJohn Edward Broadbent {
237dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/")
238dff07827SJohn Edward Broadbent         .privileges(redfish::privileges::getMessageRegistryFile)
239*45ca1b86SEd Tanous         .methods(boost::beast::http::verb::get)(
240*45ca1b86SEd Tanous             std::bind_front(handleMessageRegistryGet, std::ref(app)));
241dff07827SJohn Edward Broadbent }
24270304cb5SJason M. Bills } // namespace redfish
243