xref: /openbmc/bmcweb/features/redfish/include/utils/telemetry_utils.hpp (revision 3ccb3adb9a14783f6bef601506de9f8bcae22d51)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
34dbb8aeaSWludzik, Jozef #include "dbus_utility.hpp"
4*3ccb3adbSEd Tanous #include "http/utility.hpp"
5*3ccb3adbSEd Tanous #include "logging.hpp"
6456cd875SSzymon Dompke #include "utility.hpp"
74dbb8aeaSWludzik, Jozef 
8*3ccb3adbSEd Tanous #include <boost/container/flat_map.hpp>
9*3ccb3adbSEd Tanous #include <boost/container/flat_set.hpp>
10*3ccb3adbSEd Tanous #include <sdbusplus/message/native_types.hpp>
11*3ccb3adbSEd Tanous 
12*3ccb3adbSEd Tanous #include <string>
13*3ccb3adbSEd Tanous 
14081ebf06SWludzik, Jozef namespace redfish
15081ebf06SWludzik, Jozef {
16081ebf06SWludzik, Jozef 
17081ebf06SWludzik, Jozef namespace telemetry
18081ebf06SWludzik, Jozef {
19081ebf06SWludzik, Jozef constexpr const char* service = "xyz.openbmc_project.Telemetry";
20081ebf06SWludzik, Jozef constexpr const char* reportInterface = "xyz.openbmc_project.Telemetry.Report";
21081ebf06SWludzik, Jozef 
22081ebf06SWludzik, Jozef inline std::string getDbusReportPath(const std::string& id)
23081ebf06SWludzik, Jozef {
24163994a8SSzymon Dompke     sdbusplus::message::object_path reportsPath(
25163994a8SSzymon Dompke         "/xyz/openbmc_project/Telemetry/Reports/TelemetryService");
26163994a8SSzymon Dompke     return {reportsPath / id};
27163994a8SSzymon Dompke }
28163994a8SSzymon Dompke 
29163994a8SSzymon Dompke inline std::string getDbusTriggerPath(const std::string& id)
30163994a8SSzymon Dompke {
31163994a8SSzymon Dompke     sdbusplus::message::object_path triggersPath(
32163994a8SSzymon Dompke         "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService");
33163994a8SSzymon Dompke     return {triggersPath / id};
34081ebf06SWludzik, Jozef }
35081ebf06SWludzik, Jozef 
36ca1600c1SSzymon Dompke struct IncorrectMetricUri
37ca1600c1SSzymon Dompke {
38ca1600c1SSzymon Dompke     std::string uri;
39ca1600c1SSzymon Dompke     size_t index;
40ca1600c1SSzymon Dompke };
41ca1600c1SSzymon Dompke 
42ca1600c1SSzymon Dompke inline std::optional<IncorrectMetricUri> getChassisSensorNode(
43ca1600c1SSzymon Dompke     const std::vector<std::string>& uris,
44ca1600c1SSzymon Dompke     boost::container::flat_set<std::pair<std::string, std::string>>& matched)
45ca1600c1SSzymon Dompke {
46ca1600c1SSzymon Dompke     size_t uriIdx = 0;
47ca1600c1SSzymon Dompke     for (const std::string& uri : uris)
48ca1600c1SSzymon Dompke     {
49ca1600c1SSzymon Dompke         boost::urls::result<boost::urls::url_view> parsed =
50ca1600c1SSzymon Dompke             boost::urls::parse_relative_ref(uri);
51ca1600c1SSzymon Dompke 
52ca1600c1SSzymon Dompke         if (!parsed)
53ca1600c1SSzymon Dompke         {
54ca1600c1SSzymon Dompke             BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
55ca1600c1SSzymon Dompke                                 "from "
56ca1600c1SSzymon Dompke                              << uri;
57ca1600c1SSzymon Dompke             return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
58ca1600c1SSzymon Dompke         }
59ca1600c1SSzymon Dompke 
60ca1600c1SSzymon Dompke         std::string chassis;
61ca1600c1SSzymon Dompke         std::string node;
62ca1600c1SSzymon Dompke 
63ca1600c1SSzymon Dompke         if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
64ca1600c1SSzymon Dompke                                            std::ref(chassis), std::ref(node)))
65ca1600c1SSzymon Dompke         {
66ca1600c1SSzymon Dompke             matched.emplace(std::move(chassis), std::move(node));
67ca1600c1SSzymon Dompke             uriIdx++;
68ca1600c1SSzymon Dompke             continue;
69ca1600c1SSzymon Dompke         }
70ca1600c1SSzymon Dompke 
71ca1600c1SSzymon Dompke         // Those 2 segments cannot be validated here, as we don't know which
72ca1600c1SSzymon Dompke         // sensors exist at the moment of parsing.
73ca1600c1SSzymon Dompke         std::string ignoredSenorId;
74ca1600c1SSzymon Dompke 
75ca1600c1SSzymon Dompke         if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis",
76ca1600c1SSzymon Dompke                                            std::ref(chassis), "Sensors",
77c1d019a6SEd Tanous                                            std::ref(ignoredSenorId)))
78ca1600c1SSzymon Dompke         {
79ca1600c1SSzymon Dompke             matched.emplace(std::move(chassis), "Sensors");
80ca1600c1SSzymon Dompke             uriIdx++;
81ca1600c1SSzymon Dompke             continue;
82ca1600c1SSzymon Dompke         }
83ca1600c1SSzymon Dompke 
84ca1600c1SSzymon Dompke         BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node "
85ca1600c1SSzymon Dompke                             "from "
86ca1600c1SSzymon Dompke                          << uri;
87ca1600c1SSzymon Dompke         return std::make_optional<IncorrectMetricUri>({uri, uriIdx});
88ca1600c1SSzymon Dompke     }
89ca1600c1SSzymon Dompke     return std::nullopt;
90ca1600c1SSzymon Dompke }
91ca1600c1SSzymon Dompke 
92081ebf06SWludzik, Jozef } // namespace telemetry
93081ebf06SWludzik, Jozef } // namespace redfish
94