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 "node.hpp" 1970304cb5SJason M. Bills #include "registries.hpp" 2070304cb5SJason M. Bills #include "registries/base_message_registry.hpp" 21fbe8378fSJason M. Bills #include "registries/openbmc_message_registry.hpp" 22*e51c710eSJames Feist #include "registries/task_event_message_registry.hpp" 2370304cb5SJason M. Bills 2470304cb5SJason M. Bills namespace redfish 2570304cb5SJason M. Bills { 2670304cb5SJason M. Bills 2770304cb5SJason M. Bills class MessageRegistryFileCollection : public Node 2870304cb5SJason M. Bills { 2970304cb5SJason M. Bills public: 3070304cb5SJason M. Bills template <typename CrowApp> 3170304cb5SJason M. Bills MessageRegistryFileCollection(CrowApp &app) : 3270304cb5SJason M. Bills Node(app, "/redfish/v1/Registries/") 3370304cb5SJason M. Bills { 3470304cb5SJason M. Bills entityPrivileges = { 3570304cb5SJason M. Bills {boost::beast::http::verb::get, {{"Login"}}}, 3670304cb5SJason M. Bills {boost::beast::http::verb::head, {{"Login"}}}, 3770304cb5SJason M. Bills {boost::beast::http::verb::patch, {{"ConfigureManager"}}}, 3870304cb5SJason M. Bills {boost::beast::http::verb::put, {{"ConfigureManager"}}}, 3970304cb5SJason M. Bills {boost::beast::http::verb::delete_, {{"ConfigureManager"}}}, 4070304cb5SJason M. Bills {boost::beast::http::verb::post, {{"ConfigureManager"}}}}; 4170304cb5SJason M. Bills } 4270304cb5SJason M. Bills 4370304cb5SJason M. Bills private: 4470304cb5SJason M. Bills /** 4570304cb5SJason M. Bills * Functions triggers appropriate requests on DBus 4670304cb5SJason M. Bills */ 4770304cb5SJason M. Bills void doGet(crow::Response &res, const crow::Request &req, 4870304cb5SJason M. Bills const std::vector<std::string> ¶ms) override 4970304cb5SJason M. Bills { 5070304cb5SJason M. Bills // Collections don't include the static data added by SubRoute because 5170304cb5SJason M. Bills // it has a duplicate entry for members 5214c8aee2SEd Tanous 5314c8aee2SEd Tanous res.jsonValue = { 5414c8aee2SEd Tanous {"@odata.type", 5514c8aee2SEd Tanous "#MessageRegistryFileCollection.MessageRegistryFileCollection"}, 5614c8aee2SEd Tanous {"@odata.id", "/redfish/v1/Registries"}, 5714c8aee2SEd Tanous {"Name", "MessageRegistryFile Collection"}, 5814c8aee2SEd Tanous {"Description", "Collection of MessageRegistryFiles"}, 59*e51c710eSJames Feist {"Members@odata.count", 3}, 6014c8aee2SEd Tanous {"Members", 6114c8aee2SEd Tanous {{{"@odata.id", "/redfish/v1/Registries/Base"}}, 62*e51c710eSJames Feist {{"@odata.id", "/redfish/v1/Registries/TaskEvent"}}, 6314c8aee2SEd Tanous {{"@odata.id", "/redfish/v1/Registries/OpenBMC"}}}}}; 6414c8aee2SEd Tanous 6514c8aee2SEd Tanous res.end(); 6670304cb5SJason M. Bills } 6770304cb5SJason M. Bills }; 6870304cb5SJason M. Bills 69*e51c710eSJames Feist class MessageRegistryFile : public Node 7070304cb5SJason M. Bills { 7170304cb5SJason M. Bills public: 7270304cb5SJason M. Bills template <typename CrowApp> 73*e51c710eSJames Feist MessageRegistryFile(CrowApp &app) : 74*e51c710eSJames Feist Node(app, "/redfish/v1/Registries/<str>/", std::string()) 7570304cb5SJason M. Bills { 7670304cb5SJason M. Bills entityPrivileges = { 7770304cb5SJason M. Bills {boost::beast::http::verb::get, {{"Login"}}}, 7870304cb5SJason M. Bills {boost::beast::http::verb::head, {{"Login"}}}, 7970304cb5SJason M. Bills {boost::beast::http::verb::patch, {{"ConfigureManager"}}}, 8070304cb5SJason M. Bills {boost::beast::http::verb::put, {{"ConfigureManager"}}}, 8170304cb5SJason M. Bills {boost::beast::http::verb::delete_, {{"ConfigureManager"}}}, 8270304cb5SJason M. Bills {boost::beast::http::verb::post, {{"ConfigureManager"}}}}; 8370304cb5SJason M. Bills } 8470304cb5SJason M. Bills 8570304cb5SJason M. Bills private: 8670304cb5SJason M. Bills void doGet(crow::Response &res, const crow::Request &req, 8770304cb5SJason M. Bills const std::vector<std::string> ¶ms) override 8870304cb5SJason M. Bills { 89*e51c710eSJames Feist if (params.size() != 1) 90*e51c710eSJames Feist { 91*e51c710eSJames Feist messages::internalError(res); 92*e51c710eSJames Feist res.end(); 93*e51c710eSJames Feist return; 94*e51c710eSJames Feist } 95*e51c710eSJames Feist 96*e51c710eSJames Feist const std::string ®istry = params[0]; 97*e51c710eSJames Feist const message_registries::Header *header; 98*e51c710eSJames Feist std::string dmtf = "DMTF "; 99*e51c710eSJames Feist const char *url = nullptr; 100*e51c710eSJames Feist 101*e51c710eSJames Feist if (registry == "Base") 102*e51c710eSJames Feist { 103*e51c710eSJames Feist header = &message_registries::base::header; 104*e51c710eSJames Feist url = message_registries::base::url; 105*e51c710eSJames Feist } 106*e51c710eSJames Feist else if (registry == "TaskEvent") 107*e51c710eSJames Feist { 108*e51c710eSJames Feist header = &message_registries::task_event::header; 109*e51c710eSJames Feist url = message_registries::task_event::url; 110*e51c710eSJames Feist } 111*e51c710eSJames Feist else if (registry == "OpenBMC") 112*e51c710eSJames Feist { 113*e51c710eSJames Feist header = &message_registries::openbmc::header; 114*e51c710eSJames Feist dmtf.clear(); 115*e51c710eSJames Feist } 116*e51c710eSJames Feist else 117*e51c710eSJames Feist { 118*e51c710eSJames Feist messages::resourceNotFound( 119*e51c710eSJames Feist res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 120*e51c710eSJames Feist registry); 121*e51c710eSJames Feist res.end(); 122*e51c710eSJames Feist return; 123*e51c710eSJames Feist } 124*e51c710eSJames Feist 12514c8aee2SEd Tanous res.jsonValue = { 126*e51c710eSJames Feist {"@odata.id", "/redfish/v1/Registries/" + registry}, 12714c8aee2SEd Tanous {"@odata.type", "#MessageRegistryFile.v1_1_0.MessageRegistryFile"}, 128*e51c710eSJames Feist {"Name", registry + " Message Registry File"}, 129*e51c710eSJames Feist {"Description", 130*e51c710eSJames Feist dmtf + registry + " Message Registry File Location"}, 131*e51c710eSJames Feist {"Id", header->registryPrefix}, 132*e51c710eSJames Feist {"Registry", header->id}, 13314c8aee2SEd Tanous {"Languages", {"en"}}, 13414c8aee2SEd Tanous {"Languages@odata.count", 1}, 13514c8aee2SEd Tanous {"Location", 13614c8aee2SEd Tanous {{{"Language", "en"}, 137*e51c710eSJames Feist {"Uri", 138*e51c710eSJames Feist "/redfish/v1/Registries/" + registry + "/" + registry}}}}, 13914c8aee2SEd Tanous {"Location@odata.count", 1}}; 140*e51c710eSJames Feist 141*e51c710eSJames Feist if (url != nullptr) 142*e51c710eSJames Feist { 143*e51c710eSJames Feist res.jsonValue["Location"][0]["PublicationUri"] = url; 144*e51c710eSJames Feist } 145*e51c710eSJames Feist 14614c8aee2SEd Tanous res.end(); 14770304cb5SJason M. Bills } 14870304cb5SJason M. Bills }; 14970304cb5SJason M. Bills 150*e51c710eSJames Feist class MessageRegistry : public Node 15170304cb5SJason M. Bills { 15270304cb5SJason M. Bills public: 15370304cb5SJason M. Bills template <typename CrowApp> 154*e51c710eSJames Feist MessageRegistry(CrowApp &app) : 155*e51c710eSJames Feist Node(app, "/redfish/v1/Registries/<str>/<str>/", std::string(), 156*e51c710eSJames Feist std::string()) 15770304cb5SJason M. Bills { 15870304cb5SJason M. Bills entityPrivileges = { 15970304cb5SJason M. Bills {boost::beast::http::verb::get, {{"Login"}}}, 16070304cb5SJason M. Bills {boost::beast::http::verb::head, {{"Login"}}}, 16170304cb5SJason M. Bills {boost::beast::http::verb::patch, {{"ConfigureManager"}}}, 16270304cb5SJason M. Bills {boost::beast::http::verb::put, {{"ConfigureManager"}}}, 16370304cb5SJason M. Bills {boost::beast::http::verb::delete_, {{"ConfigureManager"}}}, 16470304cb5SJason M. Bills {boost::beast::http::verb::post, {{"ConfigureManager"}}}}; 16570304cb5SJason M. Bills } 16670304cb5SJason M. Bills 16770304cb5SJason M. Bills private: 16870304cb5SJason M. Bills void doGet(crow::Response &res, const crow::Request &req, 16970304cb5SJason M. Bills const std::vector<std::string> ¶ms) override 17070304cb5SJason M. Bills { 171*e51c710eSJames Feist if (params.size() != 2) 172*e51c710eSJames Feist { 173*e51c710eSJames Feist messages::internalError(res); 174*e51c710eSJames Feist res.end(); 175*e51c710eSJames Feist return; 176*e51c710eSJames Feist } 177*e51c710eSJames Feist 178*e51c710eSJames Feist const std::string ®istry = params[0]; 179*e51c710eSJames Feist const std::string ®istry1 = params[1]; 180*e51c710eSJames Feist 181*e51c710eSJames Feist const message_registries::Header *header; 182*e51c710eSJames Feist std::vector<const message_registries::MessageEntry *> registryEntries; 183*e51c710eSJames Feist if (registry == "Base") 184*e51c710eSJames Feist { 185*e51c710eSJames Feist header = &message_registries::base::header; 186*e51c710eSJames Feist for (const message_registries::MessageEntry &entry : 187*e51c710eSJames Feist message_registries::base::registry) 188*e51c710eSJames Feist { 189*e51c710eSJames Feist registryEntries.emplace_back(&entry); 190*e51c710eSJames Feist } 191*e51c710eSJames Feist } 192*e51c710eSJames Feist else if (registry == "TaskEvent") 193*e51c710eSJames Feist { 194*e51c710eSJames Feist header = &message_registries::task_event::header; 195*e51c710eSJames Feist for (const message_registries::MessageEntry &entry : 196*e51c710eSJames Feist message_registries::task_event::registry) 197*e51c710eSJames Feist { 198*e51c710eSJames Feist registryEntries.emplace_back(&entry); 199*e51c710eSJames Feist } 200*e51c710eSJames Feist } 201*e51c710eSJames Feist else if (registry == "OpenBMC") 202*e51c710eSJames Feist { 203*e51c710eSJames Feist header = &message_registries::openbmc::header; 204*e51c710eSJames Feist for (const message_registries::MessageEntry &entry : 205*e51c710eSJames Feist message_registries::openbmc::registry) 206*e51c710eSJames Feist { 207*e51c710eSJames Feist registryEntries.emplace_back(&entry); 208*e51c710eSJames Feist } 209*e51c710eSJames Feist } 210*e51c710eSJames Feist else 211*e51c710eSJames Feist { 212*e51c710eSJames Feist messages::resourceNotFound( 213*e51c710eSJames Feist res, "#MessageRegistryFile.v1_1_0.MessageRegistryFile", 214*e51c710eSJames Feist registry); 215*e51c710eSJames Feist res.end(); 216*e51c710eSJames Feist return; 217*e51c710eSJames Feist } 218*e51c710eSJames Feist 219*e51c710eSJames Feist if (registry != registry1) 220*e51c710eSJames Feist { 221*e51c710eSJames Feist messages::resourceNotFound(res, header->type, registry1); 222*e51c710eSJames Feist res.end(); 223*e51c710eSJames Feist return; 224*e51c710eSJames Feist } 225*e51c710eSJames Feist 226*e51c710eSJames Feist res.jsonValue = {{"@Redfish.Copyright", header->copyright}, 227*e51c710eSJames Feist {"@odata.type", header->type}, 228*e51c710eSJames Feist {"Id", header->id}, 229*e51c710eSJames Feist {"Name", header->name}, 230*e51c710eSJames Feist {"Language", header->language}, 231*e51c710eSJames Feist {"Description", header->description}, 232*e51c710eSJames Feist {"RegistryPrefix", header->registryPrefix}, 233*e51c710eSJames Feist {"RegistryVersion", header->registryVersion}, 234*e51c710eSJames Feist {"OwningEntity", header->owningEntity}}; 23570304cb5SJason M. Bills 23614c8aee2SEd Tanous nlohmann::json &messageObj = res.jsonValue["Messages"]; 23770304cb5SJason M. Bills 23870304cb5SJason M. Bills // Go through the Message Registry and populate each Message 239*e51c710eSJames Feist for (const message_registries::MessageEntry *message : registryEntries) 24070304cb5SJason M. Bills { 241*e51c710eSJames Feist nlohmann::json &obj = messageObj[message->first]; 242*e51c710eSJames Feist obj = {{"Description", message->second.description}, 243*e51c710eSJames Feist {"Message", message->second.message}, 244*e51c710eSJames Feist {"Severity", message->second.severity}, 245*e51c710eSJames Feist {"NumberOfArgs", message->second.numberOfArgs}, 246*e51c710eSJames Feist {"Resolution", message->second.resolution}}; 247*e51c710eSJames Feist if (message->second.numberOfArgs > 0) 24870304cb5SJason M. Bills { 24914c8aee2SEd Tanous nlohmann::json &messageParamArray = obj["ParamTypes"]; 250*e51c710eSJames Feist for (const char *str : message->second.paramTypes) 25170304cb5SJason M. Bills { 25270304cb5SJason M. Bills if (str == nullptr) 25370304cb5SJason M. Bills { 25470304cb5SJason M. Bills break; 25570304cb5SJason M. Bills } 25670304cb5SJason M. Bills messageParamArray.push_back(str); 25770304cb5SJason M. Bills } 25870304cb5SJason M. Bills } 25970304cb5SJason M. Bills } 26014c8aee2SEd Tanous res.end(); 26170304cb5SJason M. Bills } 26270304cb5SJason M. Bills }; 26370304cb5SJason M. Bills 26470304cb5SJason M. Bills } // namespace redfish 265