blob: 87e41d53246c7bad32af03d143dace188e25c945 [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>
Ed Tanousef4c65b2023-04-24 15:28:50 -070011#include <boost/url/format.hpp>
Krzysztof Grobelny89474492022-09-06 16:30:38 +020012#include <sdbusplus/asio/property.hpp>
13#include <sdbusplus/unpack_properties.hpp>
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060014
George Liu7a1dbc42022-12-07 16:03:22 +080015#include <array>
16#include <string_view>
17
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060018namespace redfish
19{
20/**
21 * @brief Fill cable specific properties.
22 * @param[in,out] resp HTTP response.
23 * @param[in] ec Error code corresponding to Async method call.
24 * @param[in] properties List of Cable Properties key/value pairs.
25 */
26inline void
27 fillCableProperties(crow::Response& resp,
Ed Tanous5e7e2dc2023-02-16 10:37:01 -080028 const boost::system::error_code& ec,
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060029 const dbus::utility::DBusPropertiesMap& properties)
30{
31 if (ec)
32 {
33 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
34 messages::internalError(resp);
35 return;
36 }
37
Krzysztof Grobelny89474492022-09-06 16:30:38 +020038 const std::string* cableTypeDescription = nullptr;
39 const double* length = nullptr;
40
41 const bool success = sdbusplus::unpackPropertiesNoThrow(
42 dbus_utils::UnpackErrorPrinter(), properties, "CableTypeDescription",
43 cableTypeDescription, "Length", length);
44
45 if (!success)
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060046 {
Krzysztof Grobelny89474492022-09-06 16:30:38 +020047 messages::internalError(resp);
48 return;
49 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060050
Krzysztof Grobelny89474492022-09-06 16:30:38 +020051 if (cableTypeDescription != nullptr)
52 {
53 resp.jsonValue["CableType"] = *cableTypeDescription;
54 }
55
56 if (length != nullptr)
57 {
58 if (!std::isfinite(*length))
59 {
Shantappa Teekappanavar043360d2022-11-03 13:37:24 -050060 // Cable length is NaN by default, do not throw an error
61 if (!std::isnan(*length))
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060062 {
Shantappa Teekappanavar043360d2022-11-03 13:37:24 -050063 messages::internalError(resp);
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060064 return;
65 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060066 }
Shantappa Teekappanavar043360d2022-11-03 13:37:24 -050067 else
68 {
69 resp.jsonValue["LengthMeters"] = *length;
70 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060071 }
72}
73
74/**
75 * @brief Api to get Cable properties.
76 * @param[in,out] asyncResp Async HTTP response.
77 * @param[in] cableObjectPath Object path of the Cable.
78 * @param[in] serviceMap A map to hold Service and corresponding
79 * interface list for the given cable id.
80 */
81inline void
82 getCableProperties(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
83 const std::string& cableObjectPath,
84 const dbus::utility::MapperServiceMap& serviceMap)
85{
86 BMCWEB_LOG_DEBUG << "Get Properties for cable " << cableObjectPath;
87
88 for (const auto& [service, interfaces] : serviceMap)
89 {
90 for (const auto& interface : interfaces)
91 {
92 if (interface != "xyz.openbmc_project.Inventory.Item.Cable")
93 {
94 continue;
95 }
96
Krzysztof Grobelny89474492022-09-06 16:30:38 +020097 sdbusplus::asio::getAllProperties(
98 *crow::connections::systemBus, service, cableObjectPath,
99 interface,
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600100 [asyncResp](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800101 const boost::system::error_code& ec,
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600102 const dbus::utility::DBusPropertiesMap& properties) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700103 fillCableProperties(asyncResp->res, ec, properties);
Krzysztof Grobelny89474492022-09-06 16:30:38 +0200104 });
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600105 }
106 }
107}
108
109/**
110 * The Cable schema
111 */
112inline void requestRoutesCable(App& app)
113{
114 BMCWEB_ROUTE(app, "/redfish/v1/Cables/<str>/")
115 .privileges(redfish::privileges::getCable)
116 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -0700117 [&app](const crow::Request& req,
118 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
119 const std::string& cableId) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000120 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700121 {
122 return;
123 }
124 BMCWEB_LOG_DEBUG << "Cable Id: " << cableId;
George Liue99073f2022-12-09 11:06:16 +0800125 constexpr std::array<std::string_view, 1> interfaces = {
126 "xyz.openbmc_project.Inventory.Item.Cable"};
127 dbus::utility::getSubTree(
128 "/xyz/openbmc_project/inventory", 0, interfaces,
Ed Tanous002d39b2022-05-31 08:59:27 -0700129 [asyncResp,
George Liue99073f2022-12-09 11:06:16 +0800130 cableId](const boost::system::error_code& ec,
Ed Tanous002d39b2022-05-31 08:59:27 -0700131 const dbus::utility::MapperGetSubTreeResponse& subtree) {
132 if (ec.value() == EBADR)
133 {
Jiaqing Zhaod8a5d5d2022-08-05 16:21:51 +0800134 messages::resourceNotFound(asyncResp->res, "Cable", cableId);
Ed Tanous002d39b2022-05-31 08:59:27 -0700135 return;
136 }
137
138 if (ec)
139 {
140 BMCWEB_LOG_ERROR << "DBUS response error " << ec;
141 messages::internalError(asyncResp->res);
142 return;
143 }
144
145 for (const auto& [objectPath, serviceMap] : subtree)
146 {
147 sdbusplus::message::object_path path(objectPath);
148 if (path.filename() != cableId)
Ed Tanous45ca1b82022-03-25 13:07:27 -0700149 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700150 continue;
Ed Tanous45ca1b82022-03-25 13:07:27 -0700151 }
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -0600152
Ed Tanous002d39b2022-05-31 08:59:27 -0700153 asyncResp->res.jsonValue["@odata.type"] = "#Cable.v1_0_0.Cable";
154 asyncResp->res.jsonValue["@odata.id"] =
Ed Tanousef4c65b2023-04-24 15:28:50 -0700155 boost::urls::format("/redfish/v1/Cables/{}", 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