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