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 24*7e860f15SJohn Edward Broadbent #include <app.hpp> 25*7e860f15SJohn Edward Broadbent 2670304cb5SJason M. Bills namespace redfish 2770304cb5SJason M. Bills { 2870304cb5SJason M. Bills 29*7e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistryFileCollection(App& app) 3070304cb5SJason M. Bills { 3170304cb5SJason M. Bills /** 3270304cb5SJason M. Bills * Functions triggers appropriate requests on DBus 3370304cb5SJason M. Bills */ 34*7e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/") 35*7e860f15SJohn Edward Broadbent .privileges({"Login"}) 36*7e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 37*7e860f15SJohn Edward Broadbent [](const crow::Request&, 38*7e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 39*7e860f15SJohn Edward Broadbent // Collections don't include the static data added by SubRoute 40*7e860f15SJohn Edward Broadbent // because it has a duplicate entry for members 4114c8aee2SEd Tanous 428d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 43*7e860f15SJohn Edward Broadbent {"@odata.type", "#MessageRegistryFileCollection." 44*7e860f15SJohn Edward Broadbent "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"}}}}}; 54*7e860f15SJohn Edward Broadbent }); 5570304cb5SJason M. Bills } 5670304cb5SJason M. Bills 57*7e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistryFile(App& app) 5870304cb5SJason M. Bills { 59*7e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/") 60*7e860f15SJohn Edward Broadbent .privileges({"Login"}) 61*7e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 62*7e860f15SJohn Edward Broadbent [](const crow::Request&, 63*7e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 64*7e860f15SJohn Edward Broadbent const std::string& registry) { 65e51c710eSJames Feist const message_registries::Header* header; 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( 928d1b46d7Szhanghch05 asyncResp->res, 93*7e860f15SJohn Edward Broadbent "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 94*7e860f15SJohn Edward Broadbent registry); 95e51c710eSJames Feist return; 96e51c710eSJames Feist } 97e51c710eSJames Feist 988d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 99e51c710eSJames Feist {"@odata.id", "/redfish/v1/Registries/" + registry}, 100*7e860f15SJohn Edward Broadbent {"@odata.type", 101*7e860f15SJohn Edward Broadbent "#MessageRegistryFile.v1_1_0.MessageRegistryFile"}, 102e51c710eSJames Feist {"Name", registry + " Message Registry File"}, 103e51c710eSJames Feist {"Description", 104e51c710eSJames Feist dmtf + registry + " Message Registry File Location"}, 105e51c710eSJames Feist {"Id", header->registryPrefix}, 106e51c710eSJames Feist {"Registry", header->id}, 10714c8aee2SEd Tanous {"Languages", {"en"}}, 10814c8aee2SEd Tanous {"Languages@odata.count", 1}, 10914c8aee2SEd Tanous {"Location", 11014c8aee2SEd Tanous {{{"Language", "en"}, 111*7e860f15SJohn Edward Broadbent {"Uri", "/redfish/v1/Registries/" + registry + "/" + 112*7e860f15SJohn Edward Broadbent registry}}}}, 11314c8aee2SEd Tanous {"Location@odata.count", 1}}; 114e51c710eSJames Feist 115e51c710eSJames Feist if (url != nullptr) 116e51c710eSJames Feist { 117*7e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["Location"][0]["PublicationUri"] = 118*7e860f15SJohn Edward Broadbent url; 119e51c710eSJames Feist } 120*7e860f15SJohn Edward Broadbent }); 12170304cb5SJason M. Bills } 12270304cb5SJason M. Bills 123*7e860f15SJohn Edward Broadbent inline void requestRoutesMessageRegistry(App& app) 12470304cb5SJason M. Bills { 125*7e860f15SJohn Edward Broadbent BMCWEB_ROUTE(app, "/redfish/v1/Registries/<str>/<str>/") 126*7e860f15SJohn Edward Broadbent .privileges({"Login"}) 127*7e860f15SJohn Edward Broadbent .methods(boost::beast::http::verb::get)( 128*7e860f15SJohn Edward Broadbent [](const crow::Request&, 129*7e860f15SJohn Edward Broadbent const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 130*7e860f15SJohn Edward Broadbent const std::string& registry, const std::string& registry1) 131*7e860f15SJohn Edward Broadbent 132e51c710eSJames Feist { 133e51c710eSJames Feist const message_registries::Header* header; 134*7e860f15SJohn Edward Broadbent std::vector<const message_registries::MessageEntry*> 135*7e860f15SJohn Edward Broadbent registryEntries; 136e51c710eSJames Feist if (registry == "Base") 137e51c710eSJames Feist { 138e51c710eSJames Feist header = &message_registries::base::header; 139e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 140e51c710eSJames Feist message_registries::base::registry) 141e51c710eSJames Feist { 142e51c710eSJames Feist registryEntries.emplace_back(&entry); 143e51c710eSJames Feist } 144e51c710eSJames Feist } 145e51c710eSJames Feist else if (registry == "TaskEvent") 146e51c710eSJames Feist { 147e51c710eSJames Feist header = &message_registries::task_event::header; 148e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 149e51c710eSJames Feist message_registries::task_event::registry) 150e51c710eSJames Feist { 151e51c710eSJames Feist registryEntries.emplace_back(&entry); 152e51c710eSJames Feist } 153e51c710eSJames Feist } 154e51c710eSJames Feist else if (registry == "OpenBMC") 155e51c710eSJames Feist { 156e51c710eSJames Feist header = &message_registries::openbmc::header; 157e51c710eSJames Feist for (const message_registries::MessageEntry& entry : 158e51c710eSJames Feist message_registries::openbmc::registry) 159e51c710eSJames Feist { 160e51c710eSJames Feist registryEntries.emplace_back(&entry); 161e51c710eSJames Feist } 162e51c710eSJames Feist } 16374eec26bSSunitha Harish else if (registry == "ResourceEvent") 16474eec26bSSunitha Harish { 16574eec26bSSunitha Harish header = &message_registries::resource_event::header; 16674eec26bSSunitha Harish for (const message_registries::MessageEntry& entry : 16774eec26bSSunitha Harish message_registries::resource_event::registry) 16874eec26bSSunitha Harish { 16974eec26bSSunitha Harish registryEntries.emplace_back(&entry); 17074eec26bSSunitha Harish } 17174eec26bSSunitha Harish } 172e51c710eSJames Feist else 173e51c710eSJames Feist { 174e51c710eSJames Feist messages::resourceNotFound( 1758d1b46d7Szhanghch05 asyncResp->res, 176*7e860f15SJohn Edward Broadbent "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 177*7e860f15SJohn Edward Broadbent registry); 178e51c710eSJames Feist return; 179e51c710eSJames Feist } 180e51c710eSJames Feist 181e51c710eSJames Feist if (registry != registry1) 182e51c710eSJames Feist { 183*7e860f15SJohn Edward Broadbent messages::resourceNotFound(asyncResp->res, header->type, 184*7e860f15SJohn Edward Broadbent registry1); 185e51c710eSJames Feist return; 186e51c710eSJames Feist } 187e51c710eSJames Feist 1888d1b46d7Szhanghch05 asyncResp->res.jsonValue = { 1898d1b46d7Szhanghch05 {"@Redfish.Copyright", header->copyright}, 190e51c710eSJames Feist {"@odata.type", header->type}, 191e51c710eSJames Feist {"Id", header->id}, 192e51c710eSJames Feist {"Name", header->name}, 193e51c710eSJames Feist {"Language", header->language}, 194e51c710eSJames Feist {"Description", header->description}, 195e51c710eSJames Feist {"RegistryPrefix", header->registryPrefix}, 196e51c710eSJames Feist {"RegistryVersion", header->registryVersion}, 197e51c710eSJames Feist {"OwningEntity", header->owningEntity}}; 19870304cb5SJason M. Bills 199*7e860f15SJohn Edward Broadbent nlohmann::json& messageObj = 200*7e860f15SJohn Edward Broadbent asyncResp->res.jsonValue["Messages"]; 20170304cb5SJason M. Bills 20270304cb5SJason M. Bills // Go through the Message Registry and populate each Message 203*7e860f15SJohn Edward Broadbent for (const message_registries::MessageEntry* message : 204*7e860f15SJohn Edward Broadbent registryEntries) 20570304cb5SJason M. Bills { 206e51c710eSJames Feist nlohmann::json& obj = messageObj[message->first]; 207e51c710eSJames Feist obj = {{"Description", message->second.description}, 208e51c710eSJames Feist {"Message", message->second.message}, 209e51c710eSJames Feist {"Severity", message->second.severity}, 210e7808c93SGunnar Mills {"MessageSeverity", message->second.messageSeverity}, 211e51c710eSJames Feist {"NumberOfArgs", message->second.numberOfArgs}, 212e51c710eSJames Feist {"Resolution", message->second.resolution}}; 213e51c710eSJames Feist if (message->second.numberOfArgs > 0) 21470304cb5SJason M. Bills { 21514c8aee2SEd Tanous nlohmann::json& messageParamArray = obj["ParamTypes"]; 216e51c710eSJames Feist for (const char* str : message->second.paramTypes) 21770304cb5SJason M. Bills { 21870304cb5SJason M. Bills if (str == nullptr) 21970304cb5SJason M. Bills { 22070304cb5SJason M. Bills break; 22170304cb5SJason M. Bills } 22270304cb5SJason M. Bills messageParamArray.push_back(str); 22370304cb5SJason M. Bills } 22470304cb5SJason M. Bills } 22570304cb5SJason M. Bills } 226*7e860f15SJohn Edward Broadbent }); 22770304cb5SJason M. Bills } 22870304cb5SJason M. Bills 22970304cb5SJason M. Bills } // namespace redfish 230