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( 31*104f09c9SEd Tanous const crow::Request& /*req*/, 32*104f09c9SEd 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( 63*104f09c9SEd Tanous const crow::Request& /*req*/, 64*104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 65dff07827SJohn Edward Broadbent const std::string& registry) 66dff07827SJohn Edward Broadbent { 67543f4400SEd Tanous const message_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 { 73e51c710eSJames Feist header = &message_registries::base::header; 74e51c710eSJames Feist url = message_registries::base::url; 75e51c710eSJames Feist } 76e51c710eSJames Feist else if (registry == "TaskEvent") 77e51c710eSJames Feist { 78e51c710eSJames Feist header = &message_registries::task_event::header; 79e51c710eSJames Feist url = message_registries::task_event::url; 80e51c710eSJames Feist } 81e51c710eSJames Feist else if (registry == "OpenBMC") 82e51c710eSJames Feist { 83e51c710eSJames Feist header = &message_registries::openbmc::header; 84e51c710eSJames Feist dmtf.clear(); 85e51c710eSJames Feist } 8674eec26bSSunitha Harish else if (registry == "ResourceEvent") 8774eec26bSSunitha Harish { 8874eec26bSSunitha Harish header = &message_registries::resource_event::header; 8974eec26bSSunitha Harish url = message_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( 128*104f09c9SEd Tanous const crow::Request& /*req*/, 129*104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1306e8c18f0SJohn Edward Broadbent const std::string& registry, const std::string& registryMatch) 1317e860f15SJohn Edward Broadbent 132e51c710eSJames Feist { 133543f4400SEd Tanous const message_registries::Header* header = nullptr; 134dff07827SJohn Edward Broadbent std::vector<const message_registries::MessageEntry*> registryEntries; 135e51c710eSJames Feist if (registry == "Base") 136e51c710eSJames Feist { 137e51c710eSJames Feist header = &message_registries::base::header; 138e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 139e51c710eSJames Feist message_registries::base::registry) 140e51c710eSJames Feist { 141e51c710eSJames Feist registryEntries.emplace_back(&entry); 142e51c710eSJames Feist } 143e51c710eSJames Feist } 144e51c710eSJames Feist else if (registry == "TaskEvent") 145e51c710eSJames Feist { 146e51c710eSJames Feist header = &message_registries::task_event::header; 147e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 148e51c710eSJames Feist message_registries::task_event::registry) 149e51c710eSJames Feist { 150e51c710eSJames Feist registryEntries.emplace_back(&entry); 151e51c710eSJames Feist } 152e51c710eSJames Feist } 153e51c710eSJames Feist else if (registry == "OpenBMC") 154e51c710eSJames Feist { 155e51c710eSJames Feist header = &message_registries::openbmc::header; 156e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 157e51c710eSJames Feist message_registries::openbmc::registry) 158e51c710eSJames Feist { 159e51c710eSJames Feist registryEntries.emplace_back(&entry); 160e51c710eSJames Feist } 161e51c710eSJames Feist } 16274eec26bSSunitha Harish else if (registry == "ResourceEvent") 16374eec26bSSunitha Harish { 16474eec26bSSunitha Harish header = &message_registries::resource_event::header; 16574eec26bSSunitha Harish for (const message_registries::MessageEntry& entry : 16674eec26bSSunitha Harish message_registries::resource_event::registry) 16774eec26bSSunitha Harish { 16874eec26bSSunitha Harish registryEntries.emplace_back(&entry); 16974eec26bSSunitha Harish } 17074eec26bSSunitha Harish } 171e51c710eSJames Feist else 172e51c710eSJames Feist { 173e51c710eSJames Feist messages::resourceNotFound( 174dff07827SJohn Edward Broadbent asyncResp->res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 1757e860f15SJohn Edward Broadbent registry); 176e51c710eSJames Feist return; 177e51c710eSJames Feist } 178e51c710eSJames Feist 1796e8c18f0SJohn Edward Broadbent if (registry != registryMatch) 180e51c710eSJames Feist { 1816e8c18f0SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, header->type, registryMatch); 182e51c710eSJames Feist return; 183e51c710eSJames Feist } 184e51c710eSJames Feist 185dff07827SJohn Edward Broadbent asyncResp->res.jsonValue = {{"@Redfish.Copyright", header->copyright}, 186e51c710eSJames Feist {"@odata.type", header->type}, 187e51c710eSJames Feist {"Id", header->id}, 188e51c710eSJames Feist {"Name", header->name}, 189e51c710eSJames Feist {"Language", header->language}, 190e51c710eSJames Feist {"Description", header->description}, 191e51c710eSJames Feist {"RegistryPrefix", header->registryPrefix}, 192e51c710eSJames Feist {"RegistryVersion", header->registryVersion}, 193e51c710eSJames Feist {"OwningEntity", header->owningEntity}}; 19470304cb5SJason M. Bills 195dff07827SJohn Edward Broadbent nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; 19670304cb5SJason M. Bills 19770304cb5SJason M. Bills // Go through the Message Registry and populate each Message 198dff07827SJohn Edward Broadbent for (const message_registries::MessageEntry* message : registryEntries) 19970304cb5SJason M. Bills { 200e51c710eSJames Feist nlohmann::json& obj = messageObj[message->first]; 201e51c710eSJames Feist obj = {{"Description", message->second.description}, 202e51c710eSJames Feist {"Message", message->second.message}, 203e51c710eSJames Feist {"Severity", message->second.severity}, 204e7808c93SGunnar Mills {"MessageSeverity", message->second.messageSeverity}, 205e51c710eSJames Feist {"NumberOfArgs", message->second.numberOfArgs}, 206e51c710eSJames Feist {"Resolution", message->second.resolution}}; 207e51c710eSJames Feist if (message->second.numberOfArgs > 0) 20870304cb5SJason M. Bills { 20914c8aee2SEd Tanous nlohmann::json& messageParamArray = obj["ParamTypes"]; 210938f2568SEd Tanous messageParamArray = nlohmann::json::array(); 211e51c710eSJames Feist for (const char* str : message->second.paramTypes) 21270304cb5SJason M. Bills { 21370304cb5SJason M. Bills if (str == nullptr) 21470304cb5SJason M. Bills { 21570304cb5SJason M. Bills break; 21670304cb5SJason M. Bills } 21770304cb5SJason M. Bills messageParamArray.push_back(str); 21870304cb5SJason M. Bills } 21970304cb5SJason M. Bills } 22070304cb5SJason M. Bills } 22170304cb5SJason M. Bills } 22270304cb5SJason M. Bills 223dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app) 224dff07827SJohn Edward Broadbent { 225dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 226dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFile) 227dff07827SJohn Edward Broadbent .methods(boost::beast::http::verb::get)(handleMessageRegistryGet); 228dff07827SJohn Edward Broadbent } 22970304cb5SJason M. Bills } // namespace redfish 230