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" 83179105bSSunny Srivastava #include "utils/json_utils.hpp" 93179105bSSunny Srivastava 103179105bSSunny Srivastava #include <boost/system/error_code.hpp> 11*f05e9169SGunnar Mills #include <sdbusplus/asio/property.hpp> 123179105bSSunny Srivastava 133179105bSSunny Srivastava #include <array> 143179105bSSunny Srivastava #include <functional> 153179105bSSunny Srivastava #include <memory> 163179105bSSunny Srivastava #include <string> 173179105bSSunny Srivastava #include <string_view> 183179105bSSunny Srivastava 193179105bSSunny Srivastava namespace redfish 203179105bSSunny Srivastava { 213179105bSSunny Srivastava 223179105bSSunny Srivastava inline void handleAdapterError(const boost::system::error_code& ec, 233179105bSSunny Srivastava crow::Response& res, 243179105bSSunny Srivastava const std::string& adapterId) 253179105bSSunny Srivastava { 263179105bSSunny Srivastava 273179105bSSunny Srivastava if (ec.value() == boost::system::errc::io_error) 283179105bSSunny Srivastava { 2953ffeca5SLakshmi Yadlapati messages::resourceNotFound(res, "#FabricAdapter.v1_4_0.FabricAdapter", 303179105bSSunny Srivastava adapterId); 313179105bSSunny Srivastava return; 323179105bSSunny Srivastava } 333179105bSSunny Srivastava 343179105bSSunny Srivastava BMCWEB_LOG_ERROR << "DBus method call failed with error " << ec.value(); 353179105bSSunny Srivastava messages::internalError(res); 363179105bSSunny Srivastava } 373179105bSSunny Srivastava 3853ffeca5SLakshmi Yadlapati inline void 3953ffeca5SLakshmi Yadlapati getFabricAdapterLocation(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 4053ffeca5SLakshmi Yadlapati const std::string& serviceName, 4153ffeca5SLakshmi Yadlapati const std::string& fabricAdapterPath) 4253ffeca5SLakshmi Yadlapati { 4353ffeca5SLakshmi Yadlapati sdbusplus::asio::getProperty<std::string>( 4453ffeca5SLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 4553ffeca5SLakshmi Yadlapati "xyz.openbmc_project.Inventory.Decorator.LocationCode", "LocationCode", 4653ffeca5SLakshmi Yadlapati [aResp](const boost::system::error_code ec, 4753ffeca5SLakshmi Yadlapati const std::string& property) { 4853ffeca5SLakshmi Yadlapati if (ec) 4953ffeca5SLakshmi Yadlapati { 5053ffeca5SLakshmi Yadlapati if (ec.value() != EBADR) 5153ffeca5SLakshmi Yadlapati { 5253ffeca5SLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for Location"; 5353ffeca5SLakshmi Yadlapati messages::internalError(aResp->res); 5453ffeca5SLakshmi Yadlapati } 5553ffeca5SLakshmi Yadlapati return; 5653ffeca5SLakshmi Yadlapati } 5753ffeca5SLakshmi Yadlapati 5853ffeca5SLakshmi Yadlapati aResp->res.jsonValue["Location"]["PartLocation"]["ServiceLabel"] = 5953ffeca5SLakshmi Yadlapati property; 6053ffeca5SLakshmi Yadlapati }); 6153ffeca5SLakshmi Yadlapati } 6253ffeca5SLakshmi Yadlapati 636369421dSLakshmi Yadlapati inline void 646369421dSLakshmi Yadlapati getFabricAdapterAsset(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 656369421dSLakshmi Yadlapati const std::string& serviceName, 666369421dSLakshmi Yadlapati const std::string& fabricAdapterPath) 676369421dSLakshmi Yadlapati { 686369421dSLakshmi Yadlapati sdbusplus::asio::getAllProperties( 696369421dSLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 706369421dSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Decorator.Asset", 716369421dSLakshmi Yadlapati [fabricAdapterPath, 726369421dSLakshmi Yadlapati aResp{aResp}](const boost::system::error_code ec, 736369421dSLakshmi Yadlapati const dbus::utility::DBusPropertiesMap& propertiesList) { 746369421dSLakshmi Yadlapati if (ec) 756369421dSLakshmi Yadlapati { 766369421dSLakshmi Yadlapati if (ec.value() != EBADR) 776369421dSLakshmi Yadlapati { 786369421dSLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for Properties"; 796369421dSLakshmi Yadlapati messages::internalError(aResp->res); 806369421dSLakshmi Yadlapati } 816369421dSLakshmi Yadlapati return; 826369421dSLakshmi Yadlapati } 836369421dSLakshmi Yadlapati 846369421dSLakshmi Yadlapati const std::string* serialNumber = nullptr; 856369421dSLakshmi Yadlapati const std::string* model = nullptr; 866369421dSLakshmi Yadlapati const std::string* partNumber = nullptr; 876369421dSLakshmi Yadlapati const std::string* sparePartNumber = nullptr; 886369421dSLakshmi Yadlapati 896369421dSLakshmi Yadlapati const bool success = sdbusplus::unpackPropertiesNoThrow( 906369421dSLakshmi Yadlapati dbus_utils::UnpackErrorPrinter(), propertiesList, "SerialNumber", 916369421dSLakshmi Yadlapati serialNumber, "Model", model, "PartNumber", partNumber, 926369421dSLakshmi Yadlapati "SparePartNumber", sparePartNumber); 936369421dSLakshmi Yadlapati 946369421dSLakshmi Yadlapati if (!success) 956369421dSLakshmi Yadlapati { 966369421dSLakshmi Yadlapati messages::internalError(aResp->res); 976369421dSLakshmi Yadlapati return; 986369421dSLakshmi Yadlapati } 996369421dSLakshmi Yadlapati 1006369421dSLakshmi Yadlapati if (serialNumber != nullptr) 1016369421dSLakshmi Yadlapati { 1026369421dSLakshmi Yadlapati aResp->res.jsonValue["SerialNumber"] = *serialNumber; 1036369421dSLakshmi Yadlapati } 1046369421dSLakshmi Yadlapati 1056369421dSLakshmi Yadlapati if (model != nullptr) 1066369421dSLakshmi Yadlapati { 1076369421dSLakshmi Yadlapati aResp->res.jsonValue["Model"] = *model; 1086369421dSLakshmi Yadlapati } 1096369421dSLakshmi Yadlapati 1106369421dSLakshmi Yadlapati if (partNumber != nullptr) 1116369421dSLakshmi Yadlapati { 1126369421dSLakshmi Yadlapati aResp->res.jsonValue["PartNumber"] = *partNumber; 1136369421dSLakshmi Yadlapati } 1146369421dSLakshmi Yadlapati 1156369421dSLakshmi Yadlapati if (sparePartNumber != nullptr && !sparePartNumber->empty()) 1166369421dSLakshmi Yadlapati { 1176369421dSLakshmi Yadlapati aResp->res.jsonValue["SparePartNumber"] = *sparePartNumber; 1186369421dSLakshmi Yadlapati } 1196369421dSLakshmi Yadlapati }); 1206369421dSLakshmi Yadlapati } 1216369421dSLakshmi Yadlapati 122cd7af44fSLakshmi Yadlapati inline void 123cd7af44fSLakshmi Yadlapati getFabricAdapterState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 124cd7af44fSLakshmi Yadlapati const std::string& serviceName, 125cd7af44fSLakshmi Yadlapati const std::string& fabricAdapterPath) 126cd7af44fSLakshmi Yadlapati { 127cd7af44fSLakshmi Yadlapati sdbusplus::asio::getProperty<bool>( 128cd7af44fSLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 129cd7af44fSLakshmi Yadlapati "xyz.openbmc_project.Inventory.Item", "Present", 130cd7af44fSLakshmi Yadlapati [aResp](const boost::system::error_code ec, const bool present) { 131cd7af44fSLakshmi Yadlapati if (ec) 132cd7af44fSLakshmi Yadlapati { 133cd7af44fSLakshmi Yadlapati if (ec.value() != EBADR) 134cd7af44fSLakshmi Yadlapati { 135cd7af44fSLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for State"; 136cd7af44fSLakshmi Yadlapati messages::internalError(aResp->res); 137cd7af44fSLakshmi Yadlapati } 138cd7af44fSLakshmi Yadlapati return; 139cd7af44fSLakshmi Yadlapati } 140cd7af44fSLakshmi Yadlapati 141cd7af44fSLakshmi Yadlapati if (!present) 142cd7af44fSLakshmi Yadlapati { 143cd7af44fSLakshmi Yadlapati aResp->res.jsonValue["Status"]["State"] = "Absent"; 144cd7af44fSLakshmi Yadlapati } 145cd7af44fSLakshmi Yadlapati }); 146cd7af44fSLakshmi Yadlapati } 147cd7af44fSLakshmi Yadlapati 1487da847b6SLakshmi Yadlapati inline void 1497da847b6SLakshmi Yadlapati getFabricAdapterHealth(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1507da847b6SLakshmi Yadlapati const std::string& serviceName, 1517da847b6SLakshmi Yadlapati const std::string& fabricAdapterPath) 1527da847b6SLakshmi Yadlapati { 1537da847b6SLakshmi Yadlapati sdbusplus::asio::getProperty<bool>( 1547da847b6SLakshmi Yadlapati *crow::connections::systemBus, serviceName, fabricAdapterPath, 1557da847b6SLakshmi Yadlapati "xyz.openbmc_project.State.Decorator.OperationalStatus", "Functional", 1567da847b6SLakshmi Yadlapati [aResp](const boost::system::error_code ec, const bool functional) { 1577da847b6SLakshmi Yadlapati if (ec) 1587da847b6SLakshmi Yadlapati { 1597da847b6SLakshmi Yadlapati if (ec.value() != EBADR) 1607da847b6SLakshmi Yadlapati { 1617da847b6SLakshmi Yadlapati BMCWEB_LOG_ERROR << "DBUS response error for Health"; 1627da847b6SLakshmi Yadlapati messages::internalError(aResp->res); 1637da847b6SLakshmi Yadlapati } 1647da847b6SLakshmi Yadlapati return; 1657da847b6SLakshmi Yadlapati } 1667da847b6SLakshmi Yadlapati 1677da847b6SLakshmi Yadlapati if (!functional) 1687da847b6SLakshmi Yadlapati { 1697da847b6SLakshmi Yadlapati aResp->res.jsonValue["Status"]["Health"] = "Critical"; 1707da847b6SLakshmi Yadlapati } 1717da847b6SLakshmi Yadlapati }); 1727da847b6SLakshmi Yadlapati } 1737da847b6SLakshmi Yadlapati 1743179105bSSunny Srivastava inline void doAdapterGet(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1753179105bSSunny Srivastava const std::string& systemName, 17653ffeca5SLakshmi Yadlapati const std::string& adapterId, 17753ffeca5SLakshmi Yadlapati const std::string& fabricAdapterPath, 17853ffeca5SLakshmi Yadlapati const std::string& serviceName) 1793179105bSSunny Srivastava { 1803179105bSSunny Srivastava aResp->res.addHeader( 1813179105bSSunny Srivastava boost::beast::http::field::link, 1823179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapter/FabricAdapter.json>; rel=describedby"); 18353ffeca5SLakshmi Yadlapati aResp->res.jsonValue["@odata.type"] = "#FabricAdapter.v1_4_0.FabricAdapter"; 1843179105bSSunny Srivastava aResp->res.jsonValue["Name"] = "Fabric Adapter"; 1853179105bSSunny Srivastava aResp->res.jsonValue["Id"] = adapterId; 1863179105bSSunny Srivastava aResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces( 1873179105bSSunny Srivastava "redfish", "v1", "Systems", systemName, "FabricAdapters", adapterId); 18853ffeca5SLakshmi Yadlapati 189cd7af44fSLakshmi Yadlapati aResp->res.jsonValue["Status"]["State"] = "Enabled"; 1907da847b6SLakshmi Yadlapati aResp->res.jsonValue["Status"]["Health"] = "OK"; 191cd7af44fSLakshmi Yadlapati 19253ffeca5SLakshmi Yadlapati getFabricAdapterLocation(aResp, serviceName, fabricAdapterPath); 1936369421dSLakshmi Yadlapati getFabricAdapterAsset(aResp, serviceName, fabricAdapterPath); 194cd7af44fSLakshmi Yadlapati getFabricAdapterState(aResp, serviceName, fabricAdapterPath); 1957da847b6SLakshmi Yadlapati getFabricAdapterHealth(aResp, serviceName, fabricAdapterPath); 1963179105bSSunny Srivastava } 1973179105bSSunny Srivastava 1983179105bSSunny Srivastava inline bool checkFabricAdapterId(const std::string& adapterPath, 1993179105bSSunny Srivastava const std::string& adapterId) 2003179105bSSunny Srivastava { 2013179105bSSunny Srivastava std::string fabricAdapterName = 2023179105bSSunny Srivastava sdbusplus::message::object_path(adapterPath).filename(); 2033179105bSSunny Srivastava 2043179105bSSunny Srivastava return !(fabricAdapterName.empty() || fabricAdapterName != adapterId); 2053179105bSSunny Srivastava } 2063179105bSSunny Srivastava 2073179105bSSunny Srivastava inline void getValidFabricAdapterPath( 2083179105bSSunny Srivastava const std::string& adapterId, const std::string& systemName, 2093179105bSSunny Srivastava const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2103179105bSSunny Srivastava std::function<void(const std::string& fabricAdapterPath, 2113179105bSSunny Srivastava const std::string& serviceName)>&& callback) 2123179105bSSunny Srivastava { 2133179105bSSunny Srivastava if (systemName != "system") 2143179105bSSunny Srivastava { 2153179105bSSunny Srivastava messages::resourceNotFound(aResp->res, "ComputerSystem", systemName); 2163179105bSSunny Srivastava return; 2173179105bSSunny Srivastava } 2183179105bSSunny Srivastava constexpr std::array<std::string_view, 1> interfaces{ 2193179105bSSunny Srivastava "xyz.openbmc_project.Inventory.Item.FabricAdapter"}; 2203179105bSSunny Srivastava 2213179105bSSunny Srivastava dbus::utility::getSubTree( 2223179105bSSunny Srivastava "/xyz/openbmc_project/inventory", 0, interfaces, 2233179105bSSunny Srivastava [adapterId, aResp, 2243179105bSSunny Srivastava callback](const boost::system::error_code& ec, 2253179105bSSunny Srivastava const dbus::utility::MapperGetSubTreeResponse& subtree) { 2263179105bSSunny Srivastava if (ec) 2273179105bSSunny Srivastava { 2283179105bSSunny Srivastava handleAdapterError(ec, aResp->res, adapterId); 2293179105bSSunny Srivastava return; 2303179105bSSunny Srivastava } 2313179105bSSunny Srivastava for (const auto& [adapterPath, serviceMap] : subtree) 2323179105bSSunny Srivastava { 2333179105bSSunny Srivastava if (checkFabricAdapterId(adapterPath, adapterId)) 2343179105bSSunny Srivastava { 2353179105bSSunny Srivastava callback(adapterPath, serviceMap.begin()->first); 2363179105bSSunny Srivastava return; 2373179105bSSunny Srivastava } 2383179105bSSunny Srivastava } 2393179105bSSunny Srivastava BMCWEB_LOG_WARNING << "Adapter not found"; 2403179105bSSunny Srivastava messages::resourceNotFound(aResp->res, "FabricAdapter", adapterId); 2413179105bSSunny Srivastava }); 2423179105bSSunny Srivastava } 2433179105bSSunny Srivastava 2443179105bSSunny Srivastava inline void 2453179105bSSunny Srivastava handleFabricAdapterGet(App& app, const crow::Request& req, 2463179105bSSunny Srivastava const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2473179105bSSunny Srivastava const std::string& systemName, 2483179105bSSunny Srivastava const std::string& adapterId) 2493179105bSSunny Srivastava { 2503179105bSSunny Srivastava if (!redfish::setUpRedfishRoute(app, req, aResp)) 2513179105bSSunny Srivastava { 2523179105bSSunny Srivastava return; 2533179105bSSunny Srivastava } 2543179105bSSunny Srivastava 2553179105bSSunny Srivastava getValidFabricAdapterPath( 2563179105bSSunny Srivastava adapterId, systemName, aResp, 25753ffeca5SLakshmi Yadlapati [aResp, systemName, adapterId](const std::string& fabricAdapterPath, 25853ffeca5SLakshmi Yadlapati const std::string& serviceName) { 25953ffeca5SLakshmi Yadlapati doAdapterGet(aResp, systemName, adapterId, fabricAdapterPath, 26053ffeca5SLakshmi Yadlapati serviceName); 2613179105bSSunny Srivastava }); 2623179105bSSunny Srivastava } 2633179105bSSunny Srivastava 2643179105bSSunny Srivastava inline void handleFabricAdapterCollectionGet( 2653179105bSSunny Srivastava crow::App& app, const crow::Request& req, 2663179105bSSunny Srivastava const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2673179105bSSunny Srivastava const std::string& systemName) 2683179105bSSunny Srivastava { 2693179105bSSunny Srivastava if (!redfish::setUpRedfishRoute(app, req, aResp)) 2703179105bSSunny Srivastava { 2713179105bSSunny Srivastava return; 2723179105bSSunny Srivastava } 2733179105bSSunny Srivastava if (systemName != "system") 2743179105bSSunny Srivastava { 2753179105bSSunny Srivastava messages::resourceNotFound(aResp->res, "ComputerSystem", systemName); 2763179105bSSunny Srivastava return; 2773179105bSSunny Srivastava } 2783179105bSSunny Srivastava 2793179105bSSunny Srivastava aResp->res.addHeader( 2803179105bSSunny Srivastava boost::beast::http::field::link, 2813179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapterCollection/FabricAdapterCollection.json>; rel=describedby"); 2823179105bSSunny Srivastava aResp->res.jsonValue["@odata.type"] = 2833179105bSSunny Srivastava "#FabricAdapterCollection.FabricAdapterCollection"; 2843179105bSSunny Srivastava aResp->res.jsonValue["Name"] = "Fabric Adapter Collection"; 2853179105bSSunny Srivastava aResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces( 2863179105bSSunny Srivastava "redfish", "v1", "Systems", systemName, "FabricAdapters"); 2873179105bSSunny Srivastava 2883179105bSSunny Srivastava constexpr std::array<std::string_view, 1> interfaces{ 2893179105bSSunny Srivastava "xyz.openbmc_project.Inventory.Item.FabricAdapter"}; 2903179105bSSunny Srivastava collection_util::getCollectionMembers( 2913179105bSSunny Srivastava aResp, boost::urls::url("/redfish/v1/Systems/system/FabricAdapters"), 2923179105bSSunny Srivastava interfaces); 2933179105bSSunny Srivastava } 2943179105bSSunny Srivastava 2953179105bSSunny Srivastava inline void handleFabricAdapterCollectionHead( 2963179105bSSunny Srivastava crow::App& app, const crow::Request& req, 2973179105bSSunny Srivastava const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2983179105bSSunny Srivastava const std::string& systemName) 2993179105bSSunny Srivastava { 3003179105bSSunny Srivastava if (!redfish::setUpRedfishRoute(app, req, aResp)) 3013179105bSSunny Srivastava { 3023179105bSSunny Srivastava return; 3033179105bSSunny Srivastava } 3043179105bSSunny Srivastava if (systemName != "system") 3053179105bSSunny Srivastava { 3063179105bSSunny Srivastava messages::resourceNotFound(aResp->res, "ComputerSystem", systemName); 3073179105bSSunny Srivastava return; 3083179105bSSunny Srivastava } 3093179105bSSunny Srivastava aResp->res.addHeader( 3103179105bSSunny Srivastava boost::beast::http::field::link, 3113179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapterCollection/FabricAdapterCollection.json>; rel=describedby"); 3123179105bSSunny Srivastava } 3133179105bSSunny Srivastava 3143179105bSSunny Srivastava inline void 3153179105bSSunny Srivastava handleFabricAdapterHead(crow::App& app, const crow::Request& req, 3163179105bSSunny Srivastava const std::shared_ptr<bmcweb::AsyncResp>& aResp, 3173179105bSSunny Srivastava const std::string& systemName, 3183179105bSSunny Srivastava const std::string& adapterId) 3193179105bSSunny Srivastava { 3203179105bSSunny Srivastava if (!redfish::setUpRedfishRoute(app, req, aResp)) 3213179105bSSunny Srivastava { 3223179105bSSunny Srivastava return; 3233179105bSSunny Srivastava } 3243179105bSSunny Srivastava 3253179105bSSunny Srivastava getValidFabricAdapterPath( 3263179105bSSunny Srivastava adapterId, systemName, aResp, 3273179105bSSunny Srivastava [aResp, systemName, adapterId](const std::string&, const std::string&) { 3283179105bSSunny Srivastava aResp->res.addHeader( 3293179105bSSunny Srivastava boost::beast::http::field::link, 3303179105bSSunny Srivastava "</redfish/v1/JsonSchemas/FabricAdapter/FabricAdapter.json>; rel=describedby"); 3313179105bSSunny Srivastava }); 3323179105bSSunny Srivastava } 3333179105bSSunny Srivastava 3343179105bSSunny Srivastava inline void requestRoutesFabricAdapterCollection(App& app) 3353179105bSSunny Srivastava { 3363179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/") 3373179105bSSunny Srivastava .privileges(redfish::privileges::getFabricAdapterCollection) 3383179105bSSunny Srivastava .methods(boost::beast::http::verb::get)( 3393179105bSSunny Srivastava std::bind_front(handleFabricAdapterCollectionGet, std::ref(app))); 3403179105bSSunny Srivastava 3413179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/") 3423179105bSSunny Srivastava .privileges(redfish::privileges::headFabricAdapterCollection) 3433179105bSSunny Srivastava .methods(boost::beast::http::verb::head)( 3443179105bSSunny Srivastava std::bind_front(handleFabricAdapterCollectionHead, std::ref(app))); 3453179105bSSunny Srivastava } 3463179105bSSunny Srivastava 3473179105bSSunny Srivastava inline void requestRoutesFabricAdapters(App& app) 3483179105bSSunny Srivastava { 3493179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/<str>/") 3503179105bSSunny Srivastava .privileges(redfish::privileges::getFabricAdapter) 3513179105bSSunny Srivastava .methods(boost::beast::http::verb::get)( 3523179105bSSunny Srivastava std::bind_front(handleFabricAdapterGet, std::ref(app))); 3533179105bSSunny Srivastava 3543179105bSSunny Srivastava BMCWEB_ROUTE(app, "/redfish/v1/Systems/<str>/FabricAdapters/<str>/") 3553179105bSSunny Srivastava .privileges(redfish::privileges::headFabricAdapter) 3563179105bSSunny Srivastava .methods(boost::beast::http::verb::head)( 3573179105bSSunny Srivastava std::bind_front(handleFabricAdapterHead, std::ref(app))); 3583179105bSSunny Srivastava } 3593179105bSSunny Srivastava } // namespace redfish 360