xref: /openbmc/bmcweb/features/redfish/include/utils/telemetry_utils.hpp (revision ca1600c10f43648ce90f84a2a712c6ebd043dded)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
34dbb8aeaSWludzik, Jozef #include "dbus_utility.hpp"
4456cd875SSzymon Dompke #include "utility.hpp"
54dbb8aeaSWludzik, Jozef 
6081ebf06SWludzik, Jozef namespace redfish
7081ebf06SWludzik, Jozef {
8081ebf06SWludzik, Jozef 
9081ebf06SWludzik, Jozef namespace telemetry
10081ebf06SWludzik, Jozef {
11081ebf06SWludzik, Jozef constexpr const char* service = "xyz.openbmc_project.Telemetry";
12081ebf06SWludzik, Jozef constexpr const char* reportInterface = "xyz.openbmc_project.Telemetry.Report";
13081ebf06SWludzik, Jozef 
14081ebf06SWludzik, Jozef inline std::string getDbusReportPath(const std::string& id)
15081ebf06SWludzik, Jozef {
16163994a8SSzymon Dompke     sdbusplus::message::object_path reportsPath(
17163994a8SSzymon Dompke         "/xyz/openbmc_project/Telemetry/Reports/TelemetryService");
18163994a8SSzymon Dompke     return {reportsPath / id};
19163994a8SSzymon Dompke }
20163994a8SSzymon Dompke 
21163994a8SSzymon Dompke inline std::string getDbusTriggerPath(const std::string& id)
22163994a8SSzymon Dompke {
23163994a8SSzymon Dompke     sdbusplus::message::object_path triggersPath(
24163994a8SSzymon Dompke         "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService");
25163994a8SSzymon Dompke     return {triggersPath / id};
26081ebf06SWludzik, Jozef }
27081ebf06SWludzik, Jozef 
28*ca1600c1SSzymon Dompke struct IncorrectMetricUri
29*ca1600c1SSzymon Dompke {
30*ca1600c1SSzymon Dompke     std::string uri;
31*ca1600c1SSzymon Dompke     size_t index;
32*ca1600c1SSzymon Dompke };
33*ca1600c1SSzymon Dompke 
34*ca1600c1SSzymon Dompke inline std::optional<IncorrectMetricUri> getChassisSensorNode(
35*ca1600c1SSzymon Dompke     const std::vector<std::string>& uris,
36*ca1600c1SSzymon Dompke     boost::container::flat_set<std::pair<std::string, std::string>>& matched)
37*ca1600c1SSzymon Dompke {
38*ca1600c1SSzymon Dompke     size_t uriIdx = 0;
39*ca1600c1SSzymon Dompke     for (const std::string& uri : uris)
40*ca1600c1SSzymon Dompke     {
41*ca1600c1SSzymon Dompke         boost::urls::result<boost::urls::url_view> parsed =
42*ca1600c1SSzymon Dompke             boost::urls::parse_relative_ref(uri);
43*ca1600c1SSzymon Dompke 
44*ca1600c1SSzymon Dompke         if (!parsed)
45*ca1600c1SSzymon Dompke         {
46*ca1600c1SSzymon Dompke             BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
47*ca1600c1SSzymon Dompke                                 "from "
48*ca1600c1SSzymon Dompke                              << uri;
49*ca1600c1SSzymon Dompke             return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
50*ca1600c1SSzymon Dompke         }
51*ca1600c1SSzymon Dompke 
52*ca1600c1SSzymon Dompke         std::string chassis;
53*ca1600c1SSzymon Dompke         std::string node;
54*ca1600c1SSzymon Dompke 
55*ca1600c1SSzymon Dompke         if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
56*ca1600c1SSzymon Dompke                                            std::ref(chassis), std::ref(node)))
57*ca1600c1SSzymon Dompke         {
58*ca1600c1SSzymon Dompke             matched.emplace(std::move(chassis), std::move(node));
59*ca1600c1SSzymon Dompke             uriIdx++;
60*ca1600c1SSzymon Dompke             continue;
61*ca1600c1SSzymon Dompke         }
62*ca1600c1SSzymon Dompke 
63*ca1600c1SSzymon Dompke         // Those 2 segments cannot be validated here, as we don't know which
64*ca1600c1SSzymon Dompke         // sensors exist at the moment of parsing.
65*ca1600c1SSzymon Dompke         std::string ignoredSenorId;
66*ca1600c1SSzymon Dompke         std::string ignoredSensorUnit;
67*ca1600c1SSzymon Dompke 
68*ca1600c1SSzymon Dompke         if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
69*ca1600c1SSzymon Dompke                                            std::ref(chassis), "Sensors",
70*ca1600c1SSzymon Dompke                                            std::ref(ignoredSenorId),
71*ca1600c1SSzymon Dompke                                            std::ref(ignoredSensorUnit)))
72*ca1600c1SSzymon Dompke         {
73*ca1600c1SSzymon Dompke             matched.emplace(std::move(chassis), "Sensors");
74*ca1600c1SSzymon Dompke             uriIdx++;
75*ca1600c1SSzymon Dompke             continue;
76*ca1600c1SSzymon Dompke         }
77*ca1600c1SSzymon Dompke 
78*ca1600c1SSzymon Dompke         BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
79*ca1600c1SSzymon Dompke                             "from "
80*ca1600c1SSzymon Dompke                          << uri;
81*ca1600c1SSzymon Dompke         return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
82*ca1600c1SSzymon Dompke     }
83*ca1600c1SSzymon Dompke     return std::nullopt;
84*ca1600c1SSzymon Dompke }
85*ca1600c1SSzymon Dompke 
86081ebf06SWludzik, Jozef } // namespace telemetry
87081ebf06SWludzik, Jozef } // namespace redfish
88