xref: /openbmc/bmcweb/features/redfish/lib/cable.hpp (revision b9d36b4791d77a47e1f3c5c4564fcdf7cc68c115)
19c929beaSShantappa Teekappanavar #pragma once
2*b9d36b47SEd Tanous #include <dbus_utility.hpp>
39c929beaSShantappa Teekappanavar #include <utils/json_utils.hpp>
49c929beaSShantappa Teekappanavar 
59c929beaSShantappa Teekappanavar namespace redfish
69c929beaSShantappa Teekappanavar {
79c929beaSShantappa Teekappanavar /**
89c929beaSShantappa Teekappanavar  * @brief Fill cable specific properties.
99c929beaSShantappa Teekappanavar  * @param[in,out]   resp        HTTP response.
109c929beaSShantappa Teekappanavar  * @param[in]       ec          Error code corresponding to Async method call.
119c929beaSShantappa Teekappanavar  * @param[in]       properties  List of Cable Properties key/value pairs.
129c929beaSShantappa Teekappanavar  */
139c929beaSShantappa Teekappanavar inline void
149c929beaSShantappa Teekappanavar     fillCableProperties(crow::Response& resp,
159c929beaSShantappa Teekappanavar                         const boost::system::error_code ec,
169c929beaSShantappa Teekappanavar                         const dbus::utility::DBusPropertiesMap& properties)
179c929beaSShantappa Teekappanavar {
189c929beaSShantappa Teekappanavar     if (ec)
199c929beaSShantappa Teekappanavar     {
209c929beaSShantappa Teekappanavar         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
219c929beaSShantappa Teekappanavar         messages::internalError(resp);
229c929beaSShantappa Teekappanavar         return;
239c929beaSShantappa Teekappanavar     }
249c929beaSShantappa Teekappanavar 
259c929beaSShantappa Teekappanavar     for (const auto& [propKey, propVariant] : properties)
269c929beaSShantappa Teekappanavar     {
279c929beaSShantappa Teekappanavar         if (propKey == "CableTypeDescription")
289c929beaSShantappa Teekappanavar         {
299c929beaSShantappa Teekappanavar             const std::string* cableTypeDescription =
309c929beaSShantappa Teekappanavar                 std::get_if<std::string>(&propVariant);
319c929beaSShantappa Teekappanavar             if (cableTypeDescription == nullptr)
329c929beaSShantappa Teekappanavar             {
339c929beaSShantappa Teekappanavar                 messages::internalError(resp);
349c929beaSShantappa Teekappanavar                 return;
359c929beaSShantappa Teekappanavar             }
369c929beaSShantappa Teekappanavar             resp.jsonValue["CableType"] = *cableTypeDescription;
379c929beaSShantappa Teekappanavar         }
389c929beaSShantappa Teekappanavar         else if (propKey == "Length")
399c929beaSShantappa Teekappanavar         {
409c929beaSShantappa Teekappanavar             const double* cableLength = std::get_if<double>(&propVariant);
419c929beaSShantappa Teekappanavar             if (cableLength == nullptr)
429c929beaSShantappa Teekappanavar             {
439c929beaSShantappa Teekappanavar                 messages::internalError(resp);
449c929beaSShantappa Teekappanavar                 return;
459c929beaSShantappa Teekappanavar             }
469c929beaSShantappa Teekappanavar 
479c929beaSShantappa Teekappanavar             if (!std::isfinite(*cableLength))
489c929beaSShantappa Teekappanavar             {
499c929beaSShantappa Teekappanavar                 if (std::isnan(*cableLength))
509c929beaSShantappa Teekappanavar                 {
519c929beaSShantappa Teekappanavar                     continue;
529c929beaSShantappa Teekappanavar                 }
539c929beaSShantappa Teekappanavar                 messages::internalError(resp);
549c929beaSShantappa Teekappanavar                 return;
559c929beaSShantappa Teekappanavar             }
569c929beaSShantappa Teekappanavar 
579c929beaSShantappa Teekappanavar             resp.jsonValue["LengthMeters"] = *cableLength;
589c929beaSShantappa Teekappanavar         }
599c929beaSShantappa Teekappanavar     }
609c929beaSShantappa Teekappanavar }
619c929beaSShantappa Teekappanavar 
629c929beaSShantappa Teekappanavar /**
639c929beaSShantappa Teekappanavar  * @brief Api to get Cable properties.
649c929beaSShantappa Teekappanavar  * @param[in,out]   asyncResp       Async HTTP response.
659c929beaSShantappa Teekappanavar  * @param[in]       cableObjectPath Object path of the Cable.
669c929beaSShantappa Teekappanavar  * @param[in]       serviceMap      A map to hold Service and corresponding
679c929beaSShantappa Teekappanavar  * interface list for the given cable id.
689c929beaSShantappa Teekappanavar  */
699c929beaSShantappa Teekappanavar inline void
709c929beaSShantappa Teekappanavar     getCableProperties(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
719c929beaSShantappa Teekappanavar                        const std::string& cableObjectPath,
729c929beaSShantappa Teekappanavar                        const dbus::utility::MapperServiceMap& serviceMap)
739c929beaSShantappa Teekappanavar {
749c929beaSShantappa Teekappanavar     BMCWEB_LOG_DEBUG << "Get Properties for cable " << cableObjectPath;
759c929beaSShantappa Teekappanavar 
769c929beaSShantappa Teekappanavar     for (const auto& [service, interfaces] : serviceMap)
779c929beaSShantappa Teekappanavar     {
789c929beaSShantappa Teekappanavar         for (const auto& interface : interfaces)
799c929beaSShantappa Teekappanavar         {
809c929beaSShantappa Teekappanavar             if (interface != "xyz.openbmc_project.Inventory.Item.Cable")
819c929beaSShantappa Teekappanavar             {
829c929beaSShantappa Teekappanavar                 continue;
839c929beaSShantappa Teekappanavar             }
849c929beaSShantappa Teekappanavar 
859c929beaSShantappa Teekappanavar             crow::connections::systemBus->async_method_call(
869c929beaSShantappa Teekappanavar                 [asyncResp](
879c929beaSShantappa Teekappanavar                     const boost::system::error_code ec,
889c929beaSShantappa Teekappanavar                     const dbus::utility::DBusPropertiesMap& properties) {
899c929beaSShantappa Teekappanavar                     fillCableProperties(asyncResp->res, ec, properties);
909c929beaSShantappa Teekappanavar                 },
919c929beaSShantappa Teekappanavar                 service, cableObjectPath, "org.freedesktop.DBus.Properties",
929c929beaSShantappa Teekappanavar                 "GetAll", interface);
939c929beaSShantappa Teekappanavar         }
949c929beaSShantappa Teekappanavar     }
959c929beaSShantappa Teekappanavar }
969c929beaSShantappa Teekappanavar 
979c929beaSShantappa Teekappanavar /**
989c929beaSShantappa Teekappanavar  * The Cable schema
999c929beaSShantappa Teekappanavar  */
1009c929beaSShantappa Teekappanavar inline void requestRoutesCable(App& app)
1019c929beaSShantappa Teekappanavar {
1029c929beaSShantappa Teekappanavar     BMCWEB_ROUTE(app, "/redfish/v1/Cables/<str>/")
1039c929beaSShantappa Teekappanavar         .privileges(redfish::privileges::getCable)
1049c929beaSShantappa Teekappanavar         .methods(boost::beast::http::verb::get)(
1059c929beaSShantappa Teekappanavar             [](const crow::Request&,
1069c929beaSShantappa Teekappanavar                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
1079c929beaSShantappa Teekappanavar                const std::string& cableId) {
1089c929beaSShantappa Teekappanavar                 BMCWEB_LOG_DEBUG << "Cable Id: " << cableId;
1099c929beaSShantappa Teekappanavar                 auto respHandler =
1109c929beaSShantappa Teekappanavar                     [asyncResp,
1119c929beaSShantappa Teekappanavar                      cableId](const boost::system::error_code ec,
1129c929beaSShantappa Teekappanavar                               const dbus::utility::MapperGetSubTreeResponse&
1139c929beaSShantappa Teekappanavar                                   subtree) {
1149c929beaSShantappa Teekappanavar                         if (ec.value() == EBADR)
1159c929beaSShantappa Teekappanavar                         {
1169c929beaSShantappa Teekappanavar                             messages::resourceNotFound(
1179c929beaSShantappa Teekappanavar                                 asyncResp->res, "#Cable.v1_0_0.Cable", cableId);
1189c929beaSShantappa Teekappanavar                             return;
1199c929beaSShantappa Teekappanavar                         }
1209c929beaSShantappa Teekappanavar 
1219c929beaSShantappa Teekappanavar                         if (ec)
1229c929beaSShantappa Teekappanavar                         {
1239c929beaSShantappa Teekappanavar                             BMCWEB_LOG_ERROR << "DBUS response error " << ec;
1249c929beaSShantappa Teekappanavar                             messages::internalError(asyncResp->res);
1259c929beaSShantappa Teekappanavar                             return;
1269c929beaSShantappa Teekappanavar                         }
1279c929beaSShantappa Teekappanavar 
1289c929beaSShantappa Teekappanavar                         for (const auto& [objectPath, serviceMap] : subtree)
1299c929beaSShantappa Teekappanavar                         {
1309c929beaSShantappa Teekappanavar                             sdbusplus::message::object_path path(objectPath);
1319c929beaSShantappa Teekappanavar                             if (path.filename() != cableId)
1329c929beaSShantappa Teekappanavar                             {
1339c929beaSShantappa Teekappanavar                                 continue;
1349c929beaSShantappa Teekappanavar                             }
1359c929beaSShantappa Teekappanavar 
1369c929beaSShantappa Teekappanavar                             asyncResp->res.jsonValue["@odata.type"] =
1379c929beaSShantappa Teekappanavar                                 "#Cable.v1_0_0.Cable";
1389c929beaSShantappa Teekappanavar                             asyncResp->res.jsonValue["@odata.id"] =
1399c929beaSShantappa Teekappanavar                                 "/redfish/v1/Cables/" + cableId;
1409c929beaSShantappa Teekappanavar                             asyncResp->res.jsonValue["Id"] = cableId;
1419c929beaSShantappa Teekappanavar                             asyncResp->res.jsonValue["Name"] = "Cable";
1429c929beaSShantappa Teekappanavar 
1439c929beaSShantappa Teekappanavar                             getCableProperties(asyncResp, objectPath,
1449c929beaSShantappa Teekappanavar                                                serviceMap);
1459c929beaSShantappa Teekappanavar                             return;
1469c929beaSShantappa Teekappanavar                         }
1479c929beaSShantappa Teekappanavar                         messages::resourceNotFound(asyncResp->res, "Cable",
1489c929beaSShantappa Teekappanavar                                                    cableId);
1499c929beaSShantappa Teekappanavar                     };
1509c929beaSShantappa Teekappanavar 
1519c929beaSShantappa Teekappanavar                 crow::connections::systemBus->async_method_call(
1529c929beaSShantappa Teekappanavar                     respHandler, "xyz.openbmc_project.ObjectMapper",
1539c929beaSShantappa Teekappanavar                     "/xyz/openbmc_project/object_mapper",
1549c929beaSShantappa Teekappanavar                     "xyz.openbmc_project.ObjectMapper", "GetSubTree",
1559c929beaSShantappa Teekappanavar                     "/xyz/openbmc_project/inventory", 0,
1569c929beaSShantappa Teekappanavar                     std::array<const char*, 1>{
1579c929beaSShantappa Teekappanavar                         "xyz.openbmc_project.Inventory.Item.Cable"});
1589c929beaSShantappa Teekappanavar             });
1599c929beaSShantappa Teekappanavar }
1609c929beaSShantappa Teekappanavar 
1619c929beaSShantappa Teekappanavar /**
1629c929beaSShantappa Teekappanavar  * Collection of Cable resource instances
1639c929beaSShantappa Teekappanavar  */
1649c929beaSShantappa Teekappanavar inline void requestRoutesCableCollection(App& app)
1659c929beaSShantappa Teekappanavar {
1669c929beaSShantappa Teekappanavar     BMCWEB_ROUTE(app, "/redfish/v1/Cables/")
1679c929beaSShantappa Teekappanavar         .privileges(redfish::privileges::getCableCollection)
1689c929beaSShantappa Teekappanavar         .methods(boost::beast::http::verb::get)(
1699c929beaSShantappa Teekappanavar             [](const crow::Request&,
1709c929beaSShantappa Teekappanavar                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
1719c929beaSShantappa Teekappanavar                 asyncResp->res.jsonValue["@odata.type"] =
1729c929beaSShantappa Teekappanavar                     "#CableCollection.CableCollection";
1739c929beaSShantappa Teekappanavar                 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Cables";
1749c929beaSShantappa Teekappanavar                 asyncResp->res.jsonValue["Name"] = "Cable Collection";
1759c929beaSShantappa Teekappanavar                 asyncResp->res.jsonValue["Description"] =
1769c929beaSShantappa Teekappanavar                     "Collection of Cable Entries";
1779c929beaSShantappa Teekappanavar 
1789c929beaSShantappa Teekappanavar                 collection_util::getCollectionMembers(
1799c929beaSShantappa Teekappanavar                     asyncResp, "/redfish/v1/Cables",
1809c929beaSShantappa Teekappanavar                     {"xyz.openbmc_project.Inventory.Item.Cable"});
1819c929beaSShantappa Teekappanavar             });
1829c929beaSShantappa Teekappanavar }
1839c929beaSShantappa Teekappanavar 
1849c929beaSShantappa Teekappanavar } // namespace redfish
185