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( 31dff07827SJohn Edward Broadbent const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 3270304cb5SJason M. Bills { 337e860f15SJohn Edward Broadbent // Collections don't include the static data added by SubRoute 347e860f15SJohn Edward Broadbent // because it has a duplicate entry for members 3514c8aee2SEd Tanous 368d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 370fda0f12SGeorge Liu {"@odata.type", 380fda0f12SGeorge Liu "#MessageRegistryFileCollection.MessageRegistryFileCollection"}, 3914c8aee2SEd Tanous {"@odata.id", "/redfish/v1/Registries"}, 4014c8aee2SEd Tanous {"Name", "MessageRegistryFile Collection"}, 4114c8aee2SEd Tanous {"Description", "Collection of MessageRegistryFiles"}, 4274eec26bSSunitha Harish {"Members@odata.count", 4}, 4314c8aee2SEd Tanous {"Members", 4414c8aee2SEd Tanous {{{"@odata.id", "/redfish/v1/Registries/Base"}}, 45e51c710eSJames Feist {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}}, 4674eec26bSSunitha Harish {{"@odata.id", "/redfish/v1/Registries/ResourceEvent"}}, 4714c8aee2SEd Tanous {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}}; 4870304cb5SJason M. Bills } 4970304cb5SJason M. Bills 50dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app) 5170304cb5SJason M. Bills { 52dff07827SJohn Edward Broadbent /** 53dff07827SJohn Edward Broadbent * Functions triggers appropriate requests on DBus 54dff07827SJohn Edward Broadbent */ 55dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/") 56dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFileCollection) 577e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 58dff07827SJohn Edward Broadbent handleMessageRegistryFileCollectionGet); 59dff07827SJohn Edward Broadbent } 60dff07827SJohn Edward Broadbent 61dff07827SJohn Edward Broadbent inline void handleMessageRoutesMessageRegistryFileGet( 62dff07827SJohn Edward Broadbent const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 63dff07827SJohn Edward Broadbent const std::string& registry) 64dff07827SJohn Edward Broadbent { 65*543f4400SEd Tanous const message_registries::Header* header = nullptr; 66e51c710eSJames Feist std::string dmtf = "DMTF "; 67e51c710eSJames Feist const char* url = nullptr; 68e51c710eSJames Feist 69e51c710eSJames Feist if (registry == "Base") 70e51c710eSJames Feist { 71e51c710eSJames Feist header = &message_registries::base::header; 72e51c710eSJames Feist url = message_registries::base::url; 73e51c710eSJames Feist } 74e51c710eSJames Feist else if (registry == "TaskEvent") 75e51c710eSJames Feist { 76e51c710eSJames Feist header = &message_registries::task_event::header; 77e51c710eSJames Feist url = message_registries::task_event::url; 78e51c710eSJames Feist } 79e51c710eSJames Feist else if (registry == "OpenBMC") 80e51c710eSJames Feist { 81e51c710eSJames Feist header = &message_registries::openbmc::header; 82e51c710eSJames Feist dmtf.clear(); 83e51c710eSJames Feist } 8474eec26bSSunitha Harish else if (registry == "ResourceEvent") 8574eec26bSSunitha Harish { 8674eec26bSSunitha Harish header = &message_registries::resource_event::header; 8774eec26bSSunitha Harish url = message_registries::resource_event::url; 8874eec26bSSunitha Harish } 89e51c710eSJames Feist else 90e51c710eSJames Feist { 91e51c710eSJames Feist messages::resourceNotFound( 92dff07827SJohn Edward Broadbent asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 937e860f15SJohn Edward Broadbent registry); 94e51c710eSJames Feist return; 95e51c710eSJames Feist } 96e51c710eSJames Feist 978d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 98e51c710eSJames Feist {"@odata.id", "/redfish/v1/Registries/" + registry}, 99dff07827SJohn Edward Broadbent {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"}, 100e51c710eSJames Feist {"Name", registry + " Message Registry File"}, 101dff07827SJohn Edward Broadbent {"Description", dmtf + registry + " Message Registry File Location"}, 102e51c710eSJames Feist {"Id", header->registryPrefix}, 103e51c710eSJames Feist {"Registry", header->id}, 10414c8aee2SEd Tanous {"Languages", {"en"}}, 10514c8aee2SEd Tanous {"Languages@odata.count", 1}, 10614c8aee2SEd Tanous {"Location", 10714c8aee2SEd Tanous {{{"Language", "en"}, 108dff07827SJohn Edward Broadbent {"Uri", "/redfish/v1/Registries/" + registry + "/" + registry}}}}, 10914c8aee2SEd Tanous {"Location@odata.count", 1}}; 110e51c710eSJames Feist 111e51c710eSJames Feist if (url != nullptr) 112e51c710eSJames Feist { 113dff07827SJohn Edward Broadbent asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = url; 114e51c710eSJames Feist } 11570304cb5SJason M. Bills } 11670304cb5SJason M. Bills 117dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app) 11870304cb5SJason M. Bills { 119dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/") 120ed398213SEd Tanous .privileges(redfish::privileges::getMessageRegistryFile) 1217e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 122dff07827SJohn Edward Broadbent handleMessageRoutesMessageRegistryFileGet); 123dff07827SJohn Edward Broadbent } 124dff07827SJohn Edward Broadbent 125dff07827SJohn Edward Broadbent inline void handleMessageRegistryGet( 126dff07827SJohn Edward Broadbent const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1276e8c18f0SJohn Edward Broadbent const std::string& registry, const std::string& registryMatch) 1287e860f15SJohn Edward Broadbent 129e51c710eSJames Feist { 130*543f4400SEd Tanous const message_registries::Header* header = nullptr; 131dff07827SJohn Edward Broadbent std::vector<const message_registries::MessageEntry*> registryEntries; 132e51c710eSJames Feist if (registry == "Base") 133e51c710eSJames Feist { 134e51c710eSJames Feist header = &message_registries::base::header; 135e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 136e51c710eSJames Feist message_registries::base::registry) 137e51c710eSJames Feist { 138e51c710eSJames Feist registryEntries.emplace_back(&entry); 139e51c710eSJames Feist } 140e51c710eSJames Feist } 141e51c710eSJames Feist else if (registry == "TaskEvent") 142e51c710eSJames Feist { 143e51c710eSJames Feist header = &message_registries::task_event::header; 144e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 145e51c710eSJames Feist message_registries::task_event::registry) 146e51c710eSJames Feist { 147e51c710eSJames Feist registryEntries.emplace_back(&entry); 148e51c710eSJames Feist } 149e51c710eSJames Feist } 150e51c710eSJames Feist else if (registry == "OpenBMC") 151e51c710eSJames Feist { 152e51c710eSJames Feist header = &message_registries::openbmc::header; 153e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 154e51c710eSJames Feist message_registries::openbmc::registry) 155e51c710eSJames Feist { 156e51c710eSJames Feist registryEntries.emplace_back(&entry); 157e51c710eSJames Feist } 158e51c710eSJames Feist } 15974eec26bSSunitha Harish else if (registry == "ResourceEvent") 16074eec26bSSunitha Harish { 16174eec26bSSunitha Harish header = &message_registries::resource_event::header; 16274eec26bSSunitha Harish for (const message_registries::MessageEntry& entry : 16374eec26bSSunitha Harish message_registries::resource_event::registry) 16474eec26bSSunitha Harish { 16574eec26bSSunitha Harish registryEntries.emplace_back(&entry); 16674eec26bSSunitha Harish } 16774eec26bSSunitha Harish } 168e51c710eSJames Feist else 169e51c710eSJames Feist { 170e51c710eSJames Feist messages::resourceNotFound( 171dff07827SJohn Edward Broadbent asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 1727e860f15SJohn Edward Broadbent registry); 173e51c710eSJames Feist return; 174e51c710eSJames Feist } 175e51c710eSJames Feist 1766e8c18f0SJohn Edward Broadbent if (registry != registryMatch) 177e51c710eSJames Feist { 1786e8c18f0SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, header->type, registryMatch); 179e51c710eSJames Feist return; 180e51c710eSJames Feist } 181e51c710eSJames Feist 182dff07827SJohn Edward Broadbent asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright}, 183e51c710eSJames Feist {"@odata.type", header->type}, 184e51c710eSJames Feist {"Id", header->id}, 185e51c710eSJames Feist {"Name", header->name}, 186e51c710eSJames Feist {"Language", header->language}, 187e51c710eSJames Feist {"Description", header->description}, 188e51c710eSJames Feist {"RegistryPrefix", header->registryPrefix}, 189e51c710eSJames Feist {"RegistryVersion", header->registryVersion}, 190e51c710eSJames Feist {"OwningEntity", header->owningEntity}}; 19170304cb5SJason M. Bills 192dff07827SJohn Edward Broadbent nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; 19370304cb5SJason M. Bills 19470304cb5SJason M. Bills // Go through the Message Registry and populate each Message 195dff07827SJohn Edward Broadbent for (const message_registries::MessageEntry* message : registryEntries) 19670304cb5SJason M. Bills { 197e51c710eSJames Feist nlohmann::json& obj = messageObj[message->first]; 198e51c710eSJames Feist obj = {{"Description", message->second.description}, 199e51c710eSJames Feist {"Message", message->second.message}, 200e51c710eSJames Feist {"Severity", message->second.severity}, 201e7808c93SGunnar Mills {"MessageSeverity", message->second.messageSeverity}, 202e51c710eSJames Feist {"NumberOfArgs", message->second.numberOfArgs}, 203e51c710eSJames Feist {"Resolution", message->second.resolution}}; 204e51c710eSJames Feist if (message->second.numberOfArgs > 0) 20570304cb5SJason M. Bills { 20614c8aee2SEd Tanous nlohmann::json& messageParamArray = obj["ParamTypes"]; 207938f2568SEd Tanous messageParamArray = nlohmann::json::array(); 208e51c710eSJames Feist for (const char* str : message->second.paramTypes) 20970304cb5SJason M. Bills { 21070304cb5SJason M. Bills if (str == nullptr) 21170304cb5SJason M. Bills { 21270304cb5SJason M. Bills break; 21370304cb5SJason M. Bills } 21470304cb5SJason M. Bills messageParamArray.push_back(str); 21570304cb5SJason M. Bills } 21670304cb5SJason M. Bills } 21770304cb5SJason M. Bills } 21870304cb5SJason M. Bills } 21970304cb5SJason M. Bills 220dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app) 221dff07827SJohn Edward Broadbent { 222dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 223dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFile) 224dff07827SJohn Edward Broadbent .methods(boost::beast::http::verb::get)(handleMessageRegistryGet); 225dff07827SJohn Edward Broadbent } 22670304cb5SJason M. Bills } // namespace redfish 227