blob: b3b6860136f88d241f9e9efe9715471c9e2d52eb [file] [log] [blame]
#include "managed_store_types.hpp"
#include "ports.hpp"
#include <app.hpp>
#include <sdbusplus/asio/property.hpp>
#include <array>
namespace redfish
{
inline void populatePortMetrics(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const std::string& objectPath)
{
std::array<std::string, 2> portMetricsPropertyNames = {
{"RXDiscards", "TXDiscards"}};
managedStore::ManagedObjectStoreContext requestContext(asyncResp);
for (const std::string& propertyName : portMetricsPropertyNames)
{
dbus_utils::getProperty<uint32_t>(
"xyz.openbmc_project.Metric", objectPath,
"xyz.openbmc_project.Metric.Port", propertyName, requestContext,
[asyncResp, propertyName](const boost::system::error_code ec,
const uint32_t property) {
if (ec)
{
BMCWEB_LOG_ERROR << "DBus error getting port metrics";
return;
}
asyncResp->res.jsonValue["Networking"][propertyName] = property;
});
}
}
inline void handleDedicatedNetworkPortMetricsGet(
crow::App& app, const crow::Request& req,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const std::string& portId)
{
if (!redfish::setUpRedfishRoute(app, req, asyncResp))
{
return;
}
asyncResp->res.jsonValue["@odata.type"] = "#PortMetrics.v1_3_0.PortMetrics";
asyncResp->res.jsonValue["@odata.id"] =
"/redfish/v1/Managers/bmc/DedicatedNetworkPorts/" + portId + "/Metrics";
asyncResp->res.jsonValue["Id"] = "Metrics";
asyncResp->res.jsonValue["Name"] = portId + " Metrics";
populatePortMetrics(asyncResp, portObjPathDir + portId);
}
inline void requestPortMetricsRoutes(App& app)
{
BMCWEB_ROUTE(app,
"/redfish/v1/Managers/bmc/DedicatedNetworkPorts/<str>/Metrics")
.privileges(redfish::privileges::getPortMetrics)
.methods(boost::beast::http::verb::get)(std::bind_front(
handleDedicatedNetworkPortMetricsGet, std::ref(app)));
}
} // namespace redfish