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> 2545ca1b86SEd Tanous #include <query.hpp> 26ed398213SEd Tanous #include <registries/privilege_registry.hpp> 277e860f15SJohn Edward Broadbent 28*613dabeaSEd Tanous #include <array> 29*613dabeaSEd Tanous 3070304cb5SJason M. Bills namespace redfish 3170304cb5SJason M. Bills { 3270304cb5SJason M. Bills 33dff07827SJohn Edward Broadbent inline void handleMessageRegistryFileCollectionGet( 3445ca1b86SEd Tanous crow::App& app, const crow::Request& req, 35104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 3670304cb5SJason M. Bills { 373ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 3845ca1b86SEd Tanous { 3945ca1b86SEd Tanous return; 4045ca1b86SEd Tanous } 417e860f15SJohn Edward Broadbent // Collections don't include the static data added by SubRoute 427e860f15SJohn Edward Broadbent // because it has a duplicate entry for members 4314c8aee2SEd Tanous 441476687dSEd Tanous asyncResp->res.jsonValue["@odata.type"] = 451476687dSEd Tanous "#MessageRegistryFileCollection.MessageRegistryFileCollection"; 461476687dSEd Tanous asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Registries"; 471476687dSEd Tanous asyncResp->res.jsonValue["Name"] = "MessageRegistryFile Collection"; 481476687dSEd Tanous asyncResp->res.jsonValue["Description"] = 491476687dSEd Tanous "Collection of MessageRegistryFiles"; 501476687dSEd Tanous asyncResp->res.jsonValue["Members@odata.count"] = 4; 51*613dabeaSEd Tanous 52*613dabeaSEd Tanous nlohmann::json& members = asyncResp->res.jsonValue["Members"]; 53*613dabeaSEd Tanous for (const char* memberName : 54*613dabeaSEd Tanous std::to_array({"Base", "TaskEvent", "ResourceEvent", "OpenBMC"})) 55*613dabeaSEd Tanous { 56*613dabeaSEd Tanous nlohmann::json::object_t member; 57*613dabeaSEd Tanous member["@odata.id"] = crow::utility::urlFromPieces( 58*613dabeaSEd Tanous "redfish", "v1", "Registries", memberName); 59*613dabeaSEd Tanous members.emplace_back(std::move(member)); 60*613dabeaSEd Tanous } 6170304cb5SJason M. Bills } 6270304cb5SJason M. Bills 63dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app) 6470304cb5SJason M. Bills { 65dff07827SJohn Edward Broadbent /** 66dff07827SJohn Edward Broadbent * Functions triggers appropriate requests on DBus 67dff07827SJohn Edward Broadbent */ 68dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/") 69dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFileCollection) 7045ca1b86SEd Tanous .methods(boost::beast::http::verb::get)(std::bind_front( 7145ca1b86SEd Tanous handleMessageRegistryFileCollectionGet, std::ref(app))); 72dff07827SJohn Edward Broadbent } 73dff07827SJohn Edward Broadbent 74dff07827SJohn Edward Broadbent inline void handleMessageRoutesMessageRegistryFileGet( 7545ca1b86SEd Tanous crow::App& app, const crow::Request& req, 76104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 77dff07827SJohn Edward Broadbent const std::string& registry) 78dff07827SJohn Edward Broadbent { 793ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 8045ca1b86SEd Tanous { 8145ca1b86SEd Tanous return; 8245ca1b86SEd Tanous } 83fffb8c1fSEd Tanous const registries::Header* header = nullptr; 84e51c710eSJames Feist std::string dmtf = "DMTF "; 85e51c710eSJames Feist const char* url = nullptr; 86e51c710eSJames Feist 87e51c710eSJames Feist if (registry == "Base") 88e51c710eSJames Feist { 89fffb8c1fSEd Tanous header = ®istries::base::header; 90fffb8c1fSEd Tanous url = registries::base::url; 91e51c710eSJames Feist } 92e51c710eSJames Feist else if (registry == "TaskEvent") 93e51c710eSJames Feist { 94fffb8c1fSEd Tanous header = ®istries::task_event::header; 95fffb8c1fSEd Tanous url = registries::task_event::url; 96e51c710eSJames Feist } 97e51c710eSJames Feist else if (registry == "OpenBMC") 98e51c710eSJames Feist { 99fffb8c1fSEd Tanous header = ®istries::openbmc::header; 100e51c710eSJames Feist dmtf.clear(); 101e51c710eSJames Feist } 10274eec26bSSunitha Harish else if (registry == "ResourceEvent") 10374eec26bSSunitha Harish { 104fffb8c1fSEd Tanous header = ®istries::resource_event::header; 105fffb8c1fSEd Tanous url = registries::resource_event::url; 10674eec26bSSunitha Harish } 107e51c710eSJames Feist else 108e51c710eSJames Feist { 109d8a5d5d8SJiaqing Zhao messages::resourceNotFound(asyncResp->res, "MessageRegistryFile", 1107e860f15SJohn Edward Broadbent registry); 111e51c710eSJames Feist return; 112e51c710eSJames Feist } 113e51c710eSJames Feist 1141476687dSEd Tanous asyncResp->res.jsonValue["@odata.id"] = 1151476687dSEd Tanous "/redfish/v1/Registries/" + registry; 1161476687dSEd Tanous asyncResp->res.jsonValue["@odata.type"] = 1171476687dSEd Tanous "#MessageRegistryFile.v1_1_0.MessageRegistryFile"; 1181476687dSEd Tanous asyncResp->res.jsonValue["Name"] = registry + " Message Registry File"; 1191476687dSEd Tanous asyncResp->res.jsonValue["Description"] = 1201476687dSEd Tanous dmtf + registry + " Message Registry File Location"; 1211476687dSEd Tanous asyncResp->res.jsonValue["Id"] = header->registryPrefix; 1221476687dSEd Tanous asyncResp->res.jsonValue["Registry"] = header->id; 123*613dabeaSEd Tanous nlohmann::json::array_t languages; 124*613dabeaSEd Tanous languages.push_back("en"); 125*613dabeaSEd Tanous asyncResp->res.jsonValue["Languages@odata.count"] = languages.size(); 126*613dabeaSEd Tanous asyncResp->res.jsonValue["Languages"] = std::move(languages); 127*613dabeaSEd Tanous nlohmann::json::array_t locationMembers; 128*613dabeaSEd Tanous nlohmann::json::object_t location; 129*613dabeaSEd Tanous location["Language"] = "en"; 130*613dabeaSEd Tanous location["Uri"] = "/redfish/v1/Registries/" + registry + "/" + registry; 131e51c710eSJames Feist 132e51c710eSJames Feist if (url != nullptr) 133e51c710eSJames Feist { 134*613dabeaSEd Tanous location["PublicationUri"] = url; 135e51c710eSJames Feist } 136*613dabeaSEd Tanous locationMembers.emplace_back(std::move(location)); 137*613dabeaSEd Tanous asyncResp->res.jsonValue["Location@odata.count"] = locationMembers.size(); 138*613dabeaSEd Tanous asyncResp->res.jsonValue["Location"] = std::move(locationMembers); 13970304cb5SJason M. Bills } 14070304cb5SJason M. Bills 141dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app) 14270304cb5SJason M. Bills { 143dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/") 144ed398213SEd Tanous .privileges(redfish::privileges::getMessageRegistryFile) 14545ca1b86SEd Tanous .methods(boost::beast::http::verb::get)(std::bind_front( 14645ca1b86SEd Tanous handleMessageRoutesMessageRegistryFileGet, std::ref(app))); 147dff07827SJohn Edward Broadbent } 148dff07827SJohn Edward Broadbent 149dff07827SJohn Edward Broadbent inline void handleMessageRegistryGet( 15045ca1b86SEd Tanous crow::App& app, const crow::Request& req, 151104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1526e8c18f0SJohn Edward Broadbent const std::string& registry, const std::string& registryMatch) 1537e860f15SJohn Edward Broadbent 154e51c710eSJames Feist { 1553ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 15645ca1b86SEd Tanous { 15745ca1b86SEd Tanous return; 15845ca1b86SEd Tanous } 159fffb8c1fSEd Tanous const registries::Header* header = nullptr; 160fffb8c1fSEd Tanous std::vector<const registries::MessageEntry*> registryEntries; 161e51c710eSJames Feist if (registry == "Base") 162e51c710eSJames Feist { 163fffb8c1fSEd Tanous header = ®istries::base::header; 164fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : registries::base::registry) 165e51c710eSJames Feist { 166e51c710eSJames Feist registryEntries.emplace_back(&entry); 167e51c710eSJames Feist } 168e51c710eSJames Feist } 169e51c710eSJames Feist else if (registry == "TaskEvent") 170e51c710eSJames Feist { 171fffb8c1fSEd Tanous header = ®istries::task_event::header; 172fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 173fffb8c1fSEd Tanous registries::task_event::registry) 174e51c710eSJames Feist { 175e51c710eSJames Feist registryEntries.emplace_back(&entry); 176e51c710eSJames Feist } 177e51c710eSJames Feist } 178e51c710eSJames Feist else if (registry == "OpenBMC") 179e51c710eSJames Feist { 180fffb8c1fSEd Tanous header = ®istries::openbmc::header; 181fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 182fffb8c1fSEd Tanous registries::openbmc::registry) 183e51c710eSJames Feist { 184e51c710eSJames Feist registryEntries.emplace_back(&entry); 185e51c710eSJames Feist } 186e51c710eSJames Feist } 18774eec26bSSunitha Harish else if (registry == "ResourceEvent") 18874eec26bSSunitha Harish { 189fffb8c1fSEd Tanous header = ®istries::resource_event::header; 190fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 191fffb8c1fSEd Tanous registries::resource_event::registry) 19274eec26bSSunitha Harish { 19374eec26bSSunitha Harish registryEntries.emplace_back(&entry); 19474eec26bSSunitha Harish } 19574eec26bSSunitha Harish } 196e51c710eSJames Feist else 197e51c710eSJames Feist { 198d8a5d5d8SJiaqing Zhao messages::resourceNotFound(asyncResp->res, "MessageRegistryFile", 1997e860f15SJohn Edward Broadbent registry); 200e51c710eSJames Feist return; 201e51c710eSJames Feist } 202e51c710eSJames Feist 2036e8c18f0SJohn Edward Broadbent if (registry != registryMatch) 204e51c710eSJames Feist { 2056e8c18f0SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, header->type, registryMatch); 206e51c710eSJames Feist return; 207e51c710eSJames Feist } 208e51c710eSJames Feist 2091476687dSEd Tanous asyncResp->res.jsonValue["@Redfish.Copyright"] = header->copyright; 2101476687dSEd Tanous asyncResp->res.jsonValue["@odata.type"] = header->type; 2111476687dSEd Tanous asyncResp->res.jsonValue["Id"] = header->id; 2121476687dSEd Tanous asyncResp->res.jsonValue["Name"] = header->name; 2131476687dSEd Tanous asyncResp->res.jsonValue["Language"] = header->language; 2141476687dSEd Tanous asyncResp->res.jsonValue["Description"] = header->description; 2151476687dSEd Tanous asyncResp->res.jsonValue["RegistryPrefix"] = header->registryPrefix; 2161476687dSEd Tanous asyncResp->res.jsonValue["RegistryVersion"] = header->registryVersion; 2171476687dSEd Tanous asyncResp->res.jsonValue["OwningEntity"] = header->owningEntity; 21870304cb5SJason M. Bills 219dff07827SJohn Edward Broadbent nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; 22070304cb5SJason M. Bills 22170304cb5SJason M. Bills // Go through the Message Registry and populate each Message 222fffb8c1fSEd Tanous for (const registries::MessageEntry* message : registryEntries) 22370304cb5SJason M. Bills { 224e51c710eSJames Feist nlohmann::json& obj = messageObj[message->first]; 2251476687dSEd Tanous obj["Description"] = message->second.description; 2261476687dSEd Tanous obj["Message"] = message->second.message; 2271476687dSEd Tanous obj["Severity"] = message->second.messageSeverity; 2281476687dSEd Tanous obj["MessageSeverity"] = message->second.messageSeverity; 2291476687dSEd Tanous obj["NumberOfArgs"] = message->second.numberOfArgs; 2301476687dSEd Tanous obj["Resolution"] = message->second.resolution; 231e51c710eSJames Feist if (message->second.numberOfArgs > 0) 23270304cb5SJason M. Bills { 23314c8aee2SEd Tanous nlohmann::json& messageParamArray = obj["ParamTypes"]; 234938f2568SEd Tanous messageParamArray = nlohmann::json::array(); 235e51c710eSJames Feist for (const char* str : message->second.paramTypes) 23670304cb5SJason M. Bills { 23770304cb5SJason M. Bills if (str == nullptr) 23870304cb5SJason M. Bills { 23970304cb5SJason M. Bills break; 24070304cb5SJason M. Bills } 24170304cb5SJason M. Bills messageParamArray.push_back(str); 24270304cb5SJason M. Bills } 24370304cb5SJason M. Bills } 24470304cb5SJason M. Bills } 24570304cb5SJason M. Bills } 24670304cb5SJason M. Bills 247dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app) 248dff07827SJohn Edward Broadbent { 249dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 250dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFile) 25145ca1b86SEd Tanous .methods(boost::beast::http::verb::get)( 25245ca1b86SEd Tanous std::bind_front(handleMessageRegistryGet, std::ref(app))); 253dff07827SJohn Edward Broadbent } 25470304cb5SJason M. Bills } // namespace redfish 255