xref: /openbmc/bmcweb/features/redfish/lib/message_registries.hpp (revision e51c710ec6b369e0bf7f35e9be4f9ba17884d0bd)
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 "node.hpp"
1970304cb5SJason M. Bills #include "registries.hpp"
2070304cb5SJason M. Bills #include "registries/base_message_registry.hpp"
21fbe8378fSJason M. Bills #include "registries/openbmc_message_registry.hpp"
22*e51c710eSJames Feist #include "registries/task_event_message_registry.hpp"
2370304cb5SJason M. Bills 
2470304cb5SJason M. Bills namespace redfish
2570304cb5SJason M. Bills {
2670304cb5SJason M. Bills 
2770304cb5SJason M. Bills class MessageRegistryFileCollection : public Node
2870304cb5SJason M. Bills {
2970304cb5SJason M. Bills   public:
3070304cb5SJason M. Bills     template <typename CrowApp>
3170304cb5SJason M. Bills     MessageRegistryFileCollection(CrowApp &app) :
3270304cb5SJason M. Bills         Node(app, "/redfish/v1/Registries/")
3370304cb5SJason M. Bills     {
3470304cb5SJason M. Bills         entityPrivileges = {
3570304cb5SJason M. Bills             {boost::beast::http::verb::get, {{"Login"}}},
3670304cb5SJason M. Bills             {boost::beast::http::verb::head, {{"Login"}}},
3770304cb5SJason M. Bills             {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
3870304cb5SJason M. Bills             {boost::beast::http::verb::put, {{"ConfigureManager"}}},
3970304cb5SJason M. Bills             {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
4070304cb5SJason M. Bills             {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
4170304cb5SJason M. Bills     }
4270304cb5SJason M. Bills 
4370304cb5SJason M. Bills   private:
4470304cb5SJason M. Bills     /**
4570304cb5SJason M. Bills      * Functions triggers appropriate requests on DBus
4670304cb5SJason M. Bills      */
4770304cb5SJason M. Bills     void doGet(crow::Response &res, const crow::Request &req,
4870304cb5SJason M. Bills                const std::vector<std::string> &params) override
4970304cb5SJason M. Bills     {
5070304cb5SJason M. Bills         // Collections don't include the static data added by SubRoute because
5170304cb5SJason M. Bills         // it has a duplicate entry for members
5214c8aee2SEd Tanous 
5314c8aee2SEd Tanous         res.jsonValue = {
5414c8aee2SEd Tanous             {"@odata.type",
5514c8aee2SEd Tanous              "#MessageRegistryFileCollection.MessageRegistryFileCollection"},
5614c8aee2SEd Tanous             {"@odata.id", "/redfish/v1/Registries"},
5714c8aee2SEd Tanous             {"Name", "MessageRegistryFile Collection"},
5814c8aee2SEd Tanous             {"Description", "Collection of MessageRegistryFiles"},
59*e51c710eSJames Feist             {"Members@odata.count", 3},
6014c8aee2SEd Tanous             {"Members",
6114c8aee2SEd Tanous              {{{"@odata.id", "/redfish/v1/Registries/Base"}},
62*e51c710eSJames Feist               {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}},
6314c8aee2SEd Tanous               {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}};
6414c8aee2SEd Tanous 
6514c8aee2SEd Tanous         res.end();
6670304cb5SJason M. Bills     }
6770304cb5SJason M. Bills };
6870304cb5SJason M. Bills 
69*e51c710eSJames Feist class MessageRegistryFile : public Node
7070304cb5SJason M. Bills {
7170304cb5SJason M. Bills   public:
7270304cb5SJason M. Bills     template <typename CrowApp>
73*e51c710eSJames Feist     MessageRegistryFile(CrowApp &app) :
74*e51c710eSJames Feist         Node(app, "/redfish/v1/Registries/<str>/", std::string())
7570304cb5SJason M. Bills     {
7670304cb5SJason M. Bills         entityPrivileges = {
7770304cb5SJason M. Bills             {boost::beast::http::verb::get, {{"Login"}}},
7870304cb5SJason M. Bills             {boost::beast::http::verb::head, {{"Login"}}},
7970304cb5SJason M. Bills             {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
8070304cb5SJason M. Bills             {boost::beast::http::verb::put, {{"ConfigureManager"}}},
8170304cb5SJason M. Bills             {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
8270304cb5SJason M. Bills             {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
8370304cb5SJason M. Bills     }
8470304cb5SJason M. Bills 
8570304cb5SJason M. Bills   private:
8670304cb5SJason M. Bills     void doGet(crow::Response &res, const crow::Request &req,
8770304cb5SJason M. Bills                const std::vector<std::string> &params) override
8870304cb5SJason M. Bills     {
89*e51c710eSJames Feist         if (params.size() != 1)
90*e51c710eSJames Feist         {
91*e51c710eSJames Feist             messages::internalError(res);
92*e51c710eSJames Feist             res.end();
93*e51c710eSJames Feist             return;
94*e51c710eSJames Feist         }
95*e51c710eSJames Feist 
96*e51c710eSJames Feist         const std::string &registry = params[0];
97*e51c710eSJames Feist         const message_registries::Header *header;
98*e51c710eSJames Feist         std::string dmtf = "DMTF ";
99*e51c710eSJames Feist         const char *url = nullptr;
100*e51c710eSJames Feist 
101*e51c710eSJames Feist         if (registry == "Base")
102*e51c710eSJames Feist         {
103*e51c710eSJames Feist             header = &message_registries::base::header;
104*e51c710eSJames Feist             url = message_registries::base::url;
105*e51c710eSJames Feist         }
106*e51c710eSJames Feist         else if (registry == "TaskEvent")
107*e51c710eSJames Feist         {
108*e51c710eSJames Feist             header = &message_registries::task_event::header;
109*e51c710eSJames Feist             url = message_registries::task_event::url;
110*e51c710eSJames Feist         }
111*e51c710eSJames Feist         else if (registry == "OpenBMC")
112*e51c710eSJames Feist         {
113*e51c710eSJames Feist             header = &message_registries::openbmc::header;
114*e51c710eSJames Feist             dmtf.clear();
115*e51c710eSJames Feist         }
116*e51c710eSJames Feist         else
117*e51c710eSJames Feist         {
118*e51c710eSJames Feist             messages::resourceNotFound(
119*e51c710eSJames Feist                 res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
120*e51c710eSJames Feist                 registry);
121*e51c710eSJames Feist             res.end();
122*e51c710eSJames Feist             return;
123*e51c710eSJames Feist         }
124*e51c710eSJames Feist 
12514c8aee2SEd Tanous         res.jsonValue = {
126*e51c710eSJames Feist             {"@odata.id", "/redfish/v1/Registries/" + registry},
12714c8aee2SEd Tanous             {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"},
128*e51c710eSJames Feist             {"Name", registry + " Message Registry File"},
129*e51c710eSJames Feist             {"Description",
130*e51c710eSJames Feist              dmtf + registry + " Message Registry File Location"},
131*e51c710eSJames Feist             {"Id", header->registryPrefix},
132*e51c710eSJames Feist             {"Registry", header->id},
13314c8aee2SEd Tanous             {"Languages", {"en"}},
13414c8aee2SEd Tanous             {"Languages@odata.count", 1},
13514c8aee2SEd Tanous             {"Location",
13614c8aee2SEd Tanous              {{{"Language", "en"},
137*e51c710eSJames Feist                {"Uri",
138*e51c710eSJames Feist                 "/redfish/v1/Registries/" + registry + "/" + registry}}}},
13914c8aee2SEd Tanous             {"Location@odata.count", 1}};
140*e51c710eSJames Feist 
141*e51c710eSJames Feist         if (url != nullptr)
142*e51c710eSJames Feist         {
143*e51c710eSJames Feist             res.jsonValue["Location"][0]["PublicationUri"] = url;
144*e51c710eSJames Feist         }
145*e51c710eSJames Feist 
14614c8aee2SEd Tanous         res.end();
14770304cb5SJason M. Bills     }
14870304cb5SJason M. Bills };
14970304cb5SJason M. Bills 
150*e51c710eSJames Feist class MessageRegistry : public Node
15170304cb5SJason M. Bills {
15270304cb5SJason M. Bills   public:
15370304cb5SJason M. Bills     template <typename CrowApp>
154*e51c710eSJames Feist     MessageRegistry(CrowApp &app) :
155*e51c710eSJames Feist         Node(app, "/redfish/v1/Registries/<str>/<str>/", std::string(),
156*e51c710eSJames Feist              std::string())
15770304cb5SJason M. Bills     {
15870304cb5SJason M. Bills         entityPrivileges = {
15970304cb5SJason M. Bills             {boost::beast::http::verb::get, {{"Login"}}},
16070304cb5SJason M. Bills             {boost::beast::http::verb::head, {{"Login"}}},
16170304cb5SJason M. Bills             {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
16270304cb5SJason M. Bills             {boost::beast::http::verb::put, {{"ConfigureManager"}}},
16370304cb5SJason M. Bills             {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
16470304cb5SJason M. Bills             {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
16570304cb5SJason M. Bills     }
16670304cb5SJason M. Bills 
16770304cb5SJason M. Bills   private:
16870304cb5SJason M. Bills     void doGet(crow::Response &res, const crow::Request &req,
16970304cb5SJason M. Bills                const std::vector<std::string> &params) override
17070304cb5SJason M. Bills     {
171*e51c710eSJames Feist         if (params.size() != 2)
172*e51c710eSJames Feist         {
173*e51c710eSJames Feist             messages::internalError(res);
174*e51c710eSJames Feist             res.end();
175*e51c710eSJames Feist             return;
176*e51c710eSJames Feist         }
177*e51c710eSJames Feist 
178*e51c710eSJames Feist         const std::string &registry = params[0];
179*e51c710eSJames Feist         const std::string &registry1 = params[1];
180*e51c710eSJames Feist 
181*e51c710eSJames Feist         const message_registries::Header *header;
182*e51c710eSJames Feist         std::vector<const message_registries::MessageEntry *> registryEntries;
183*e51c710eSJames Feist         if (registry == "Base")
184*e51c710eSJames Feist         {
185*e51c710eSJames Feist             header = &message_registries::base::header;
186*e51c710eSJames Feist             for (const message_registries::MessageEntry &entry :
187*e51c710eSJames Feist                  message_registries::base::registry)
188*e51c710eSJames Feist             {
189*e51c710eSJames Feist                 registryEntries.emplace_back(&entry);
190*e51c710eSJames Feist             }
191*e51c710eSJames Feist         }
192*e51c710eSJames Feist         else if (registry == "TaskEvent")
193*e51c710eSJames Feist         {
194*e51c710eSJames Feist             header = &message_registries::task_event::header;
195*e51c710eSJames Feist             for (const message_registries::MessageEntry &entry :
196*e51c710eSJames Feist                  message_registries::task_event::registry)
197*e51c710eSJames Feist             {
198*e51c710eSJames Feist                 registryEntries.emplace_back(&entry);
199*e51c710eSJames Feist             }
200*e51c710eSJames Feist         }
201*e51c710eSJames Feist         else if (registry == "OpenBMC")
202*e51c710eSJames Feist         {
203*e51c710eSJames Feist             header = &message_registries::openbmc::header;
204*e51c710eSJames Feist             for (const message_registries::MessageEntry &entry :
205*e51c710eSJames Feist                  message_registries::openbmc::registry)
206*e51c710eSJames Feist             {
207*e51c710eSJames Feist                 registryEntries.emplace_back(&entry);
208*e51c710eSJames Feist             }
209*e51c710eSJames Feist         }
210*e51c710eSJames Feist         else
211*e51c710eSJames Feist         {
212*e51c710eSJames Feist             messages::resourceNotFound(
213*e51c710eSJames Feist                 res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile",
214*e51c710eSJames Feist                 registry);
215*e51c710eSJames Feist             res.end();
216*e51c710eSJames Feist             return;
217*e51c710eSJames Feist         }
218*e51c710eSJames Feist 
219*e51c710eSJames Feist         if (registry != registry1)
220*e51c710eSJames Feist         {
221*e51c710eSJames Feist             messages::resourceNotFound(res, header->type, registry1);
222*e51c710eSJames Feist             res.end();
223*e51c710eSJames Feist             return;
224*e51c710eSJames Feist         }
225*e51c710eSJames Feist 
226*e51c710eSJames Feist         res.jsonValue = {{"@Redfish.Copyright", header->copyright},
227*e51c710eSJames Feist                          {"@odata.type", header->type},
228*e51c710eSJames Feist                          {"Id", header->id},
229*e51c710eSJames Feist                          {"Name", header->name},
230*e51c710eSJames Feist                          {"Language", header->language},
231*e51c710eSJames Feist                          {"Description", header->description},
232*e51c710eSJames Feist                          {"RegistryPrefix", header->registryPrefix},
233*e51c710eSJames Feist                          {"RegistryVersion", header->registryVersion},
234*e51c710eSJames Feist                          {"OwningEntity", header->owningEntity}};
23570304cb5SJason M. Bills 
23614c8aee2SEd Tanous         nlohmann::json &messageObj = res.jsonValue["Messages"];
23770304cb5SJason M. Bills 
23870304cb5SJason M. Bills         // Go through the Message Registry and populate each Message
239*e51c710eSJames Feist         for (const message_registries::MessageEntry *message : registryEntries)
24070304cb5SJason M. Bills         {
241*e51c710eSJames Feist             nlohmann::json &obj = messageObj[message->first];
242*e51c710eSJames Feist             obj = {{"Description", message->second.description},
243*e51c710eSJames Feist                    {"Message", message->second.message},
244*e51c710eSJames Feist                    {"Severity", message->second.severity},
245*e51c710eSJames Feist                    {"NumberOfArgs", message->second.numberOfArgs},
246*e51c710eSJames Feist                    {"Resolution", message->second.resolution}};
247*e51c710eSJames Feist             if (message->second.numberOfArgs > 0)
24870304cb5SJason M. Bills             {
24914c8aee2SEd Tanous                 nlohmann::json &messageParamArray = obj["ParamTypes"];
250*e51c710eSJames Feist                 for (const char *str : message->second.paramTypes)
25170304cb5SJason M. Bills                 {
25270304cb5SJason M. Bills                     if (str == nullptr)
25370304cb5SJason M. Bills                     {
25470304cb5SJason M. Bills                         break;
25570304cb5SJason M. Bills                     }
25670304cb5SJason M. Bills                     messageParamArray.push_back(str);
25770304cb5SJason M. Bills                 }
25870304cb5SJason M. Bills             }
25970304cb5SJason M. Bills         }
26014c8aee2SEd Tanous         res.end();
26170304cb5SJason M. Bills     }
26270304cb5SJason M. Bills };
26370304cb5SJason M. Bills 
26470304cb5SJason M. Bills } // namespace redfish
265