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*45ca1b86SEd Tanous #include <query.hpp> 26ed398213SEd Tanous #include <registries/privilege_registry.hpp> 277e860f15SJohn Edward Broadbent 2870304cb5SJason M. Bills namespace redfish 2970304cb5SJason M. Bills { 3070304cb5SJason M. Bills 31dff07827SJohn Edward Broadbent inline void handleMessageRegistryFileCollectionGet( 32*45ca1b86SEd Tanous crow::App& app, const crow::Request& req, 33104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 3470304cb5SJason M. Bills { 35*45ca1b86SEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp->res)) 36*45ca1b86SEd Tanous { 37*45ca1b86SEd Tanous return; 38*45ca1b86SEd Tanous } 397e860f15SJohn Edward Broadbent // Collections don't include the static data added by SubRoute 407e860f15SJohn Edward Broadbent // because it has a duplicate entry for members 4114c8aee2SEd Tanous 428d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 430fda0f12SGeorge Liu {"@odata.type", 440fda0f12SGeorge Liu "#MessageRegistryFileCollection.MessageRegistryFileCollection"}, 4514c8aee2SEd Tanous {"@odata.id", "/redfish/v1/Registries"}, 4614c8aee2SEd Tanous {"Name", "MessageRegistryFile Collection"}, 4714c8aee2SEd Tanous {"Description", "Collection of MessageRegistryFiles"}, 4874eec26bSSunitha Harish {"Members@odata.count", 4}, 4914c8aee2SEd Tanous {"Members", 5014c8aee2SEd Tanous {{{"@odata.id", "/redfish/v1/Registries/Base"}}, 51e51c710eSJames Feist {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}}, 5274eec26bSSunitha Harish {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}}, 5314c8aee2SEd Tanous {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}}; 5470304cb5SJason M. Bills } 5570304cb5SJason M. Bills 56dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app) 5770304cb5SJason M. Bills { 58dff07827SJohn Edward Broadbent /** 59dff07827SJohn Edward Broadbent * Functions triggers appropriate requests on DBus 60dff07827SJohn Edward Broadbent */ 61dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/") 62dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFileCollection) 63*45ca1b86SEd Tanous .methods(boost::beast::http::verb::get)(std::bind_front( 64*45ca1b86SEd Tanous handleMessageRegistryFileCollectionGet, std::ref(app))); 65dff07827SJohn Edward Broadbent } 66dff07827SJohn Edward Broadbent 67dff07827SJohn Edward Broadbent inline void handleMessageRoutesMessageRegistryFileGet( 68*45ca1b86SEd Tanous crow::App& app, const crow::Request& req, 69104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 70dff07827SJohn Edward Broadbent const std::string& registry) 71dff07827SJohn Edward Broadbent { 72*45ca1b86SEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp->res)) 73*45ca1b86SEd Tanous { 74*45ca1b86SEd Tanous return; 75*45ca1b86SEd Tanous } 76fffb8c1fSEd Tanous const registries::Header* header = nullptr; 77e51c710eSJames Feist std::string dmtf = "DMTF "; 78e51c710eSJames Feist const char* url = nullptr; 79e51c710eSJames Feist 80e51c710eSJames Feist if (registry == "Base") 81e51c710eSJames Feist { 82fffb8c1fSEd Tanous header = ®istries::base::header; 83fffb8c1fSEd Tanous url = registries::base::url; 84e51c710eSJames Feist } 85e51c710eSJames Feist else if (registry == "TaskEvent") 86e51c710eSJames Feist { 87fffb8c1fSEd Tanous header = ®istries::task_event::header; 88fffb8c1fSEd Tanous url = registries::task_event::url; 89e51c710eSJames Feist } 90e51c710eSJames Feist else if (registry == "OpenBMC") 91e51c710eSJames Feist { 92fffb8c1fSEd Tanous header = ®istries::openbmc::header; 93e51c710eSJames Feist dmtf.clear(); 94e51c710eSJames Feist } 9574eec26bSSunitha Harish else if (registry == "ResourceEvent") 9674eec26bSSunitha Harish { 97fffb8c1fSEd Tanous header = ®istries::resource_event::header; 98fffb8c1fSEd Tanous url = registries::resource_event::url; 9974eec26bSSunitha Harish } 100e51c710eSJames Feist else 101e51c710eSJames Feist { 102e51c710eSJames Feist messages::resourceNotFound( 103dff07827SJohn Edward Broadbent asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 1047e860f15SJohn Edward Broadbent registry); 105e51c710eSJames Feist return; 106e51c710eSJames Feist } 107e51c710eSJames Feist 1088d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 109e51c710eSJames Feist {"@odata.id", "/redfish/v1/Registries/" + registry}, 110dff07827SJohn Edward Broadbent {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"}, 111e51c710eSJames Feist {"Name", registry + " Message Registry File"}, 112dff07827SJohn Edward Broadbent {"Description", dmtf + registry + " Message Registry File Location"}, 113e51c710eSJames Feist {"Id", header->registryPrefix}, 114e51c710eSJames Feist {"Registry", header->id}, 11514c8aee2SEd Tanous {"Languages", {"en"}}, 11614c8aee2SEd Tanous {"Languages@odata.count", 1}, 11714c8aee2SEd Tanous {"Location", 11814c8aee2SEd Tanous {{{"Language", "en"}, 119dff07827SJohn Edward Broadbent {"Uri", "/redfish/v1/Registries/" + registry + "/" + registry}}}}, 12014c8aee2SEd Tanous {"Location@odata.count", 1}}; 121e51c710eSJames Feist 122e51c710eSJames Feist if (url != nullptr) 123e51c710eSJames Feist { 124dff07827SJohn Edward Broadbent asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = url; 125e51c710eSJames Feist } 12670304cb5SJason M. Bills } 12770304cb5SJason M. Bills 128dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app) 12970304cb5SJason M. Bills { 130dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/") 131ed398213SEd Tanous .privileges(redfish::privileges::getMessageRegistryFile) 132*45ca1b86SEd Tanous .methods(boost::beast::http::verb::get)(std::bind_front( 133*45ca1b86SEd Tanous handleMessageRoutesMessageRegistryFileGet, std::ref(app))); 134dff07827SJohn Edward Broadbent } 135dff07827SJohn Edward Broadbent 136dff07827SJohn Edward Broadbent inline void handleMessageRegistryGet( 137*45ca1b86SEd Tanous crow::App& app, const crow::Request& req, 138104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1396e8c18f0SJohn Edward Broadbent const std::string& registry, const std::string& registryMatch) 1407e860f15SJohn Edward Broadbent 141e51c710eSJames Feist { 142*45ca1b86SEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp->res)) 143*45ca1b86SEd Tanous { 144*45ca1b86SEd Tanous return; 145*45ca1b86SEd Tanous } 146fffb8c1fSEd Tanous const registries::Header* header = nullptr; 147fffb8c1fSEd Tanous std::vector<const registries::MessageEntry*> registryEntries; 148e51c710eSJames Feist if (registry == "Base") 149e51c710eSJames Feist { 150fffb8c1fSEd Tanous header = ®istries::base::header; 151fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : registries::base::registry) 152e51c710eSJames Feist { 153e51c710eSJames Feist registryEntries.emplace_back(&entry); 154e51c710eSJames Feist } 155e51c710eSJames Feist } 156e51c710eSJames Feist else if (registry == "TaskEvent") 157e51c710eSJames Feist { 158fffb8c1fSEd Tanous header = ®istries::task_event::header; 159fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 160fffb8c1fSEd Tanous registries::task_event::registry) 161e51c710eSJames Feist { 162e51c710eSJames Feist registryEntries.emplace_back(&entry); 163e51c710eSJames Feist } 164e51c710eSJames Feist } 165e51c710eSJames Feist else if (registry == "OpenBMC") 166e51c710eSJames Feist { 167fffb8c1fSEd Tanous header = ®istries::openbmc::header; 168fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 169fffb8c1fSEd Tanous registries::openbmc::registry) 170e51c710eSJames Feist { 171e51c710eSJames Feist registryEntries.emplace_back(&entry); 172e51c710eSJames Feist } 173e51c710eSJames Feist } 17474eec26bSSunitha Harish else if (registry == "ResourceEvent") 17574eec26bSSunitha Harish { 176fffb8c1fSEd Tanous header = ®istries::resource_event::header; 177fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 178fffb8c1fSEd Tanous registries::resource_event::registry) 17974eec26bSSunitha Harish { 18074eec26bSSunitha Harish registryEntries.emplace_back(&entry); 18174eec26bSSunitha Harish } 18274eec26bSSunitha Harish } 183e51c710eSJames Feist else 184e51c710eSJames Feist { 185e51c710eSJames Feist messages::resourceNotFound( 186dff07827SJohn Edward Broadbent asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 1877e860f15SJohn Edward Broadbent registry); 188e51c710eSJames Feist return; 189e51c710eSJames Feist } 190e51c710eSJames Feist 1916e8c18f0SJohn Edward Broadbent if (registry != registryMatch) 192e51c710eSJames Feist { 1936e8c18f0SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, header->type, registryMatch); 194e51c710eSJames Feist return; 195e51c710eSJames Feist } 196e51c710eSJames Feist 197dff07827SJohn Edward Broadbent asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright}, 198e51c710eSJames Feist {"@odata.type", header->type}, 199e51c710eSJames Feist {"Id", header->id}, 200e51c710eSJames Feist {"Name", header->name}, 201e51c710eSJames Feist {"Language", header->language}, 202e51c710eSJames Feist {"Description", header->description}, 203e51c710eSJames Feist {"RegistryPrefix", header->registryPrefix}, 204e51c710eSJames Feist {"RegistryVersion", header->registryVersion}, 205e51c710eSJames Feist {"OwningEntity", header->owningEntity}}; 20670304cb5SJason M. Bills 207dff07827SJohn Edward Broadbent nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; 20870304cb5SJason M. Bills 20970304cb5SJason M. Bills // Go through the Message Registry and populate each Message 210fffb8c1fSEd Tanous for (const registries::MessageEntry* message : registryEntries) 21170304cb5SJason M. Bills { 212e51c710eSJames Feist nlohmann::json& obj = messageObj[message->first]; 213e51c710eSJames Feist obj = {{"Description", message->second.description}, 214e51c710eSJames Feist {"Message", message->second.message}, 2155f2b84eeSEd Tanous {"Severity", message->second.messageSeverity}, 216e7808c93SGunnar Mills {"MessageSeverity", message->second.messageSeverity}, 217e51c710eSJames Feist {"NumberOfArgs", message->second.numberOfArgs}, 218e51c710eSJames Feist {"Resolution", message->second.resolution}}; 219e51c710eSJames Feist if (message->second.numberOfArgs > 0) 22070304cb5SJason M. Bills { 22114c8aee2SEd Tanous nlohmann::json& messageParamArray = obj["ParamTypes"]; 222938f2568SEd Tanous messageParamArray = nlohmann::json::array(); 223e51c710eSJames Feist for (const char* str : message->second.paramTypes) 22470304cb5SJason M. Bills { 22570304cb5SJason M. Bills if (str == nullptr) 22670304cb5SJason M. Bills { 22770304cb5SJason M. Bills break; 22870304cb5SJason M. Bills } 22970304cb5SJason M. Bills messageParamArray.push_back(str); 23070304cb5SJason M. Bills } 23170304cb5SJason M. Bills } 23270304cb5SJason M. Bills } 23370304cb5SJason M. Bills } 23470304cb5SJason M. Bills 235dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app) 236dff07827SJohn Edward Broadbent { 237dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 238dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFile) 239*45ca1b86SEd Tanous .methods(boost::beast::http::verb::get)( 240*45ca1b86SEd Tanous std::bind_front(handleMessageRegistryGet, std::ref(app))); 241dff07827SJohn Edward Broadbent } 24270304cb5SJason M. Bills } // namespace redfish 243