blob: 423ea9dffb85429da20882200fee11e1afc48308 [file] [log] [blame]
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -06001#pragma once
George Liu7a1dbc42022-12-07 16:03:22 +08002
3#include "dbus_utility.hpp"
Ed Tanous3ccb3ad2023-01-13 17:40:03 -08004#include "query.hpp"
5#include "registries/privilege_registry.hpp"
6#include "utils/collection.hpp"
7#include "utils/dbus_utils.hpp"
8#include "utils/json_utils.hpp"
George Liu7a1dbc42022-12-07 16:03:22 +08009
George Liue99073f2022-12-09 11:06:16 +080010#include <boost/system/error_code.hpp>
Krzysztof Grobelny89474492022-09-06 16:30:38 +020011#include <sdbusplus/asio/property.hpp>
12#include <sdbusplus/unpack_properties.hpp>
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060013
George Liu7a1dbc42022-12-07 16:03:22 +080014#include <array>
15#include <string_view>
16
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060017namespace redfish
18{
19/**
20 * @brief Fill cable specific properties.
21 * @param[in,out] resp HTTP response.
22 * @param[in] ec Error code corresponding to Async method call.
23 * @param[in] properties List of Cable Properties key/value pairs.
24 */
25inline void
26 fillCableProperties(crow::Response& resp,
Ed Tanous5e7e2dc2023-02-16 10:37:01 -080027 const boost::system::error_code& ec,
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060028 const dbus::utility::DBusPropertiesMap& properties)
29{
30 if (ec)
31 {
32 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
33 messages::internalError(resp);
34 return;
35 }
36
Krzysztof Grobelny89474492022-09-06 16:30:38 +020037 const std::string* cableTypeDescription = nullptr;
38 const double* length = nullptr;
39
40 const bool success = sdbusplus::unpackPropertiesNoThrow(
41 dbus_utils::UnpackErrorPrinter(), properties, "CableTypeDescription",
42 cableTypeDescription, "Length", length);
43
44 if (!success)
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060045 {
Krzysztof Grobelny89474492022-09-06 16:30:38 +020046 messages::internalError(resp);
47 return;
48 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060049
Krzysztof Grobelny89474492022-09-06 16:30:38 +020050 if (cableTypeDescription != nullptr)
51 {
52 resp.jsonValue["CableType"] = *cableTypeDescription;
53 }
54
55 if (length != nullptr)
56 {
57 if (!std::isfinite(*length))
58 {
Shantappa Teekappanavar043360d2022-11-03 13:37:24 -050059 // Cable length is NaN by default, do not throw an error
60 if (!std::isnan(*length))
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060061 {
Shantappa Teekappanavar043360d2022-11-03 13:37:24 -050062 messages::internalError(resp);
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060063 return;
64 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060065 }
Shantappa Teekappanavar043360d2022-11-03 13:37:24 -050066 else
67 {
68 resp.jsonValue["LengthMeters"] = *length;
69 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060070 }
71}
72
73/**
74 * @brief Api to get Cable properties.
75 * @param[in,out] asyncResp Async HTTP response.
76 * @param[in] cableObjectPath Object path of the Cable.
77 * @param[in] serviceMap A map to hold Service and corresponding
78 * interface list for the given cable id.
79 */
80inline void
81 getCableProperties(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
82 const std::string& cableObjectPath,
83 const dbus::utility::MapperServiceMap& serviceMap)
84{
85 BMCWEB_LOG_DEBUG << "Get Properties for cable " << cableObjectPath;
86
87 for (const auto& [service, interfaces] : serviceMap)
88 {
89 for (const auto& interface : interfaces)
90 {
91 if (interface != "xyz.openbmc_project.Inventory.Item.Cable")
92 {
93 continue;
94 }
95
Krzysztof Grobelny89474492022-09-06 16:30:38 +020096 sdbusplus::asio::getAllProperties(
97 *crow::connections::systemBus, service, cableObjectPath,
98 interface,
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060099 [asyncResp](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800100 const boost::system::error_code& ec,
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600101 const dbus::utility::DBusPropertiesMap& properties) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700102 fillCableProperties(asyncResp->res, ec, properties);
Krzysztof Grobelny89474492022-09-06 16:30:38 +0200103 });
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600104 }
105 }
106}
107
108/**
109 * The Cable schema
110 */
111inline void requestRoutesCable(App& app)
112{
113 BMCWEB_ROUTE(app, "/redfish/v1/Cables/<str>/")
114 .privileges(redfish::privileges::getCable)
115 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -0700116 [&app](const crow::Request& req,
117 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
118 const std::string& cableId) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000119 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700120 {
121 return;
122 }
123 BMCWEB_LOG_DEBUG << "Cable Id: " << cableId;
George Liue99073f2022-12-09 11:06:16 +0800124 constexpr std::array<std::string_view, 1> interfaces = {
125 "xyz.openbmc_project.Inventory.Item.Cable"};
126 dbus::utility::getSubTree(
127 "/xyz/openbmc_project/inventory", 0, interfaces,
Ed Tanous002d39b2022-05-31 08:59:27 -0700128 [asyncResp,
George Liue99073f2022-12-09 11:06:16 +0800129 cableId](const boost::system::error_code& ec,
Ed Tanous002d39b2022-05-31 08:59:27 -0700130 const dbus::utility::MapperGetSubTreeResponse& subtree) {
131 if (ec.value() == EBADR)
132 {
Jiaqing Zhaod8a5d5d2022-08-05 16:21:51 +0800133 messages::resourceNotFound(asyncResp->res, "Cable", cableId);
Ed Tanous002d39b2022-05-31 08:59:27 -0700134 return;
135 }
136
137 if (ec)
138 {
139 BMCWEB_LOG_ERROR << "DBUS response error " << ec;
140 messages::internalError(asyncResp->res);
141 return;
142 }
143
144 for (const auto& [objectPath, serviceMap] : subtree)
145 {
146 sdbusplus::message::object_path path(objectPath);
147 if (path.filename() != cableId)
Ed Tanous45ca1b82022-03-25 13:07:27 -0700148 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700149 continue;
Ed Tanous45ca1b82022-03-25 13:07:27 -0700150 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600151
Ed Tanous002d39b2022-05-31 08:59:27 -0700152 asyncResp->res.jsonValue["@odata.type"] = "#Cable.v1_0_0.Cable";
153 asyncResp->res.jsonValue["@odata.id"] =
Willy Tueddfc432022-09-26 16:46:38 +0000154 crow::utility::urlFromPieces("redfish", "v1", "Cables",
155 cableId);
Ed Tanous002d39b2022-05-31 08:59:27 -0700156 asyncResp->res.jsonValue["Id"] = cableId;
157 asyncResp->res.jsonValue["Name"] = "Cable";
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600158
Ed Tanous002d39b2022-05-31 08:59:27 -0700159 getCableProperties(asyncResp, objectPath, serviceMap);
160 return;
161 }
162 messages::resourceNotFound(asyncResp->res, "Cable", cableId);
George Liue99073f2022-12-09 11:06:16 +0800163 });
Ed Tanous002d39b2022-05-31 08:59:27 -0700164 });
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600165}
166
167/**
168 * Collection of Cable resource instances
169 */
170inline void requestRoutesCableCollection(App& app)
171{
172 BMCWEB_ROUTE(app, "/redfish/v1/Cables/")
173 .privileges(redfish::privileges::getCableCollection)
174 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -0700175 [&app](const crow::Request& req,
176 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000177 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700178 {
179 return;
180 }
181 asyncResp->res.jsonValue["@odata.type"] =
182 "#CableCollection.CableCollection";
183 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/Cables";
184 asyncResp->res.jsonValue["Name"] = "Cable Collection";
185 asyncResp->res.jsonValue["Description"] = "Collection of Cable Entries";
George Liu7a1dbc42022-12-07 16:03:22 +0800186 constexpr std::array<std::string_view, 1> interfaces{
187 "xyz.openbmc_project.Inventory.Item.Cable"};
Ed Tanous002d39b2022-05-31 08:59:27 -0700188 collection_util::getCollectionMembers(
George Liu7a1dbc42022-12-07 16:03:22 +0800189 asyncResp, boost::urls::url("/redfish/v1/Cables"), interfaces);
Ed Tanous002d39b2022-05-31 08:59:27 -0700190 });
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600191}
192
193} // namespace redfish