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