xref: /openbmc/bmcweb/features/redfish/lib/message_registries.hpp (revision ed3982131dcef2b499da36e674d2d21b2289ef29)
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*ed398213SEd Tanous #include <registries/privilege_registry.hpp>
267e860f15SJohn Edward Broadbent 
2770304cb5SJason M. Bills namespace redfish
2870304cb5SJason M. Bills {
2970304cb5SJason M. Bills 
307e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app)
3170304cb5SJason M. Bills {
3270304cb5SJason M. Bills     /**
3370304cb5SJason M. Bills      * Functions triggers appropriate requests on DBus
3470304cb5SJason M. Bills      */
357e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/")
36*ed398213SEd Tanous         .privileges(redfish::privileges::getMessageRegistryFileCollection)
377e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
387e860f15SJohn Edward Broadbent             [](const crow::Request&,
397e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
407e860f15SJohn Edward Broadbent                 // Collections don't include the static data added by SubRoute
417e860f15SJohn Edward Broadbent                 // because it has a duplicate entry for members
4214c8aee2SEd Tanous 
438d1b46d7Szhanghch05                 asyncResp->res.jsonValue = {
447e860f15SJohn Edward Broadbent                     {"@odata.type", "#MessageRegistryFileCollection."
457e860f15SJohn Edward Broadbent                                     "MessageRegistryFileCollection"},
4614c8aee2SEd Tanous                     {"@odata.id", "/redfish/v1/Registries"},
4714c8aee2SEd Tanous                     {"Name", "MessageRegistryFile Collection"},
4814c8aee2SEd Tanous                     {"Description", "Collection of MessageRegistryFiles"},
4974eec26bSSunitha Harish                     {"Members@odata.count", 4},
5014c8aee2SEd Tanous                     {"Members",
5114c8aee2SEd Tanous                      {{{"@odata.id", "/redfish/v1/Registries/Base"}},
52e51c710eSJames Feist                       {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
5374eec26bSSunitha Harish                       {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
5414c8aee2SEd Tanous                       {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
557e860f15SJohn Edward Broadbent             });
5670304cb5SJason M. Bills }
5770304cb5SJason M. Bills 
587e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app)
5970304cb5SJason M. Bills {
607e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/")
61*ed398213SEd Tanous         .privileges(redfish::privileges::getMessageRegistryFile)
627e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
637e860f15SJohn Edward Broadbent             [](const crow::Request&,
647e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
657e860f15SJohn Edward Broadbent                const std::string& registry) {
66e51c710eSJames Feist                 const message_registries::Header* header;
67e51c710eSJames Feist                 std::string dmtf = "DMTF ";
68e51c710eSJames Feist                 const char* url = nullptr;
69e51c710eSJames Feist 
70e51c710eSJames Feist                 if (registry == "Base")
71e51c710eSJames Feist                 {
72e51c710eSJames Feist                     header = &message_registries::base::header;
73e51c710eSJames Feist                     url = message_registries::base::url;
74e51c710eSJames Feist                 }
75e51c710eSJames Feist                 else if (registry == "TaskEvent")
76e51c710eSJames Feist                 {
77e51c710eSJames Feist                     header = &message_registries::task_event::header;
78e51c710eSJames Feist                     url = message_registries::task_event::url;
79e51c710eSJames Feist                 }
80e51c710eSJames Feist                 else if (registry == "OpenBMC")
81e51c710eSJames Feist                 {
82e51c710eSJames Feist                     header = &message_registries::openbmc::header;
83e51c710eSJames Feist                     dmtf.clear();
84e51c710eSJames Feist                 }
8574eec26bSSunitha Harish                 else if (registry == "ResourceEvent")
8674eec26bSSunitha Harish                 {
8774eec26bSSunitha Harish                     header = &message_registries::resource_event::header;
8874eec26bSSunitha Harish                     url = message_registries::resource_event::url;
8974eec26bSSunitha Harish                 }
90e51c710eSJames Feist                 else
91e51c710eSJames Feist                 {
92e51c710eSJames Feist                     messages::resourceNotFound(
938d1b46d7Szhanghch05                         asyncResp->res,
947e860f15SJohn Edward Broadbent                         "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
957e860f15SJohn Edward Broadbent                         registry);
96e51c710eSJames Feist                     return;
97e51c710eSJames Feist                 }
98e51c710eSJames Feist 
998d1b46d7Szhanghch05                 asyncResp->res.jsonValue = {
100e51c710eSJames Feist                     {"@odata.id", "/redfish/v1/Registries/" + registry},
1017e860f15SJohn Edward Broadbent                     {"@odata.type",
1027e860f15SJohn Edward Broadbent                      "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
103e51c710eSJames Feist                     {"Name", registry + " Message Registry File"},
104e51c710eSJames Feist                     {"Description",
105e51c710eSJames Feist                      dmtf + registry + " Message Registry File Location"},
106e51c710eSJames Feist                     {"Id", header->registryPrefix},
107e51c710eSJames Feist                     {"Registry", header->id},
10814c8aee2SEd Tanous                     {"Languages", {"en"}},
10914c8aee2SEd Tanous                     {"Languages@odata.count", 1},
11014c8aee2SEd Tanous                     {"Location",
11114c8aee2SEd Tanous                      {{{"Language", "en"},
1127e860f15SJohn Edward Broadbent                        {"Uri", "/redfish/v1/Registries/" + registry + "/" +
1137e860f15SJohn Edward Broadbent                                    registry}}}},
11414c8aee2SEd Tanous                     {"Location@odata.count", 1}};
115e51c710eSJames Feist 
116e51c710eSJames Feist                 if (url != nullptr)
117e51c710eSJames Feist                 {
1187e860f15SJohn Edward Broadbent                     asyncResp->res.jsonValue["Location"][0]["PublicationUri"] =
1197e860f15SJohn Edward Broadbent                         url;
120e51c710eSJames Feist                 }
1217e860f15SJohn Edward Broadbent             });
12270304cb5SJason M. Bills }
12370304cb5SJason M. Bills 
1247e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app)
12570304cb5SJason M. Bills {
1267e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/")
127*ed398213SEd Tanous         .privileges(redfish::privileges::getMessageRegistryFile)
1287e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
1297e860f15SJohn Edward Broadbent             [](const crow::Request&,
1307e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
1317e860f15SJohn Edward Broadbent                const std::string& registry, const std::string& registry1)
1327e860f15SJohn Edward Broadbent 
133e51c710eSJames Feist             {
134e51c710eSJames Feist                 const message_registries::Header* header;
1357e860f15SJohn Edward Broadbent                 std::vector<const message_registries::MessageEntry*>
1367e860f15SJohn Edward Broadbent                     registryEntries;
137e51c710eSJames Feist                 if (registry == "Base")
138e51c710eSJames Feist                 {
139e51c710eSJames Feist                     header = &message_registries::base::header;
140e51c710eSJames Feist                     for (const message_registries::MessageEntry& entry :
141e51c710eSJames Feist                          message_registries::base::registry)
142e51c710eSJames Feist                     {
143e51c710eSJames Feist                         registryEntries.emplace_back(&entry);
144e51c710eSJames Feist                     }
145e51c710eSJames Feist                 }
146e51c710eSJames Feist                 else if (registry == "TaskEvent")
147e51c710eSJames Feist                 {
148e51c710eSJames Feist                     header = &message_registries::task_event::header;
149e51c710eSJames Feist                     for (const message_registries::MessageEntry& entry :
150e51c710eSJames Feist                          message_registries::task_event::registry)
151e51c710eSJames Feist                     {
152e51c710eSJames Feist                         registryEntries.emplace_back(&entry);
153e51c710eSJames Feist                     }
154e51c710eSJames Feist                 }
155e51c710eSJames Feist                 else if (registry == "OpenBMC")
156e51c710eSJames Feist                 {
157e51c710eSJames Feist                     header = &message_registries::openbmc::header;
158e51c710eSJames Feist                     for (const message_registries::MessageEntry& entry :
159e51c710eSJames Feist                          message_registries::openbmc::registry)
160e51c710eSJames Feist                     {
161e51c710eSJames Feist                         registryEntries.emplace_back(&entry);
162e51c710eSJames Feist                     }
163e51c710eSJames Feist                 }
16474eec26bSSunitha Harish                 else if (registry == "ResourceEvent")
16574eec26bSSunitha Harish                 {
16674eec26bSSunitha Harish                     header = &message_registries::resource_event::header;
16774eec26bSSunitha Harish                     for (const message_registries::MessageEntry& entry :
16874eec26bSSunitha Harish                          message_registries::resource_event::registry)
16974eec26bSSunitha Harish                     {
17074eec26bSSunitha Harish                         registryEntries.emplace_back(&entry);
17174eec26bSSunitha Harish                     }
17274eec26bSSunitha Harish                 }
173e51c710eSJames Feist                 else
174e51c710eSJames Feist                 {
175e51c710eSJames Feist                     messages::resourceNotFound(
1768d1b46d7Szhanghch05                         asyncResp->res,
1777e860f15SJohn Edward Broadbent                         "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
1787e860f15SJohn Edward Broadbent                         registry);
179e51c710eSJames Feist                     return;
180e51c710eSJames Feist                 }
181e51c710eSJames Feist 
182e51c710eSJames Feist                 if (registry != registry1)
183e51c710eSJames Feist                 {
1847e860f15SJohn Edward Broadbent                     messages::resourceNotFound(asyncResp->res, header->type,
1857e860f15SJohn Edward Broadbent                                                registry1);
186e51c710eSJames Feist                     return;
187e51c710eSJames Feist                 }
188e51c710eSJames Feist 
1898d1b46d7Szhanghch05                 asyncResp->res.jsonValue = {
1908d1b46d7Szhanghch05                     {"@Redfish.Copyright", header->copyright},
191e51c710eSJames Feist                     {"@odata.type", header->type},
192e51c710eSJames Feist                     {"Id", header->id},
193e51c710eSJames Feist                     {"Name", header->name},
194e51c710eSJames Feist                     {"Language", header->language},
195e51c710eSJames Feist                     {"Description", header->description},
196e51c710eSJames Feist                     {"RegistryPrefix", header->registryPrefix},
197e51c710eSJames Feist                     {"RegistryVersion", header->registryVersion},
198e51c710eSJames Feist                     {"OwningEntity", header->owningEntity}};
19970304cb5SJason M. Bills 
2007e860f15SJohn Edward Broadbent                 nlohmann::json& messageObj =
2017e860f15SJohn Edward Broadbent                     asyncResp->res.jsonValue["Messages"];
20270304cb5SJason M. Bills 
20370304cb5SJason M. Bills                 // Go through the Message Registry and populate each Message
2047e860f15SJohn Edward Broadbent                 for (const message_registries::MessageEntry* message :
2057e860f15SJohn Edward Broadbent                      registryEntries)
20670304cb5SJason M. Bills                 {
207e51c710eSJames Feist                     nlohmann::json& obj = messageObj[message->first];
208e51c710eSJames Feist                     obj = {{"Description", message->second.description},
209e51c710eSJames Feist                            {"Message", message->second.message},
210e51c710eSJames Feist                            {"Severity", message->second.severity},
211e7808c93SGunnar Mills                            {"MessageSeverity", message->second.messageSeverity},
212e51c710eSJames Feist                            {"NumberOfArgs", message->second.numberOfArgs},
213e51c710eSJames Feist                            {"Resolution", message->second.resolution}};
214e51c710eSJames Feist                     if (message->second.numberOfArgs > 0)
21570304cb5SJason M. Bills                     {
21614c8aee2SEd Tanous                         nlohmann::json& messageParamArray = obj["ParamTypes"];
217938f2568SEd Tanous                         messageParamArray = nlohmann::json::array();
218e51c710eSJames Feist                         for (const char* str : message->second.paramTypes)
21970304cb5SJason M. Bills                         {
22070304cb5SJason M. Bills                             if (str == nullptr)
22170304cb5SJason M. Bills                             {
22270304cb5SJason M. Bills                                 break;
22370304cb5SJason M. Bills                             }
22470304cb5SJason M. Bills                             messageParamArray.push_back(str);
22570304cb5SJason M. Bills                         }
22670304cb5SJason M. Bills                     }
22770304cb5SJason M. Bills                 }
2287e860f15SJohn Edward Broadbent             });
22970304cb5SJason M. Bills }
23070304cb5SJason M. Bills 
23170304cb5SJason M. Bills } // namespace redfish
232