xref: /openbmc/bmcweb/features/redfish/lib/fabric_adapters.hpp (revision 7f3e84a151e106d9227d08358e9ee3fd225b34c4)
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