13179105bSSunny Srivastava #pragma once 23179105bSSunny Srivastava 33179105bSSunny Srivastava #include "app.hpp" 43179105bSSunny Srivastava #include "dbus_utility.hpp" 5a8e884fcSEd Tanous #include "query.hpp" 6a8e884fcSEd Tanous #include "registries/privilege_registry.hpp" 73179105bSSunny Srivastava #include "utils/collection.hpp" 86177a301SLakshmi Yadlapati #include "utils/dbus_utils.hpp" 93179105bSSunny Srivastava #include "utils/json_utils.hpp" 103179105bSSunny Srivastava 113179105bSSunny Srivastava #include <boost/system/error_code.hpp> 12ef4c65b7SEd Tanous #include <boost/url/format.hpp> 13f05e9169SGunnar Mills #include <sdbusplus/asio/property.hpp> 146177a301SLakshmi Yadlapati #include <sdbusplus/unpack_properties.hpp> 153179105bSSunny Srivastava 163179105bSSunny Srivastava #include <array> 173179105bSSunny Srivastava #include <functional> 183179105bSSunny Srivastava #include <memory> 193179105bSSunny Srivastava #include <string> 203179105bSSunny Srivastava #include <string_view> 213179105bSSunny Srivastava 223179105bSSunny Srivastava namespace redfish 233179105bSSunny Srivastava { 243179105bSSunny Srivastava 253179105bSSunny Srivastava inline void handleAdapterError(const boost::system::error_code& ec, 263179105bSSunny Srivastava crow::Response& res, 273179105bSSunny Srivastava const std::string& adapterId) 283179105bSSunny Srivastava { 293179105bSSunny Srivastava if (ec.value() == boost::system::errc::io_error) 303179105bSSunny Srivastava { 3153ffeca5SLakshmi Yadlapati messages::resourceNotFound(res, "#FabricAdapter.v1_4_0.FabricAdapter", 323179105bSSunny Srivastava adapterId); 333179105bSSunny Srivastava return; 343179105bSSunny Srivastava } 353179105bSSunny Srivastava 363179105bSSunny Srivastava BMCWEB_LOG_ERROR << "DBus method call failed with error " << ec.value(); 373179105bSSunny Srivastava messages::internalError(res); 383179105bSSunny Srivastava } 393179105bSSunny Srivastava 40ac106bf6SEd Tanous inline void getFabricAdapterLocation( 41ac106bf6SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 42ac106bf6SEd Tanous const std::string& serviceName, const std::string& fabricAdapterPath) 4353ffeca5SLakshmi Yadlapati { 4453ffeca5SLakshmi Yadlapati sdbusplus::asio::getProperty<std::string>( 4553ffeca5SLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 4653ffeca5SLakshmi Yadlapati "xyz.openbmc_project.Inventory.Decorator.LocationCode", "LocationCode", 47ac106bf6SEd Tanous [asyncResp](const boost::system::error_code& ec, 4853ffeca5SLakshmi Yadlapati const std::string& property) { 4953ffeca5SLakshmi Yadlapati if (ec) 5053ffeca5SLakshmi Yadlapati { 5153ffeca5SLakshmi Yadlapati if (ec.value() != EBADR) 5253ffeca5SLakshmi Yadlapati { 5353ffeca5SLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for Location"; 54ac106bf6SEd Tanous messages::internalError(asyncResp->res); 5553ffeca5SLakshmi Yadlapati } 5653ffeca5SLakshmi Yadlapati return; 5753ffeca5SLakshmi Yadlapati } 5853ffeca5SLakshmi Yadlapati 59ac106bf6SEd Tanous asyncResp->res.jsonValue["Location"]["PartLocation"]["ServiceLabel"] = 6053ffeca5SLakshmi Yadlapati property; 6153ffeca5SLakshmi Yadlapati }); 6253ffeca5SLakshmi Yadlapati } 6353ffeca5SLakshmi Yadlapati 646369421dSLakshmi Yadlapati inline void 65ac106bf6SEd Tanous getFabricAdapterAsset(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 666369421dSLakshmi Yadlapati const std::string& serviceName, 676369421dSLakshmi Yadlapati const std::string& fabricAdapterPath) 686369421dSLakshmi Yadlapati { 696369421dSLakshmi Yadlapati sdbusplus::asio::getAllProperties( 706369421dSLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 716369421dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Decorator.Asset", 72ac106bf6SEd Tanous [fabricAdapterPath, asyncResp{asyncResp}]( 73ac106bf6SEd Tanous const boost::system::error_code& ec, 746369421dSLakshmi Yadlapati const dbus::utility::DBusPropertiesMap& propertiesList) { 756369421dSLakshmi Yadlapati if (ec) 766369421dSLakshmi Yadlapati { 776369421dSLakshmi Yadlapati if (ec.value() != EBADR) 786369421dSLakshmi Yadlapati { 796369421dSLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for Properties"; 80ac106bf6SEd Tanous messages::internalError(asyncResp->res); 816369421dSLakshmi Yadlapati } 826369421dSLakshmi Yadlapati return; 836369421dSLakshmi Yadlapati } 846369421dSLakshmi Yadlapati 856369421dSLakshmi Yadlapati const std::string* serialNumber = nullptr; 866369421dSLakshmi Yadlapati const std::string* model = nullptr; 876369421dSLakshmi Yadlapati const std::string* partNumber = nullptr; 886369421dSLakshmi Yadlapati const std::string* sparePartNumber = nullptr; 896369421dSLakshmi Yadlapati 906369421dSLakshmi Yadlapati const bool success = sdbusplus::unpackPropertiesNoThrow( 916369421dSLakshmi Yadlapati dbus_utils::UnpackErrorPrinter(), propertiesList, "SerialNumber", 926369421dSLakshmi Yadlapati serialNumber, "Model", model, "PartNumber", partNumber, 936369421dSLakshmi Yadlapati "SparePartNumber", sparePartNumber); 946369421dSLakshmi Yadlapati 956369421dSLakshmi Yadlapati if (!success) 966369421dSLakshmi Yadlapati { 97ac106bf6SEd Tanous messages::internalError(asyncResp->res); 986369421dSLakshmi Yadlapati return; 996369421dSLakshmi Yadlapati } 1006369421dSLakshmi Yadlapati 1016369421dSLakshmi Yadlapati if (serialNumber != nullptr) 1026369421dSLakshmi Yadlapati { 103ac106bf6SEd Tanous asyncResp->res.jsonValue["SerialNumber"] = *serialNumber; 1046369421dSLakshmi Yadlapati } 1056369421dSLakshmi Yadlapati 1066369421dSLakshmi Yadlapati if (model != nullptr) 1076369421dSLakshmi Yadlapati { 108ac106bf6SEd Tanous asyncResp->res.jsonValue["Model"] = *model; 1096369421dSLakshmi Yadlapati } 1106369421dSLakshmi Yadlapati 1116369421dSLakshmi Yadlapati if (partNumber != nullptr) 1126369421dSLakshmi Yadlapati { 113ac106bf6SEd Tanous asyncResp->res.jsonValue["PartNumber"] = *partNumber; 1146369421dSLakshmi Yadlapati } 1156369421dSLakshmi Yadlapati 1166369421dSLakshmi Yadlapati if (sparePartNumber != nullptr && !sparePartNumber->empty()) 1176369421dSLakshmi Yadlapati { 118ac106bf6SEd Tanous asyncResp->res.jsonValue["SparePartNumber"] = *sparePartNumber; 1196369421dSLakshmi Yadlapati } 1206369421dSLakshmi Yadlapati }); 1216369421dSLakshmi Yadlapati } 1226369421dSLakshmi Yadlapati 123cd7af44fSLakshmi Yadlapati inline void 124ac106bf6SEd Tanous getFabricAdapterState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 125cd7af44fSLakshmi Yadlapati const std::string& serviceName, 126cd7af44fSLakshmi Yadlapati const std::string& fabricAdapterPath) 127cd7af44fSLakshmi Yadlapati { 128cd7af44fSLakshmi Yadlapati sdbusplus::asio::getProperty<bool>( 129cd7af44fSLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 130cd7af44fSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item", "Present", 131ac106bf6SEd Tanous [asyncResp](const boost::system::error_code& ec, const bool present) { 132cd7af44fSLakshmi Yadlapati if (ec) 133cd7af44fSLakshmi Yadlapati { 134cd7af44fSLakshmi Yadlapati if (ec.value() != EBADR) 135cd7af44fSLakshmi Yadlapati { 136cd7af44fSLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for State"; 137ac106bf6SEd Tanous messages::internalError(asyncResp->res); 138cd7af44fSLakshmi Yadlapati } 139cd7af44fSLakshmi Yadlapati return; 140cd7af44fSLakshmi Yadlapati } 141cd7af44fSLakshmi Yadlapati 142cd7af44fSLakshmi Yadlapati if (!present) 143cd7af44fSLakshmi Yadlapati { 144ac106bf6SEd Tanous asyncResp->res.jsonValue["Status"]["State"] = "Absent"; 145cd7af44fSLakshmi Yadlapati } 146cd7af44fSLakshmi Yadlapati }); 147cd7af44fSLakshmi Yadlapati } 148cd7af44fSLakshmi Yadlapati 1497da847b6SLakshmi Yadlapati inline void 150ac106bf6SEd Tanous getFabricAdapterHealth(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1517da847b6SLakshmi Yadlapati const std::string& serviceName, 1527da847b6SLakshmi Yadlapati const std::string& fabricAdapterPath) 1537da847b6SLakshmi Yadlapati { 1547da847b6SLakshmi Yadlapati sdbusplus::asio::getProperty<bool>( 1557da847b6SLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 1567da847b6SLakshmi Yadlapati "xyz.openbmc_project.State.Decorator.OperationalStatus", "Functional", 157ac106bf6SEd Tanous [asyncResp](const boost::system::error_code& ec, 158ac106bf6SEd Tanous const bool functional) { 1597da847b6SLakshmi Yadlapati if (ec) 1607da847b6SLakshmi Yadlapati { 1617da847b6SLakshmi Yadlapati if (ec.value() != EBADR) 1627da847b6SLakshmi Yadlapati { 1637da847b6SLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for Health"; 164ac106bf6SEd Tanous messages::internalError(asyncResp->res); 1657da847b6SLakshmi Yadlapati } 1667da847b6SLakshmi Yadlapati return; 1677da847b6SLakshmi Yadlapati } 1687da847b6SLakshmi Yadlapati 1697da847b6SLakshmi Yadlapati if (!functional) 1707da847b6SLakshmi Yadlapati { 171ac106bf6SEd Tanous asyncResp->res.jsonValue["Status"]["Health"] = "Critical"; 1727da847b6SLakshmi Yadlapati } 1737da847b6SLakshmi Yadlapati }); 1747da847b6SLakshmi Yadlapati } 1757da847b6SLakshmi Yadlapati 176ac106bf6SEd Tanous inline void doAdapterGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 1773179105bSSunny Srivastava const std::string& systemName, 17853ffeca5SLakshmi Yadlapati const std::string& adapterId, 17953ffeca5SLakshmi Yadlapati const std::string& fabricAdapterPath, 18053ffeca5SLakshmi Yadlapati const std::string& serviceName) 1813179105bSSunny Srivastava { 182ac106bf6SEd Tanous asyncResp->res.addHeader( 1833179105bSSunny Srivastava boost::beast::http::field::link, 1843179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapter/FabricAdapter.json>; rel=describedby"); 185ac106bf6SEd Tanous asyncResp->res.jsonValue["@odata.type"] = 186ac106bf6SEd Tanous "#FabricAdapter.v1_4_0.FabricAdapter"; 187ac106bf6SEd Tanous asyncResp->res.jsonValue["Name"] = "Fabric Adapter"; 188ac106bf6SEd Tanous asyncResp->res.jsonValue["Id"] = adapterId; 189ac106bf6SEd Tanous asyncResp->res.jsonValue["@odata.id"] = boost::urls::format( 190ef4c65b7SEd Tanous "/redfish/v1/Systems/{}/FabricAdapters/{}", systemName, adapterId); 19153ffeca5SLakshmi Yadlapati 192ac106bf6SEd Tanous asyncResp->res.jsonValue["Status"]["State"] = "Enabled"; 193ac106bf6SEd Tanous asyncResp->res.jsonValue["Status"]["Health"] = "OK"; 194cd7af44fSLakshmi Yadlapati 195ac106bf6SEd Tanous getFabricAdapterLocation(asyncResp, serviceName, fabricAdapterPath); 196ac106bf6SEd Tanous getFabricAdapterAsset(asyncResp, serviceName, fabricAdapterPath); 197ac106bf6SEd Tanous getFabricAdapterState(asyncResp, serviceName, fabricAdapterPath); 198ac106bf6SEd Tanous getFabricAdapterHealth(asyncResp, serviceName, fabricAdapterPath); 1993179105bSSunny Srivastava } 2003179105bSSunny Srivastava 2013179105bSSunny Srivastava inline bool checkFabricAdapterId(const std::string& adapterPath, 2023179105bSSunny Srivastava const std::string& adapterId) 2033179105bSSunny Srivastava { 2043179105bSSunny Srivastava std::string fabricAdapterName = 2053179105bSSunny Srivastava sdbusplus::message::object_path(adapterPath).filename(); 2063179105bSSunny Srivastava 2073179105bSSunny Srivastava return !(fabricAdapterName.empty() || fabricAdapterName != adapterId); 2083179105bSSunny Srivastava } 2093179105bSSunny Srivastava 2103179105bSSunny Srivastava inline void getValidFabricAdapterPath( 2113179105bSSunny Srivastava const std::string& adapterId, const std::string& systemName, 212ac106bf6SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 2133179105bSSunny Srivastava std::function<void(const std::string& fabricAdapterPath, 2143179105bSSunny Srivastava const std::string& serviceName)>&& callback) 2153179105bSSunny Srivastava { 2163179105bSSunny Srivastava if (systemName != "system") 2173179105bSSunny Srivastava { 218ac106bf6SEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 219ac106bf6SEd Tanous systemName); 2203179105bSSunny Srivastava return; 2213179105bSSunny Srivastava } 2223179105bSSunny Srivastava constexpr std::array<std::string_view, 1> interfaces{ 2233179105bSSunny Srivastava "xyz.openbmc_project.Inventory.Item.FabricAdapter"}; 2243179105bSSunny Srivastava 2253179105bSSunny Srivastava dbus::utility::getSubTree( 2263179105bSSunny Srivastava "/xyz/openbmc_project/inventory", 0, interfaces, 227ac106bf6SEd Tanous [adapterId, asyncResp, 2283179105bSSunny Srivastava callback](const boost::system::error_code& ec, 2293179105bSSunny Srivastava const dbus::utility::MapperGetSubTreeResponse& subtree) { 2303179105bSSunny Srivastava if (ec) 2313179105bSSunny Srivastava { 232ac106bf6SEd Tanous handleAdapterError(ec, asyncResp->res, adapterId); 2333179105bSSunny Srivastava return; 2343179105bSSunny Srivastava } 2353179105bSSunny Srivastava for (const auto& [adapterPath, serviceMap] : subtree) 2363179105bSSunny Srivastava { 2373179105bSSunny Srivastava if (checkFabricAdapterId(adapterPath, adapterId)) 2383179105bSSunny Srivastava { 2393179105bSSunny Srivastava callback(adapterPath, serviceMap.begin()->first); 2403179105bSSunny Srivastava return; 2413179105bSSunny Srivastava } 2423179105bSSunny Srivastava } 2433179105bSSunny Srivastava BMCWEB_LOG_WARNING << "Adapter not found"; 244ac106bf6SEd Tanous messages::resourceNotFound(asyncResp->res, "FabricAdapter", adapterId); 2453179105bSSunny Srivastava }); 2463179105bSSunny Srivastava } 2473179105bSSunny Srivastava 2483179105bSSunny Srivastava inline void 2493179105bSSunny Srivastava handleFabricAdapterGet(App& app, const crow::Request& req, 250ac106bf6SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 2513179105bSSunny Srivastava const std::string& systemName, 2523179105bSSunny Srivastava const std::string& adapterId) 2533179105bSSunny Srivastava { 254ac106bf6SEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 2553179105bSSunny Srivastava { 2563179105bSSunny Srivastava return; 2573179105bSSunny Srivastava } 258*7f3e84a1SEd Tanous if constexpr (bmcwebEnableMultiHost) 259*7f3e84a1SEd Tanous { 260*7f3e84a1SEd Tanous // Option currently returns no systems. TBD 261*7f3e84a1SEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 262*7f3e84a1SEd Tanous systemName); 263*7f3e84a1SEd Tanous return; 264*7f3e84a1SEd Tanous } 2653179105bSSunny Srivastava 2663179105bSSunny Srivastava getValidFabricAdapterPath( 267ac106bf6SEd Tanous adapterId, systemName, asyncResp, 268ac106bf6SEd Tanous [asyncResp, systemName, adapterId](const std::string& fabricAdapterPath, 26953ffeca5SLakshmi Yadlapati const std::string& serviceName) { 270ac106bf6SEd Tanous doAdapterGet(asyncResp, systemName, adapterId, fabricAdapterPath, 27153ffeca5SLakshmi Yadlapati serviceName); 2723179105bSSunny Srivastava }); 2733179105bSSunny Srivastava } 2743179105bSSunny Srivastava 2753179105bSSunny Srivastava inline void handleFabricAdapterCollectionGet( 2763179105bSSunny Srivastava crow::App& app, const crow::Request& req, 277ac106bf6SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 2783179105bSSunny Srivastava const std::string& systemName) 2793179105bSSunny Srivastava { 280ac106bf6SEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 2813179105bSSunny Srivastava { 2823179105bSSunny Srivastava return; 2833179105bSSunny Srivastava } 284*7f3e84a1SEd Tanous if constexpr (bmcwebEnableMultiHost) 285*7f3e84a1SEd Tanous { 286*7f3e84a1SEd Tanous // Option currently returns no systems. TBD 287*7f3e84a1SEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 288*7f3e84a1SEd Tanous systemName); 289*7f3e84a1SEd Tanous return; 290*7f3e84a1SEd Tanous } 2913179105bSSunny Srivastava if (systemName != "system") 2923179105bSSunny Srivastava { 293ac106bf6SEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 294ac106bf6SEd Tanous systemName); 2953179105bSSunny Srivastava return; 2963179105bSSunny Srivastava } 2973179105bSSunny Srivastava 298ac106bf6SEd Tanous asyncResp->res.addHeader( 2993179105bSSunny Srivastava boost::beast::http::field::link, 3003179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapterCollection/FabricAdapterCollection.json>; rel=describedby"); 301ac106bf6SEd Tanous asyncResp->res.jsonValue["@odata.type"] = 3023179105bSSunny Srivastava "#FabricAdapterCollection.FabricAdapterCollection"; 303ac106bf6SEd Tanous asyncResp->res.jsonValue["Name"] = "Fabric Adapter Collection"; 304ac106bf6SEd Tanous asyncResp->res.jsonValue["@odata.id"] = boost::urls::format( 305ef4c65b7SEd Tanous "/redfish/v1/Systems/{}/FabricAdapters", systemName); 3063179105bSSunny Srivastava 3073179105bSSunny Srivastava constexpr std::array<std::string_view, 1> interfaces{ 3083179105bSSunny Srivastava "xyz.openbmc_project.Inventory.Item.FabricAdapter"}; 3093179105bSSunny Srivastava collection_util::getCollectionMembers( 310ac106bf6SEd Tanous asyncResp, 311ac106bf6SEd Tanous boost::urls::url("/redfish/v1/Systems/system/FabricAdapters"), 3123179105bSSunny Srivastava interfaces); 3133179105bSSunny Srivastava } 3143179105bSSunny Srivastava 3153179105bSSunny Srivastava inline void handleFabricAdapterCollectionHead( 3163179105bSSunny Srivastava crow::App& app, const crow::Request& req, 317ac106bf6SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 3183179105bSSunny Srivastava const std::string& systemName) 3193179105bSSunny Srivastava { 320ac106bf6SEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 3213179105bSSunny Srivastava { 3223179105bSSunny Srivastava return; 3233179105bSSunny Srivastava } 324*7f3e84a1SEd Tanous if constexpr (bmcwebEnableMultiHost) 325*7f3e84a1SEd Tanous { 326*7f3e84a1SEd Tanous // Option currently returns no systems. TBD 327*7f3e84a1SEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 328*7f3e84a1SEd Tanous systemName); 329*7f3e84a1SEd Tanous return; 330*7f3e84a1SEd Tanous } 3313179105bSSunny Srivastava if (systemName != "system") 3323179105bSSunny Srivastava { 333ac106bf6SEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 334ac106bf6SEd Tanous systemName); 3353179105bSSunny Srivastava return; 3363179105bSSunny Srivastava } 337ac106bf6SEd Tanous asyncResp->res.addHeader( 3383179105bSSunny Srivastava boost::beast::http::field::link, 3393179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapterCollection/FabricAdapterCollection.json>; rel=describedby"); 3403179105bSSunny Srivastava } 3413179105bSSunny Srivastava 3423179105bSSunny Srivastava inline void 3433179105bSSunny Srivastava handleFabricAdapterHead(crow::App& app, const crow::Request& req, 344ac106bf6SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 3453179105bSSunny Srivastava const std::string& systemName, 3463179105bSSunny Srivastava const std::string& adapterId) 3473179105bSSunny Srivastava { 348ac106bf6SEd Tanous if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 3493179105bSSunny Srivastava { 3503179105bSSunny Srivastava return; 3513179105bSSunny Srivastava } 3523179105bSSunny Srivastava 353*7f3e84a1SEd Tanous if constexpr (bmcwebEnableMultiHost) 354*7f3e84a1SEd Tanous { 355*7f3e84a1SEd Tanous // Option currently returns no systems. TBD 356*7f3e84a1SEd Tanous messages::resourceNotFound(asyncResp->res, "ComputerSystem", 357*7f3e84a1SEd Tanous systemName); 358*7f3e84a1SEd Tanous return; 359*7f3e84a1SEd Tanous } 360ac106bf6SEd Tanous getValidFabricAdapterPath(adapterId, systemName, asyncResp, 361ac106bf6SEd Tanous [asyncResp, systemName, adapterId]( 362ac106bf6SEd Tanous const std::string&, const std::string&) { 363ac106bf6SEd Tanous asyncResp->res.addHeader( 3643179105bSSunny Srivastava boost::beast::http::field::link, 3653179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapter/FabricAdapter.json>; rel=describedby"); 3663179105bSSunny Srivastava }); 3673179105bSSunny Srivastava } 3683179105bSSunny Srivastava 3693179105bSSunny Srivastava inline void requestRoutesFabricAdapterCollection(App& app) 3703179105bSSunny Srivastava { 3713179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/") 3723179105bSSunny Srivastava .privileges(redfish::privileges::getFabricAdapterCollection) 3733179105bSSunny Srivastava .methods(boost::beast::http::verb::get)( 3743179105bSSunny Srivastava std::bind_front(handleFabricAdapterCollectionGet, std::ref(app))); 3753179105bSSunny Srivastava 3763179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/") 3773179105bSSunny Srivastava .privileges(redfish::privileges::headFabricAdapterCollection) 3783179105bSSunny Srivastava .methods(boost::beast::http::verb::head)( 3793179105bSSunny Srivastava std::bind_front(handleFabricAdapterCollectionHead, std::ref(app))); 3803179105bSSunny Srivastava } 3813179105bSSunny Srivastava 3823179105bSSunny Srivastava inline void requestRoutesFabricAdapters(App& app) 3833179105bSSunny Srivastava { 3843179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/<str>/") 3853179105bSSunny Srivastava .privileges(redfish::privileges::getFabricAdapter) 3863179105bSSunny Srivastava .methods(boost::beast::http::verb::get)( 3873179105bSSunny Srivastava std::bind_front(handleFabricAdapterGet, std::ref(app))); 3883179105bSSunny Srivastava 3893179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/<str>/") 3903179105bSSunny Srivastava .privileges(redfish::privileges::headFabricAdapter) 3913179105bSSunny Srivastava .methods(boost::beast::http::verb::head)( 3923179105bSSunny Srivastava std::bind_front(handleFabricAdapterHead, std::ref(app))); 3933179105bSSunny Srivastava } 3943179105bSSunny Srivastava } // namespace redfish 395