blob: e4689aad8804295c3624285b4d44517d29325004 [file] [log] [blame]
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02001#include "report_factory.hpp"
2
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01003#include "metric.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02004#include "report.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01005#include "sensor.hpp"
6#include "utils/transform.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02007
8ReportFactory::ReportFactory(
Wludzik, Jozefe2362792020-10-27 17:23:55 +01009 std::shared_ptr<sdbusplus::asio::connection> bus,
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020010 const std::shared_ptr<sdbusplus::asio::object_server>& objServer) :
Wludzik, Jozefe2362792020-10-27 17:23:55 +010011 bus(std::move(bus)),
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020012 objServer(objServer)
13{}
14
15std::unique_ptr<interfaces::Report> ReportFactory::make(
Wludzik, Jozefe2362792020-10-27 17:23:55 +010016 std::optional<std::reference_wrapper<boost::asio::yield_context>> yield,
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020017 const std::string& name, const std::string& reportingType,
18 bool emitsReadingsSignal, bool logToMetricReportsCollection,
19 std::chrono::milliseconds period, const ReadingParameters& metricParams,
Wludzik, Jozefe2362792020-10-27 17:23:55 +010020 interfaces::ReportManager& reportManager,
21 interfaces::JsonStorage& reportStorage) const
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020022{
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +010023 std::optional<std::vector<ReportFactory::SensorTree>> sensorTree;
24
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020025 std::vector<std::shared_ptr<interfaces::Metric>> metrics;
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +010026 metrics.reserve(metricParams.size());
27
28 for (const auto& [sensorPaths, op, id, metadata] : metricParams)
29 {
30 if (!sensorTree && yield && sensorPaths.size() > 0)
31 {
32 sensorTree = getSensorTree(*yield);
33 }
34
35 std::vector<std::shared_ptr<interfaces::Sensor>> sensors =
36 getSensors(sensorTree, sensorPaths);
37
38 metrics.emplace_back(
39 std::make_shared<Metric>(std::move(sensors), op, id, metadata));
40 }
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020041
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020042 return std::make_unique<Report>(
Wludzik, Jozefe2362792020-10-27 17:23:55 +010043 bus->get_io_context(), objServer, name, reportingType,
44 emitsReadingsSignal, logToMetricReportsCollection, period, metricParams,
45 reportManager, reportStorage, std::move(metrics));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020046}
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +010047
48std::vector<std::shared_ptr<interfaces::Sensor>> ReportFactory::getSensors(
49 const std::optional<std::vector<ReportFactory::SensorTree>>& tree,
50 const std::vector<sdbusplus::message::object_path>& sensorPaths) const
51{
52 if (tree)
53 {
54 std::vector<std::shared_ptr<interfaces::Sensor>> sensors;
55
56 for (const auto& [sensor, ifacesMap] : *tree)
57 {
58 auto it = std::find(sensorPaths.begin(), sensorPaths.end(), sensor);
59 if (it != sensorPaths.end())
60 {
61 for (const auto& [service, ifaces] : ifacesMap)
62 {
63 sensors.emplace_back(sensorCache.makeSensor<Sensor>(
64 service, sensor, bus->get_io_context(), bus));
65 }
66 }
67 }
68
69 return sensors;
70 }
71 else
72 {
73 return utils::transform(
74 sensorPaths,
75 [this](const std::string& sensor)
76 -> std::shared_ptr<interfaces::Sensor> {
77 std::string::size_type pos = sensor.find_first_of(":");
78 auto service = sensor.substr(0, pos);
79 auto path = sensor.substr(pos + 1);
80 return sensorCache.makeSensor<Sensor>(
81 service, path, bus->get_io_context(), bus);
82 });
83 }
84}
85
86std::vector<ReportFactory::SensorTree>
87 ReportFactory::getSensorTree(boost::asio::yield_context& yield) const
88{
89 std::array<const char*, 1> interfaces = {
90 "xyz.openbmc_project.Sensor.Value"};
91 boost::system::error_code ec;
92
93 auto result = bus->yield_method_call<std::vector<SensorTree>>(
94 yield, ec, "xyz.openbmc_project.ObjectMapper",
95 "/xyz/openbmc_project/object_mapper",
96 "xyz.openbmc_project.ObjectMapper", "GetSubTree",
97 "/xyz/openbmc_project/sensors", 2, interfaces);
98 if (ec)
99 {
100 throw std::runtime_error("failed");
101 }
102 return result;
103}