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 18*3ccb3adbSEd Tanous #include "app.hpp" 19*3ccb3adbSEd Tanous #include "query.hpp" 2070304cb5SJason M. Bills #include "registries.hpp" 2170304cb5SJason M. Bills #include "registries/base_message_registry.hpp" 22fbe8378fSJason M. Bills #include "registries/openbmc_message_registry.hpp" 23*3ccb3adbSEd Tanous #include "registries/privilege_registry.hpp" 2474eec26bSSunitha Harish #include "registries/resource_event_message_registry.hpp" 25e51c710eSJames Feist #include "registries/task_event_message_registry.hpp" 2670304cb5SJason M. Bills 27613dabeaSEd Tanous #include <array> 28613dabeaSEd Tanous 2970304cb5SJason M. Bills namespace redfish 3070304cb5SJason M. Bills { 3170304cb5SJason M. Bills 32dff07827SJohn Edward Broadbent inline void handleMessageRegistryFileCollectionGet( 3345ca1b86SEd Tanous crow::App& app, const crow::Request& req, 34104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) 3570304cb5SJason M. Bills { 363ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 3745ca1b86SEd Tanous { 3845ca1b86SEd Tanous return; 3945ca1b86SEd Tanous } 407e860f15SJohn Edward Broadbent // Collections don't include the static data added by SubRoute 417e860f15SJohn Edward Broadbent // because it has a duplicate entry for members 4214c8aee2SEd Tanous 431476687dSEd Tanous asyncResp->res.jsonValue["@odata.type"] = 441476687dSEd Tanous "#MessageRegistryFileCollection.MessageRegistryFileCollection"; 451476687dSEd Tanous asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Registries"; 461476687dSEd Tanous asyncResp->res.jsonValue["Name"] = "MessageRegistryFile Collection"; 471476687dSEd Tanous asyncResp->res.jsonValue["Description"] = 481476687dSEd Tanous "Collection of MessageRegistryFiles"; 491476687dSEd Tanous asyncResp->res.jsonValue["Members@odata.count"] = 4; 50613dabeaSEd Tanous 51613dabeaSEd Tanous nlohmann::json& members = asyncResp->res.jsonValue["Members"]; 52613dabeaSEd Tanous for (const char* memberName : 53613dabeaSEd Tanous std::to_array({"Base", "TaskEvent", "ResourceEvent", "OpenBMC"})) 54613dabeaSEd Tanous { 55613dabeaSEd Tanous nlohmann::json::object_t member; 56613dabeaSEd Tanous member["@odata.id"] = crow::utility::urlFromPieces( 57613dabeaSEd Tanous "redfish", "v1", "Registries", memberName); 58613dabeaSEd Tanous members.emplace_back(std::move(member)); 59613dabeaSEd Tanous } 6070304cb5SJason M. Bills } 6170304cb5SJason M. Bills 62dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app) 6370304cb5SJason M. Bills { 64dff07827SJohn Edward Broadbent /** 65dff07827SJohn Edward Broadbent * Functions triggers appropriate requests on DBus 66dff07827SJohn Edward Broadbent */ 67dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/") 68dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFileCollection) 6945ca1b86SEd Tanous .methods(boost::beast::http::verb::get)(std::bind_front( 7045ca1b86SEd Tanous handleMessageRegistryFileCollectionGet, std::ref(app))); 71dff07827SJohn Edward Broadbent } 72dff07827SJohn Edward Broadbent 73dff07827SJohn Edward Broadbent inline void handleMessageRoutesMessageRegistryFileGet( 7445ca1b86SEd Tanous crow::App& app, const crow::Request& req, 75104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 76dff07827SJohn Edward Broadbent const std::string& registry) 77dff07827SJohn Edward Broadbent { 783ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 7945ca1b86SEd Tanous { 8045ca1b86SEd Tanous return; 8145ca1b86SEd Tanous } 82fffb8c1fSEd Tanous const registries::Header* header = nullptr; 83e51c710eSJames Feist std::string dmtf = "DMTF "; 84e51c710eSJames Feist const char* url = nullptr; 85e51c710eSJames Feist 86e51c710eSJames Feist if (registry == "Base") 87e51c710eSJames Feist { 88fffb8c1fSEd Tanous header = ®istries::base::header; 89fffb8c1fSEd Tanous url = registries::base::url; 90e51c710eSJames Feist } 91e51c710eSJames Feist else if (registry == "TaskEvent") 92e51c710eSJames Feist { 93fffb8c1fSEd Tanous header = ®istries::task_event::header; 94fffb8c1fSEd Tanous url = registries::task_event::url; 95e51c710eSJames Feist } 96e51c710eSJames Feist else if (registry == "OpenBMC") 97e51c710eSJames Feist { 98fffb8c1fSEd Tanous header = ®istries::openbmc::header; 99e51c710eSJames Feist dmtf.clear(); 100e51c710eSJames Feist } 10174eec26bSSunitha Harish else if (registry == "ResourceEvent") 10274eec26bSSunitha Harish { 103fffb8c1fSEd Tanous header = ®istries::resource_event::header; 104fffb8c1fSEd Tanous url = registries::resource_event::url; 10574eec26bSSunitha Harish } 106e51c710eSJames Feist else 107e51c710eSJames Feist { 108d8a5d5d8SJiaqing Zhao messages::resourceNotFound(asyncResp->res, "MessageRegistryFile", 1097e860f15SJohn Edward Broadbent registry); 110e51c710eSJames Feist return; 111e51c710eSJames Feist } 112e51c710eSJames Feist 1131476687dSEd Tanous asyncResp->res.jsonValue["@odata.id"] = 1141476687dSEd Tanous "/redfish/v1/Registries/" + registry; 1151476687dSEd Tanous asyncResp->res.jsonValue["@odata.type"] = 1161476687dSEd Tanous "#MessageRegistryFile.v1_1_0.MessageRegistryFile"; 1171476687dSEd Tanous asyncResp->res.jsonValue["Name"] = registry + " Message Registry File"; 1181476687dSEd Tanous asyncResp->res.jsonValue["Description"] = 1191476687dSEd Tanous dmtf + registry + " Message Registry File Location"; 1201476687dSEd Tanous asyncResp->res.jsonValue["Id"] = header->registryPrefix; 1211476687dSEd Tanous asyncResp->res.jsonValue["Registry"] = header->id; 122613dabeaSEd Tanous nlohmann::json::array_t languages; 123613dabeaSEd Tanous languages.push_back("en"); 124613dabeaSEd Tanous asyncResp->res.jsonValue["Languages@odata.count"] = languages.size(); 125613dabeaSEd Tanous asyncResp->res.jsonValue["Languages"] = std::move(languages); 126613dabeaSEd Tanous nlohmann::json::array_t locationMembers; 127613dabeaSEd Tanous nlohmann::json::object_t location; 128613dabeaSEd Tanous location["Language"] = "en"; 129613dabeaSEd Tanous location["Uri"] = "/redfish/v1/Registries/" + registry + "/" + registry; 130e51c710eSJames Feist 131e51c710eSJames Feist if (url != nullptr) 132e51c710eSJames Feist { 133613dabeaSEd Tanous location["PublicationUri"] = url; 134e51c710eSJames Feist } 135613dabeaSEd Tanous locationMembers.emplace_back(std::move(location)); 136613dabeaSEd Tanous asyncResp->res.jsonValue["Location@odata.count"] = locationMembers.size(); 137613dabeaSEd Tanous asyncResp->res.jsonValue["Location"] = std::move(locationMembers); 13870304cb5SJason M. Bills } 13970304cb5SJason M. Bills 140dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app) 14170304cb5SJason M. Bills { 142dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/") 143ed398213SEd Tanous .privileges(redfish::privileges::getMessageRegistryFile) 14445ca1b86SEd Tanous .methods(boost::beast::http::verb::get)(std::bind_front( 14545ca1b86SEd Tanous handleMessageRoutesMessageRegistryFileGet, std::ref(app))); 146dff07827SJohn Edward Broadbent } 147dff07827SJohn Edward Broadbent 148dff07827SJohn Edward Broadbent inline void handleMessageRegistryGet( 14945ca1b86SEd Tanous crow::App& app, const crow::Request& req, 150104f09c9SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1516e8c18f0SJohn Edward Broadbent const std::string& registry, const std::string& registryMatch) 1527e860f15SJohn Edward Broadbent 153e51c710eSJames Feist { 1543ba00073SCarson Labrado if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 15545ca1b86SEd Tanous { 15645ca1b86SEd Tanous return; 15745ca1b86SEd Tanous } 158fffb8c1fSEd Tanous const registries::Header* header = nullptr; 159fffb8c1fSEd Tanous std::vector<const registries::MessageEntry*> registryEntries; 160e51c710eSJames Feist if (registry == "Base") 161e51c710eSJames Feist { 162fffb8c1fSEd Tanous header = ®istries::base::header; 163fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : registries::base::registry) 164e51c710eSJames Feist { 165e51c710eSJames Feist registryEntries.emplace_back(&entry); 166e51c710eSJames Feist } 167e51c710eSJames Feist } 168e51c710eSJames Feist else if (registry == "TaskEvent") 169e51c710eSJames Feist { 170fffb8c1fSEd Tanous header = ®istries::task_event::header; 171fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 172fffb8c1fSEd Tanous registries::task_event::registry) 173e51c710eSJames Feist { 174e51c710eSJames Feist registryEntries.emplace_back(&entry); 175e51c710eSJames Feist } 176e51c710eSJames Feist } 177e51c710eSJames Feist else if (registry == "OpenBMC") 178e51c710eSJames Feist { 179fffb8c1fSEd Tanous header = ®istries::openbmc::header; 180fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 181fffb8c1fSEd Tanous registries::openbmc::registry) 182e51c710eSJames Feist { 183e51c710eSJames Feist registryEntries.emplace_back(&entry); 184e51c710eSJames Feist } 185e51c710eSJames Feist } 18674eec26bSSunitha Harish else if (registry == "ResourceEvent") 18774eec26bSSunitha Harish { 188fffb8c1fSEd Tanous header = ®istries::resource_event::header; 189fffb8c1fSEd Tanous for (const registries::MessageEntry& entry : 190fffb8c1fSEd Tanous registries::resource_event::registry) 19174eec26bSSunitha Harish { 19274eec26bSSunitha Harish registryEntries.emplace_back(&entry); 19374eec26bSSunitha Harish } 19474eec26bSSunitha Harish } 195e51c710eSJames Feist else 196e51c710eSJames Feist { 197d8a5d5d8SJiaqing Zhao messages::resourceNotFound(asyncResp->res, "MessageRegistryFile", 1987e860f15SJohn Edward Broadbent registry); 199e51c710eSJames Feist return; 200e51c710eSJames Feist } 201e51c710eSJames Feist 2026e8c18f0SJohn Edward Broadbent if (registry != registryMatch) 203e51c710eSJames Feist { 2046e8c18f0SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, header->type, registryMatch); 205e51c710eSJames Feist return; 206e51c710eSJames Feist } 207e51c710eSJames Feist 2081476687dSEd Tanous asyncResp->res.jsonValue["@Redfish.Copyright"] = header->copyright; 2091476687dSEd Tanous asyncResp->res.jsonValue["@odata.type"] = header->type; 2101476687dSEd Tanous asyncResp->res.jsonValue["Id"] = header->id; 2111476687dSEd Tanous asyncResp->res.jsonValue["Name"] = header->name; 2121476687dSEd Tanous asyncResp->res.jsonValue["Language"] = header->language; 2131476687dSEd Tanous asyncResp->res.jsonValue["Description"] = header->description; 2141476687dSEd Tanous asyncResp->res.jsonValue["RegistryPrefix"] = header->registryPrefix; 2151476687dSEd Tanous asyncResp->res.jsonValue["RegistryVersion"] = header->registryVersion; 2161476687dSEd Tanous asyncResp->res.jsonValue["OwningEntity"] = header->owningEntity; 21770304cb5SJason M. Bills 218dff07827SJohn Edward Broadbent nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"]; 21970304cb5SJason M. Bills 22070304cb5SJason M. Bills // Go through the Message Registry and populate each Message 221fffb8c1fSEd Tanous for (const registries::MessageEntry* message : registryEntries) 22270304cb5SJason M. Bills { 223e51c710eSJames Feist nlohmann::json& obj = messageObj[message->first]; 2241476687dSEd Tanous obj["Description"] = message->second.description; 2251476687dSEd Tanous obj["Message"] = message->second.message; 2261476687dSEd Tanous obj["Severity"] = message->second.messageSeverity; 2271476687dSEd Tanous obj["MessageSeverity"] = message->second.messageSeverity; 2281476687dSEd Tanous obj["NumberOfArgs"] = message->second.numberOfArgs; 2291476687dSEd Tanous obj["Resolution"] = message->second.resolution; 230e51c710eSJames Feist if (message->second.numberOfArgs > 0) 23170304cb5SJason M. Bills { 23214c8aee2SEd Tanous nlohmann::json& messageParamArray = obj["ParamTypes"]; 233938f2568SEd Tanous messageParamArray = nlohmann::json::array(); 234e51c710eSJames Feist for (const char* str : message->second.paramTypes) 23570304cb5SJason M. Bills { 23670304cb5SJason M. Bills if (str == nullptr) 23770304cb5SJason M. Bills { 23870304cb5SJason M. Bills break; 23970304cb5SJason M. Bills } 24070304cb5SJason M. Bills messageParamArray.push_back(str); 24170304cb5SJason M. Bills } 24270304cb5SJason M. Bills } 24370304cb5SJason M. Bills } 24470304cb5SJason M. Bills } 24570304cb5SJason M. Bills 246dff07827SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app) 247dff07827SJohn Edward Broadbent { 248dff07827SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 249dff07827SJohn Edward Broadbent .privileges(redfish::privileges::getMessageRegistryFile) 25045ca1b86SEd Tanous .methods(boost::beast::http::verb::get)( 25145ca1b86SEd Tanous std::bind_front(handleMessageRegistryGet, std::ref(app))); 252dff07827SJohn Edward Broadbent } 25370304cb5SJason M. Bills } // namespace redfish 254