xref: /openbmc/bmcweb/features/redfish/lib/message_registries.hpp (revision 7e860f1550c8686eec42f7a75bc5f2ef51e756ad)
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 
24*7e860f15SJohn Edward Broadbent #include <app.hpp>
25*7e860f15SJohn Edward Broadbent 
2670304cb5SJason M. Bills namespace redfish
2770304cb5SJason M. Bills {
2870304cb5SJason M. Bills 
29*7e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app)
3070304cb5SJason M. Bills {
3170304cb5SJason M. Bills     /**
3270304cb5SJason M. Bills      * Functions triggers appropriate requests on DBus
3370304cb5SJason M. Bills      */
34*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/")
35*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
36*7e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
37*7e860f15SJohn Edward Broadbent             [](const crow::Request&,
38*7e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
39*7e860f15SJohn Edward Broadbent                 // Collections don't include the static data added by SubRoute
40*7e860f15SJohn Edward Broadbent                 // because it has a duplicate entry for members
4114c8aee2SEd Tanous 
428d1b46d7Szhanghch05                 asyncResp->res.jsonValue = {
43*7e860f15SJohn Edward Broadbent                     {"@odata.type", "#MessageRegistryFileCollection."
44*7e860f15SJohn Edward Broadbent                                     "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"}}}}};
54*7e860f15SJohn Edward Broadbent             });
5570304cb5SJason M. Bills }
5670304cb5SJason M. Bills 
57*7e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app)
5870304cb5SJason M. Bills {
59*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/")
60*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
61*7e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
62*7e860f15SJohn Edward Broadbent             [](const crow::Request&,
63*7e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
64*7e860f15SJohn Edward Broadbent                const std::string& registry) {
65e51c710eSJames Feist                 const message_registries::Header* header;
66e51c710eSJames Feist                 std::string dmtf = "DMTF ";
67e51c710eSJames Feist                 const char* url = nullptr;
68e51c710eSJames Feist 
69e51c710eSJames Feist                 if (registry == "Base")
70e51c710eSJames Feist                 {
71e51c710eSJames Feist                     header = &message_registries::base::header;
72e51c710eSJames Feist                     url = message_registries::base::url;
73e51c710eSJames Feist                 }
74e51c710eSJames Feist                 else if (registry == "TaskEvent")
75e51c710eSJames Feist                 {
76e51c710eSJames Feist                     header = &message_registries::task_event::header;
77e51c710eSJames Feist                     url = message_registries::task_event::url;
78e51c710eSJames Feist                 }
79e51c710eSJames Feist                 else if (registry == "OpenBMC")
80e51c710eSJames Feist                 {
81e51c710eSJames Feist                     header = &message_registries::openbmc::header;
82e51c710eSJames Feist                     dmtf.clear();
83e51c710eSJames Feist                 }
8474eec26bSSunitha Harish                 else if (registry == "ResourceEvent")
8574eec26bSSunitha Harish                 {
8674eec26bSSunitha Harish                     header = &message_registries::resource_event::header;
8774eec26bSSunitha Harish                     url = message_registries::resource_event::url;
8874eec26bSSunitha Harish                 }
89e51c710eSJames Feist                 else
90e51c710eSJames Feist                 {
91e51c710eSJames Feist                     messages::resourceNotFound(
928d1b46d7Szhanghch05                         asyncResp->res,
93*7e860f15SJohn Edward Broadbent                         "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
94*7e860f15SJohn Edward Broadbent                         registry);
95e51c710eSJames Feist                     return;
96e51c710eSJames Feist                 }
97e51c710eSJames Feist 
988d1b46d7Szhanghch05                 asyncResp->res.jsonValue = {
99e51c710eSJames Feist                     {"@odata.id", "/redfish/v1/Registries/" + registry},
100*7e860f15SJohn Edward Broadbent                     {"@odata.type",
101*7e860f15SJohn Edward Broadbent                      "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
102e51c710eSJames Feist                     {"Name", registry + " Message Registry File"},
103e51c710eSJames Feist                     {"Description",
104e51c710eSJames Feist                      dmtf + registry + " Message Registry File Location"},
105e51c710eSJames Feist                     {"Id", header->registryPrefix},
106e51c710eSJames Feist                     {"Registry", header->id},
10714c8aee2SEd Tanous                     {"Languages", {"en"}},
10814c8aee2SEd Tanous                     {"Languages@odata.count", 1},
10914c8aee2SEd Tanous                     {"Location",
11014c8aee2SEd Tanous                      {{{"Language", "en"},
111*7e860f15SJohn Edward Broadbent                        {"Uri", "/redfish/v1/Registries/" + registry + "/" +
112*7e860f15SJohn Edward Broadbent                                    registry}}}},
11314c8aee2SEd Tanous                     {"Location@odata.count", 1}};
114e51c710eSJames Feist 
115e51c710eSJames Feist                 if (url != nullptr)
116e51c710eSJames Feist                 {
117*7e860f15SJohn Edward Broadbent                     asyncResp->res.jsonValue["Location"][0]["PublicationUri"] =
118*7e860f15SJohn Edward Broadbent                         url;
119e51c710eSJames Feist                 }
120*7e860f15SJohn Edward Broadbent             });
12170304cb5SJason M. Bills }
12270304cb5SJason M. Bills 
123*7e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app)
12470304cb5SJason M. Bills {
125*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/")
126*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
127*7e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
128*7e860f15SJohn Edward Broadbent             [](const crow::Request&,
129*7e860f15SJohn Edward Broadbent                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
130*7e860f15SJohn Edward Broadbent                const std::string& registry, const std::string& registry1)
131*7e860f15SJohn Edward Broadbent 
132e51c710eSJames Feist             {
133e51c710eSJames Feist                 const message_registries::Header* header;
134*7e860f15SJohn Edward Broadbent                 std::vector<const message_registries::MessageEntry*>
135*7e860f15SJohn Edward Broadbent                     registryEntries;
136e51c710eSJames Feist                 if (registry == "Base")
137e51c710eSJames Feist                 {
138e51c710eSJames Feist                     header = &message_registries::base::header;
139e51c710eSJames Feist                     for (const message_registries::MessageEntry& entry :
140e51c710eSJames Feist                          message_registries::base::registry)
141e51c710eSJames Feist                     {
142e51c710eSJames Feist                         registryEntries.emplace_back(&entry);
143e51c710eSJames Feist                     }
144e51c710eSJames Feist                 }
145e51c710eSJames Feist                 else if (registry == "TaskEvent")
146e51c710eSJames Feist                 {
147e51c710eSJames Feist                     header = &message_registries::task_event::header;
148e51c710eSJames Feist                     for (const message_registries::MessageEntry& entry :
149e51c710eSJames Feist                          message_registries::task_event::registry)
150e51c710eSJames Feist                     {
151e51c710eSJames Feist                         registryEntries.emplace_back(&entry);
152e51c710eSJames Feist                     }
153e51c710eSJames Feist                 }
154e51c710eSJames Feist                 else if (registry == "OpenBMC")
155e51c710eSJames Feist                 {
156e51c710eSJames Feist                     header = &message_registries::openbmc::header;
157e51c710eSJames Feist                     for (const message_registries::MessageEntry& entry :
158e51c710eSJames Feist                          message_registries::openbmc::registry)
159e51c710eSJames Feist                     {
160e51c710eSJames Feist                         registryEntries.emplace_back(&entry);
161e51c710eSJames Feist                     }
162e51c710eSJames Feist                 }
16374eec26bSSunitha Harish                 else if (registry == "ResourceEvent")
16474eec26bSSunitha Harish                 {
16574eec26bSSunitha Harish                     header = &message_registries::resource_event::header;
16674eec26bSSunitha Harish                     for (const message_registries::MessageEntry& entry :
16774eec26bSSunitha Harish                          message_registries::resource_event::registry)
16874eec26bSSunitha Harish                     {
16974eec26bSSunitha Harish                         registryEntries.emplace_back(&entry);
17074eec26bSSunitha Harish                     }
17174eec26bSSunitha Harish                 }
172e51c710eSJames Feist                 else
173e51c710eSJames Feist                 {
174e51c710eSJames Feist                     messages::resourceNotFound(
1758d1b46d7Szhanghch05                         asyncResp->res,
176*7e860f15SJohn Edward Broadbent                         "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
177*7e860f15SJohn Edward Broadbent                         registry);
178e51c710eSJames Feist                     return;
179e51c710eSJames Feist                 }
180e51c710eSJames Feist 
181e51c710eSJames Feist                 if (registry != registry1)
182e51c710eSJames Feist                 {
183*7e860f15SJohn Edward Broadbent                     messages::resourceNotFound(asyncResp->res, header->type,
184*7e860f15SJohn Edward Broadbent                                                registry1);
185e51c710eSJames Feist                     return;
186e51c710eSJames Feist                 }
187e51c710eSJames Feist 
1888d1b46d7Szhanghch05                 asyncResp->res.jsonValue = {
1898d1b46d7Szhanghch05                     {"@Redfish.Copyright", header->copyright},
190e51c710eSJames Feist                     {"@odata.type", header->type},
191e51c710eSJames Feist                     {"Id", header->id},
192e51c710eSJames Feist                     {"Name", header->name},
193e51c710eSJames Feist                     {"Language", header->language},
194e51c710eSJames Feist                     {"Description", header->description},
195e51c710eSJames Feist                     {"RegistryPrefix", header->registryPrefix},
196e51c710eSJames Feist                     {"RegistryVersion", header->registryVersion},
197e51c710eSJames Feist                     {"OwningEntity", header->owningEntity}};
19870304cb5SJason M. Bills 
199*7e860f15SJohn Edward Broadbent                 nlohmann::json& messageObj =
200*7e860f15SJohn Edward Broadbent                     asyncResp->res.jsonValue["Messages"];
20170304cb5SJason M. Bills 
20270304cb5SJason M. Bills                 // Go through the Message Registry and populate each Message
203*7e860f15SJohn Edward Broadbent                 for (const message_registries::MessageEntry* message :
204*7e860f15SJohn Edward Broadbent                      registryEntries)
20570304cb5SJason M. Bills                 {
206e51c710eSJames Feist                     nlohmann::json& obj = messageObj[message->first];
207e51c710eSJames Feist                     obj = {{"Description", message->second.description},
208e51c710eSJames Feist                            {"Message", message->second.message},
209e51c710eSJames Feist                            {"Severity", message->second.severity},
210e7808c93SGunnar Mills                            {"MessageSeverity", message->second.messageSeverity},
211e51c710eSJames Feist                            {"NumberOfArgs", message->second.numberOfArgs},
212e51c710eSJames Feist                            {"Resolution", message->second.resolution}};
213e51c710eSJames Feist                     if (message->second.numberOfArgs > 0)
21470304cb5SJason M. Bills                     {
21514c8aee2SEd Tanous                         nlohmann::json& messageParamArray = obj["ParamTypes"];
216e51c710eSJames Feist                         for (const char* str : message->second.paramTypes)
21770304cb5SJason M. Bills                         {
21870304cb5SJason M. Bills                             if (str == nullptr)
21970304cb5SJason M. Bills                             {
22070304cb5SJason M. Bills                                 break;
22170304cb5SJason M. Bills                             }
22270304cb5SJason M. Bills                             messageParamArray.push_back(str);
22370304cb5SJason M. Bills                         }
22470304cb5SJason M. Bills                     }
22570304cb5SJason M. Bills                 }
226*7e860f15SJohn Edward Broadbent             });
22770304cb5SJason M. Bills }
22870304cb5SJason M. Bills 
22970304cb5SJason M. Bills } // namespace redfish
230