xref: /openbmc/bmcweb/features/redfish/lib/message_registries.hpp (revision 543f44000a992870ff76e76888dd589a3a31ed4e)
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>
25ed398213SEd Tanous #include <registries/privilege_registry.hpp>
267e860f15SJohn Edward Broadbent 
2770304cb5SJason M. Bills namespace redfish
2870304cb5SJason M. Bills {
2970304cb5SJason M. Bills 
30dff07827SJohn Edward Broadbent inline void handleMessageRegistryFileCollectionGet(
31dff07827SJohn Edward Broadbent     const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
3270304cb5SJason M. Bills {
337e860f15SJohn Edward Broadbent     // Collections don't include the static data added by SubRoute
347e860f15SJohn Edward Broadbent     // because it has a duplicate entry for members
3514c8aee2SEd Tanous 
368d1b46d7Szhanghch05     asyncResp->res.jsonValue = {
370fda0f12SGeorge Liu         {"@odata.type",
380fda0f12SGeorge Liu          "#MessageRegistryFileCollection.MessageRegistryFileCollection"},
3914c8aee2SEd Tanous         {"@odata.id", "/redfish/v1/Registries"},
4014c8aee2SEd Tanous         {"Name", "MessageRegistryFile Collection"},
4114c8aee2SEd Tanous         {"Description", "Collection of MessageRegistryFiles"},
4274eec26bSSunitha Harish         {"Members@odata.count", 4},
4314c8aee2SEd Tanous         {"Members",
4414c8aee2SEd Tanous          {{{"@odata.id", "/redfish/v1/Registries/Base"}},
45e51c710eSJames Feist           {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
4674eec26bSSunitha Harish           {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
4714c8aee2SEd Tanous           {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
4870304cb5SJason M. Bills }
4970304cb5SJason M. Bills 
50dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app)
5170304cb5SJason M. Bills {
52dff07827SJohn Edward Broadbent     /**
53dff07827SJohn Edward Broadbent      * Functions triggers appropriate requests on DBus
54dff07827SJohn Edward Broadbent      */
55dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/")
56dff07827SJohn Edward Broadbent         .privileges(redfish::privileges::getMessageRegistryFileCollection)
577e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
58dff07827SJohn Edward Broadbent             handleMessageRegistryFileCollectionGet);
59dff07827SJohn Edward Broadbent }
60dff07827SJohn Edward Broadbent 
61dff07827SJohn Edward Broadbent inline void handleMessageRoutesMessageRegistryFileGet(
62dff07827SJohn Edward Broadbent     const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
63dff07827SJohn Edward Broadbent     const std::string& registry)
64dff07827SJohn Edward Broadbent {
65*543f4400SEd Tanous     const message_registries::Header* header = nullptr;
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(
92dff07827SJohn Edward Broadbent             asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
937e860f15SJohn Edward Broadbent             registry);
94e51c710eSJames Feist         return;
95e51c710eSJames Feist     }
96e51c710eSJames Feist 
978d1b46d7Szhanghch05     asyncResp->res.jsonValue = {
98e51c710eSJames Feist         {"@odata.id", "/redfish/v1/Registries/" + registry},
99dff07827SJohn Edward Broadbent         {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
100e51c710eSJames Feist         {"Name", registry + " Message Registry File"},
101dff07827SJohn Edward Broadbent         {"Description", dmtf + registry + " Message Registry File Location"},
102e51c710eSJames Feist         {"Id", header->registryPrefix},
103e51c710eSJames Feist         {"Registry", header->id},
10414c8aee2SEd Tanous         {"Languages", {"en"}},
10514c8aee2SEd Tanous         {"Languages@odata.count", 1},
10614c8aee2SEd Tanous         {"Location",
10714c8aee2SEd Tanous          {{{"Language", "en"},
108dff07827SJohn Edward Broadbent            {"Uri", "/redfish/v1/Registries/" + registry + "/" + registry}}}},
10914c8aee2SEd Tanous         {"Location@odata.count", 1}};
110e51c710eSJames Feist 
111e51c710eSJames Feist     if (url != nullptr)
112e51c710eSJames Feist     {
113dff07827SJohn Edward Broadbent         asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = url;
114e51c710eSJames Feist     }
11570304cb5SJason M. Bills }
11670304cb5SJason M. Bills 
117dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app)
11870304cb5SJason M. Bills {
119dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/")
120ed398213SEd Tanous         .privileges(redfish::privileges::getMessageRegistryFile)
1217e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
122dff07827SJohn Edward Broadbent             handleMessageRoutesMessageRegistryFileGet);
123dff07827SJohn Edward Broadbent }
124dff07827SJohn Edward Broadbent 
125dff07827SJohn Edward Broadbent inline void handleMessageRegistryGet(
126dff07827SJohn Edward Broadbent     const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
1276e8c18f0SJohn Edward Broadbent     const std::string& registry, const std::string& registryMatch)
1287e860f15SJohn Edward Broadbent 
129e51c710eSJames Feist {
130*543f4400SEd Tanous     const message_registries::Header* header = nullptr;
131dff07827SJohn Edward Broadbent     std::vector<const message_registries::MessageEntry*> registryEntries;
132e51c710eSJames Feist     if (registry == "Base")
133e51c710eSJames Feist     {
134e51c710eSJames Feist         header = &message_registries::base::header;
135e51c710eSJames Feist         for (const message_registries::MessageEntry& entry :
136e51c710eSJames Feist              message_registries::base::registry)
137e51c710eSJames Feist         {
138e51c710eSJames Feist             registryEntries.emplace_back(&entry);
139e51c710eSJames Feist         }
140e51c710eSJames Feist     }
141e51c710eSJames Feist     else if (registry == "TaskEvent")
142e51c710eSJames Feist     {
143e51c710eSJames Feist         header = &message_registries::task_event::header;
144e51c710eSJames Feist         for (const message_registries::MessageEntry& entry :
145e51c710eSJames Feist              message_registries::task_event::registry)
146e51c710eSJames Feist         {
147e51c710eSJames Feist             registryEntries.emplace_back(&entry);
148e51c710eSJames Feist         }
149e51c710eSJames Feist     }
150e51c710eSJames Feist     else if (registry == "OpenBMC")
151e51c710eSJames Feist     {
152e51c710eSJames Feist         header = &message_registries::openbmc::header;
153e51c710eSJames Feist         for (const message_registries::MessageEntry& entry :
154e51c710eSJames Feist              message_registries::openbmc::registry)
155e51c710eSJames Feist         {
156e51c710eSJames Feist             registryEntries.emplace_back(&entry);
157e51c710eSJames Feist         }
158e51c710eSJames Feist     }
15974eec26bSSunitha Harish     else if (registry == "ResourceEvent")
16074eec26bSSunitha Harish     {
16174eec26bSSunitha Harish         header = &message_registries::resource_event::header;
16274eec26bSSunitha Harish         for (const message_registries::MessageEntry& entry :
16374eec26bSSunitha Harish              message_registries::resource_event::registry)
16474eec26bSSunitha Harish         {
16574eec26bSSunitha Harish             registryEntries.emplace_back(&entry);
16674eec26bSSunitha Harish         }
16774eec26bSSunitha Harish     }
168e51c710eSJames Feist     else
169e51c710eSJames Feist     {
170e51c710eSJames Feist         messages::resourceNotFound(
171dff07827SJohn Edward Broadbent             asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
1727e860f15SJohn Edward Broadbent             registry);
173e51c710eSJames Feist         return;
174e51c710eSJames Feist     }
175e51c710eSJames Feist 
1766e8c18f0SJohn Edward Broadbent     if (registry != registryMatch)
177e51c710eSJames Feist     {
1786e8c18f0SJohn Edward Broadbent         messages::resourceNotFound(asyncResp->res, header->type, registryMatch);
179e51c710eSJames Feist         return;
180e51c710eSJames Feist     }
181e51c710eSJames Feist 
182dff07827SJohn Edward Broadbent     asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright},
183e51c710eSJames Feist                                 {"@odata.type", header->type},
184e51c710eSJames Feist                                 {"Id", header->id},
185e51c710eSJames Feist                                 {"Name", header->name},
186e51c710eSJames Feist                                 {"Language", header->language},
187e51c710eSJames Feist                                 {"Description", header->description},
188e51c710eSJames Feist                                 {"RegistryPrefix", header->registryPrefix},
189e51c710eSJames Feist                                 {"RegistryVersion", header->registryVersion},
190e51c710eSJames Feist                                 {"OwningEntity", header->owningEntity}};
19170304cb5SJason M. Bills 
192dff07827SJohn Edward Broadbent     nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"];
19370304cb5SJason M. Bills 
19470304cb5SJason M. Bills     // Go through the Message Registry and populate each Message
195dff07827SJohn Edward Broadbent     for (const message_registries::MessageEntry* message : registryEntries)
19670304cb5SJason M. Bills     {
197e51c710eSJames Feist         nlohmann::json& obj = messageObj[message->first];
198e51c710eSJames Feist         obj = {{"Description", message->second.description},
199e51c710eSJames Feist                {"Message", message->second.message},
200e51c710eSJames Feist                {"Severity", message->second.severity},
201e7808c93SGunnar Mills                {"MessageSeverity", message->second.messageSeverity},
202e51c710eSJames Feist                {"NumberOfArgs", message->second.numberOfArgs},
203e51c710eSJames Feist                {"Resolution", message->second.resolution}};
204e51c710eSJames Feist         if (message->second.numberOfArgs > 0)
20570304cb5SJason M. Bills         {
20614c8aee2SEd Tanous             nlohmann::json& messageParamArray = obj["ParamTypes"];
207938f2568SEd Tanous             messageParamArray = nlohmann::json::array();
208e51c710eSJames Feist             for (const char* str : message->second.paramTypes)
20970304cb5SJason M. Bills             {
21070304cb5SJason M. Bills                 if (str == nullptr)
21170304cb5SJason M. Bills                 {
21270304cb5SJason M. Bills                     break;
21370304cb5SJason M. Bills                 }
21470304cb5SJason M. Bills                 messageParamArray.push_back(str);
21570304cb5SJason M. Bills             }
21670304cb5SJason M. Bills         }
21770304cb5SJason M. Bills     }
21870304cb5SJason M. Bills }
21970304cb5SJason M. Bills 
220dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app)
221dff07827SJohn Edward Broadbent {
222dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/")
223dff07827SJohn Edward Broadbent         .privileges(redfish::privileges::getMessageRegistryFile)
224dff07827SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(handleMessageRegistryGet);
225dff07827SJohn Edward Broadbent }
22670304cb5SJason M. Bills } // namespace redfish
227