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( 31104f09c9SEd Tanous const crow::Request& /*req*/, 32104f09c9SEd 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( 63104f09c9SEd Tanous const crow::Request& /*req*/, 64104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 65dff07827SJohn Edward Broadbent const std::string& registry) 66dff07827SJohn Edward Broadbent { 67*fffb8c1fSEd Tanous const 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 { 73*fffb8c1fSEd Tanous header = ®istries::base::header; 74*fffb8c1fSEd Tanous url = registries::base::url; 75e51c710eSJames Feist } 76e51c710eSJames Feist else if (registry == "TaskEvent") 77e51c710eSJames Feist { 78*fffb8c1fSEd Tanous header = ®istries::task_event::header; 79*fffb8c1fSEd Tanous url = registries::task_event::url; 80e51c710eSJames Feist } 81e51c710eSJames Feist else if (registry == "OpenBMC") 82e51c710eSJames Feist { 83*fffb8c1fSEd Tanous header = ®istries::openbmc::header; 84e51c710eSJames Feist dmtf.clear(); 85e51c710eSJames Feist } 8674eec26bSSunitha Harish else if (registry == "ResourceEvent") 8774eec26bSSunitha Harish { 88*fffb8c1fSEd Tanous header = ®istries::resource_event::header; 89*fffb8c1fSEd Tanous url = 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( 128104f09c9SEd Tanous const crow::Request& /*req*/, 129104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1306e8c18f0SJohn Edward Broadbent const std::string& registry, const std::string& registryMatch) 1317e860f15SJohn Edward Broadbent 132e51c710eSJames Feist { 133*fffb8c1fSEd Tanous const registries::Header* header = nullptr; 134*fffb8c1fSEd Tanous std::vector<const registries::MessageEntry*> registryEntries; 135e51c710eSJames Feist if (registry == "Base") 136e51c710eSJames Feist { 137*fffb8c1fSEd Tanous header = ®istries::base::header; 138*fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : registries::base::registry) 139e51c710eSJames Feist { 140e51c710eSJames Feist registryEntries.emplace_back(&entry); 141e51c710eSJames Feist } 142e51c710eSJames Feist } 143e51c710eSJames Feist else if (registry == "TaskEvent") 144e51c710eSJames Feist { 145*fffb8c1fSEd Tanous header = ®istries::task_event::header; 146*fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 147*fffb8c1fSEd Tanous registries::task_event::registry) 148e51c710eSJames Feist { 149e51c710eSJames Feist registryEntries.emplace_back(&entry); 150e51c710eSJames Feist } 151e51c710eSJames Feist } 152e51c710eSJames Feist else if (registry == "OpenBMC") 153e51c710eSJames Feist { 154*fffb8c1fSEd Tanous header = ®istries::openbmc::header; 155*fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 156*fffb8c1fSEd Tanous registries::openbmc::registry) 157e51c710eSJames Feist { 158e51c710eSJames Feist registryEntries.emplace_back(&entry); 159e51c710eSJames Feist } 160e51c710eSJames Feist } 16174eec26bSSunitha Harish else if (registry == "ResourceEvent") 16274eec26bSSunitha Harish { 163*fffb8c1fSEd Tanous header = ®istries::resource_event::header; 164*fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 165*fffb8c1fSEd Tanous registries::resource_event::registry) 16674eec26bSSunitha Harish { 16774eec26bSSunitha Harish registryEntries.emplace_back(&entry); 16874eec26bSSunitha Harish } 16974eec26bSSunitha Harish } 170e51c710eSJames Feist else 171e51c710eSJames Feist { 172e51c710eSJames Feist messages::resourceNotFound( 173dff07827SJohn Edward Broadbent asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 1747e860f15SJohn Edward Broadbent registry); 175e51c710eSJames Feist return; 176e51c710eSJames Feist } 177e51c710eSJames Feist 1786e8c18f0SJohn Edward Broadbent if (registry != registryMatch) 179e51c710eSJames Feist { 1806e8c18f0SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, header->type, registryMatch); 181e51c710eSJames Feist return; 182e51c710eSJames Feist } 183e51c710eSJames Feist 184dff07827SJohn Edward Broadbent asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright}, 185e51c710eSJames Feist {"@odata.type", header->type}, 186e51c710eSJames Feist {"Id", header->id}, 187e51c710eSJames Feist {"Name", header->name}, 188e51c710eSJames Feist {"Language", header->language}, 189e51c710eSJames Feist {"Description", header->description}, 190e51c710eSJames Feist {"RegistryPrefix", header->registryPrefix}, 191e51c710eSJames Feist {"RegistryVersion", header->registryVersion}, 192e51c710eSJames Feist {"OwningEntity", header->owningEntity}}; 19370304cb5SJason M. Bills 194dff07827SJohn Edward Broadbent nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; 19570304cb5SJason M. Bills 19670304cb5SJason M. Bills // Go through the Message Registry and populate each Message 197*fffb8c1fSEd Tanous for (const registries::MessageEntry* message : registryEntries) 19870304cb5SJason M. Bills { 199e51c710eSJames Feist nlohmann::json& obj = messageObj[message->first]; 200e51c710eSJames Feist obj = {{"Description", message->second.description}, 201e51c710eSJames Feist {"Message", message->second.message}, 202e51c710eSJames Feist {"Severity", message->second.severity}, 203e7808c93SGunnar Mills {"MessageSeverity", message->second.messageSeverity}, 204e51c710eSJames Feist {"NumberOfArgs", message->second.numberOfArgs}, 205e51c710eSJames Feist {"Resolution", message->second.resolution}}; 206e51c710eSJames Feist if (message->second.numberOfArgs > 0) 20770304cb5SJason M. Bills { 20814c8aee2SEd Tanous nlohmann::json& messageParamArray = obj["ParamTypes"]; 209938f2568SEd Tanous messageParamArray = nlohmann::json::array(); 210e51c710eSJames Feist for (const char* str : message->second.paramTypes) 21170304cb5SJason M. Bills { 21270304cb5SJason M. Bills if (str == nullptr) 21370304cb5SJason M. Bills { 21470304cb5SJason M. Bills break; 21570304cb5SJason M. Bills } 21670304cb5SJason M. Bills messageParamArray.push_back(str); 21770304cb5SJason M. Bills } 21870304cb5SJason M. Bills } 21970304cb5SJason M. Bills } 22070304cb5SJason M. Bills } 22170304cb5SJason M. Bills 222dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app) 223dff07827SJohn Edward Broadbent { 224dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 225dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFile) 226dff07827SJohn Edward Broadbent .methods(boost::beast::http::verb::get)(handleMessageRegistryGet); 227dff07827SJohn Edward Broadbent } 22870304cb5SJason M. Bills } // namespace redfish 229