xref: /openbmc/bmcweb/features/redfish/include/utils/telemetry_utils.hpp (revision c1d019a6056a2a0ef50e577b3139ab5a8dc49355)
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 
28ca1600c1SSzymon Dompke struct IncorrectMetricUri
29ca1600c1SSzymon Dompke {
30ca1600c1SSzymon Dompke     std::string uri;
31ca1600c1SSzymon Dompke     size_t index;
32ca1600c1SSzymon Dompke };
33ca1600c1SSzymon Dompke 
34ca1600c1SSzymon Dompke inline std::optional<IncorrectMetricUri> getChassisSensorNode(
35ca1600c1SSzymon Dompke     const std::vector<std::string>& uris,
36ca1600c1SSzymon Dompke     boost::container::flat_set<std::pair<std::string, std::string>>& matched)
37ca1600c1SSzymon Dompke {
38ca1600c1SSzymon Dompke     size_t uriIdx = 0;
39ca1600c1SSzymon Dompke     for (const std::string& uri : uris)
40ca1600c1SSzymon Dompke     {
41ca1600c1SSzymon Dompke         boost::urls::result<boost::urls::url_view> parsed =
42ca1600c1SSzymon Dompke             boost::urls::parse_relative_ref(uri);
43ca1600c1SSzymon Dompke 
44ca1600c1SSzymon Dompke         if (!parsed)
45ca1600c1SSzymon Dompke         {
46ca1600c1SSzymon Dompke             BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
47ca1600c1SSzymon Dompke                                 "from "
48ca1600c1SSzymon Dompke                              << uri;
49ca1600c1SSzymon Dompke             return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
50ca1600c1SSzymon Dompke         }
51ca1600c1SSzymon Dompke 
52ca1600c1SSzymon Dompke         std::string chassis;
53ca1600c1SSzymon Dompke         std::string node;
54ca1600c1SSzymon Dompke 
55ca1600c1SSzymon Dompke         if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
56ca1600c1SSzymon Dompke                                            std::ref(chassis), std::ref(node)))
57ca1600c1SSzymon Dompke         {
58ca1600c1SSzymon Dompke             matched.emplace(std::move(chassis), std::move(node));
59ca1600c1SSzymon Dompke             uriIdx++;
60ca1600c1SSzymon Dompke             continue;
61ca1600c1SSzymon Dompke         }
62ca1600c1SSzymon Dompke 
63ca1600c1SSzymon Dompke         // Those 2 segments cannot be validated here, as we don't know which
64ca1600c1SSzymon Dompke         // sensors exist at the moment of parsing.
65ca1600c1SSzymon Dompke         std::string ignoredSenorId;
66ca1600c1SSzymon Dompke 
67ca1600c1SSzymon Dompke         if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
68ca1600c1SSzymon Dompke                                            std::ref(chassis), "Sensors",
69*c1d019a6SEd Tanous                                            std::ref(ignoredSenorId)))
70ca1600c1SSzymon Dompke         {
71ca1600c1SSzymon Dompke             matched.emplace(std::move(chassis), "Sensors");
72ca1600c1SSzymon Dompke             uriIdx++;
73ca1600c1SSzymon Dompke             continue;
74ca1600c1SSzymon Dompke         }
75ca1600c1SSzymon Dompke 
76ca1600c1SSzymon Dompke         BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
77ca1600c1SSzymon Dompke                             "from "
78ca1600c1SSzymon Dompke                          << uri;
79ca1600c1SSzymon Dompke         return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
80ca1600c1SSzymon Dompke     }
81ca1600c1SSzymon Dompke     return std::nullopt;
82ca1600c1SSzymon Dompke }
83ca1600c1SSzymon Dompke 
84081ebf06SWludzik, Jozef } // namespace telemetry
85081ebf06SWludzik, Jozef } // namespace redfish
86