xref: /openbmc/bmcweb/features/redfish/lib/message_registries.hpp (revision 104f09c95af2b3068e7afd655e4cebcad2bf0617)
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(
31*104f09c9SEd Tanous     const crow::Request& /*req*/,
32*104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
3370304cb5SJason M. Bills {
347e860f15SJohn Edward Broadbent     // Collections don't include the static data added by SubRoute
357e860f15SJohn Edward Broadbent     // because it has a duplicate entry for members
3614c8aee2SEd Tanous 
378d1b46d7Szhanghch05     asyncResp->res.jsonValue = {
380fda0f12SGeorge Liu         {"@odata.type",
390fda0f12SGeorge Liu          "#MessageRegistryFileCollection.MessageRegistryFileCollection"},
4014c8aee2SEd Tanous         {"@odata.id", "/redfish/v1/Registries"},
4114c8aee2SEd Tanous         {"Name", "MessageRegistryFile Collection"},
4214c8aee2SEd Tanous         {"Description", "Collection of MessageRegistryFiles"},
4374eec26bSSunitha Harish         {"Members@odata.count", 4},
4414c8aee2SEd Tanous         {"Members",
4514c8aee2SEd Tanous          {{{"@odata.id", "/redfish/v1/Registries/Base"}},
46e51c710eSJames Feist           {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
4774eec26bSSunitha Harish           {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}},
4814c8aee2SEd Tanous           {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
4970304cb5SJason M. Bills }
5070304cb5SJason M. Bills 
51dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app)
5270304cb5SJason M. Bills {
53dff07827SJohn Edward Broadbent     /**
54dff07827SJohn Edward Broadbent      * Functions triggers appropriate requests on DBus
55dff07827SJohn Edward Broadbent      */
56dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/")
57dff07827SJohn Edward Broadbent         .privileges(redfish::privileges::getMessageRegistryFileCollection)
587e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
59dff07827SJohn Edward Broadbent             handleMessageRegistryFileCollectionGet);
60dff07827SJohn Edward Broadbent }
61dff07827SJohn Edward Broadbent 
62dff07827SJohn Edward Broadbent inline void handleMessageRoutesMessageRegistryFileGet(
63*104f09c9SEd Tanous     const crow::Request& /*req*/,
64*104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
65dff07827SJohn Edward Broadbent     const std::string& registry)
66dff07827SJohn Edward Broadbent {
67543f4400SEd Tanous     const message_registries::Header* header = nullptr;
68e51c710eSJames Feist     std::string dmtf = "DMTF ";
69e51c710eSJames Feist     const char* url = nullptr;
70e51c710eSJames Feist 
71e51c710eSJames Feist     if (registry == "Base")
72e51c710eSJames Feist     {
73e51c710eSJames Feist         header = &message_registries::base::header;
74e51c710eSJames Feist         url = message_registries::base::url;
75e51c710eSJames Feist     }
76e51c710eSJames Feist     else if (registry == "TaskEvent")
77e51c710eSJames Feist     {
78e51c710eSJames Feist         header = &message_registries::task_event::header;
79e51c710eSJames Feist         url = message_registries::task_event::url;
80e51c710eSJames Feist     }
81e51c710eSJames Feist     else if (registry == "OpenBMC")
82e51c710eSJames Feist     {
83e51c710eSJames Feist         header = &message_registries::openbmc::header;
84e51c710eSJames Feist         dmtf.clear();
85e51c710eSJames Feist     }
8674eec26bSSunitha Harish     else if (registry == "ResourceEvent")
8774eec26bSSunitha Harish     {
8874eec26bSSunitha Harish         header = &message_registries::resource_event::header;
8974eec26bSSunitha Harish         url = message_registries::resource_event::url;
9074eec26bSSunitha Harish     }
91e51c710eSJames Feist     else
92e51c710eSJames Feist     {
93e51c710eSJames Feist         messages::resourceNotFound(
94dff07827SJohn Edward Broadbent             asyncResp->res, "#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},
101dff07827SJohn Edward Broadbent         {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
102e51c710eSJames Feist         {"Name", registry + " Message Registry File"},
103dff07827SJohn Edward Broadbent         {"Description", dmtf + registry + " Message Registry File Location"},
104e51c710eSJames Feist         {"Id", header->registryPrefix},
105e51c710eSJames Feist         {"Registry", header->id},
10614c8aee2SEd Tanous         {"Languages", {"en"}},
10714c8aee2SEd Tanous         {"Languages@odata.count", 1},
10814c8aee2SEd Tanous         {"Location",
10914c8aee2SEd Tanous          {{{"Language", "en"},
110dff07827SJohn Edward Broadbent            {"Uri", "/redfish/v1/Registries/" + registry + "/" + registry}}}},
11114c8aee2SEd Tanous         {"Location@odata.count", 1}};
112e51c710eSJames Feist 
113e51c710eSJames Feist     if (url != nullptr)
114e51c710eSJames Feist     {
115dff07827SJohn Edward Broadbent         asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = url;
116e51c710eSJames Feist     }
11770304cb5SJason M. Bills }
11870304cb5SJason M. Bills 
119dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app)
12070304cb5SJason M. Bills {
121dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/")
122ed398213SEd Tanous         .privileges(redfish::privileges::getMessageRegistryFile)
1237e860f15SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(
124dff07827SJohn Edward Broadbent             handleMessageRoutesMessageRegistryFileGet);
125dff07827SJohn Edward Broadbent }
126dff07827SJohn Edward Broadbent 
127dff07827SJohn Edward Broadbent inline void handleMessageRegistryGet(
128*104f09c9SEd Tanous     const crow::Request& /*req*/,
129*104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
1306e8c18f0SJohn Edward Broadbent     const std::string& registry, const std::string& registryMatch)
1317e860f15SJohn Edward Broadbent 
132e51c710eSJames Feist {
133543f4400SEd Tanous     const message_registries::Header* header = nullptr;
134dff07827SJohn Edward Broadbent     std::vector<const message_registries::MessageEntry*> registryEntries;
135e51c710eSJames Feist     if (registry == "Base")
136e51c710eSJames Feist     {
137e51c710eSJames Feist         header = &message_registries::base::header;
138e51c710eSJames Feist         for (const message_registries::MessageEntry& entry :
139e51c710eSJames Feist              message_registries::base::registry)
140e51c710eSJames Feist         {
141e51c710eSJames Feist             registryEntries.emplace_back(&entry);
142e51c710eSJames Feist         }
143e51c710eSJames Feist     }
144e51c710eSJames Feist     else if (registry == "TaskEvent")
145e51c710eSJames Feist     {
146e51c710eSJames Feist         header = &message_registries::task_event::header;
147e51c710eSJames Feist         for (const message_registries::MessageEntry& entry :
148e51c710eSJames Feist              message_registries::task_event::registry)
149e51c710eSJames Feist         {
150e51c710eSJames Feist             registryEntries.emplace_back(&entry);
151e51c710eSJames Feist         }
152e51c710eSJames Feist     }
153e51c710eSJames Feist     else if (registry == "OpenBMC")
154e51c710eSJames Feist     {
155e51c710eSJames Feist         header = &message_registries::openbmc::header;
156e51c710eSJames Feist         for (const message_registries::MessageEntry& entry :
157e51c710eSJames Feist              message_registries::openbmc::registry)
158e51c710eSJames Feist         {
159e51c710eSJames Feist             registryEntries.emplace_back(&entry);
160e51c710eSJames Feist         }
161e51c710eSJames Feist     }
16274eec26bSSunitha Harish     else if (registry == "ResourceEvent")
16374eec26bSSunitha Harish     {
16474eec26bSSunitha Harish         header = &message_registries::resource_event::header;
16574eec26bSSunitha Harish         for (const message_registries::MessageEntry& entry :
16674eec26bSSunitha Harish              message_registries::resource_event::registry)
16774eec26bSSunitha Harish         {
16874eec26bSSunitha Harish             registryEntries.emplace_back(&entry);
16974eec26bSSunitha Harish         }
17074eec26bSSunitha Harish     }
171e51c710eSJames Feist     else
172e51c710eSJames Feist     {
173e51c710eSJames Feist         messages::resourceNotFound(
174dff07827SJohn Edward Broadbent             asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
1757e860f15SJohn Edward Broadbent             registry);
176e51c710eSJames Feist         return;
177e51c710eSJames Feist     }
178e51c710eSJames Feist 
1796e8c18f0SJohn Edward Broadbent     if (registry != registryMatch)
180e51c710eSJames Feist     {
1816e8c18f0SJohn Edward Broadbent         messages::resourceNotFound(asyncResp->res, header->type, registryMatch);
182e51c710eSJames Feist         return;
183e51c710eSJames Feist     }
184e51c710eSJames Feist 
185dff07827SJohn Edward Broadbent     asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright},
186e51c710eSJames Feist                                 {"@odata.type", header->type},
187e51c710eSJames Feist                                 {"Id", header->id},
188e51c710eSJames Feist                                 {"Name", header->name},
189e51c710eSJames Feist                                 {"Language", header->language},
190e51c710eSJames Feist                                 {"Description", header->description},
191e51c710eSJames Feist                                 {"RegistryPrefix", header->registryPrefix},
192e51c710eSJames Feist                                 {"RegistryVersion", header->registryVersion},
193e51c710eSJames Feist                                 {"OwningEntity", header->owningEntity}};
19470304cb5SJason M. Bills 
195dff07827SJohn Edward Broadbent     nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"];
19670304cb5SJason M. Bills 
19770304cb5SJason M. Bills     // Go through the Message Registry and populate each Message
198dff07827SJohn Edward Broadbent     for (const message_registries::MessageEntry* message : registryEntries)
19970304cb5SJason M. Bills     {
200e51c710eSJames Feist         nlohmann::json& obj = messageObj[message->first];
201e51c710eSJames Feist         obj = {{"Description", message->second.description},
202e51c710eSJames Feist                {"Message", message->second.message},
203e51c710eSJames Feist                {"Severity", message->second.severity},
204e7808c93SGunnar Mills                {"MessageSeverity", message->second.messageSeverity},
205e51c710eSJames Feist                {"NumberOfArgs", message->second.numberOfArgs},
206e51c710eSJames Feist                {"Resolution", message->second.resolution}};
207e51c710eSJames Feist         if (message->second.numberOfArgs > 0)
20870304cb5SJason M. Bills         {
20914c8aee2SEd Tanous             nlohmann::json& messageParamArray = obj["ParamTypes"];
210938f2568SEd Tanous             messageParamArray = nlohmann::json::array();
211e51c710eSJames Feist             for (const char* str : message->second.paramTypes)
21270304cb5SJason M. Bills             {
21370304cb5SJason M. Bills                 if (str == nullptr)
21470304cb5SJason M. Bills                 {
21570304cb5SJason M. Bills                     break;
21670304cb5SJason M. Bills                 }
21770304cb5SJason M. Bills                 messageParamArray.push_back(str);
21870304cb5SJason M. Bills             }
21970304cb5SJason M. Bills         }
22070304cb5SJason M. Bills     }
22170304cb5SJason M. Bills }
22270304cb5SJason M. Bills 
223dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app)
224dff07827SJohn Edward Broadbent {
225dff07827SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/")
226dff07827SJohn Edward Broadbent         .privileges(redfish::privileges::getMessageRegistryFile)
227dff07827SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(handleMessageRegistryGet);
228dff07827SJohn Edward Broadbent }
22970304cb5SJason M. Bills } // namespace redfish
230