xref: /openbmc/telemetry/src/report_manager.cpp (revision 2f9f9b875ad61666b1308a94fa700ae6e9d5ed1e)
1 #include "report_manager.hpp"
2 
3 #include <sdbusplus/exception.hpp>
4 
5 #include <system_error>
6 
7 ReportManager::ReportManager(
8     std::unique_ptr<interfaces::ReportFactory> reportFactoryIn,
9     const std::shared_ptr<sdbusplus::asio::object_server>& objServerIn) :
10     reportFactory(std::move(reportFactoryIn)),
11     objServer(objServerIn)
12 {
13     reports.reserve(maxReports);
14 
15     reportManagerIface = objServer->add_unique_interface(
16         reportManagerPath, reportManagerIfaceName, [this](auto& dbusIface) {
17             dbusIface.register_property_r(
18                 "MaxReports", uint32_t{}, sdbusplus::vtable::property_::const_,
19                 [](const auto&) { return maxReports; });
20             dbusIface.register_property_r(
21                 "MinInterval", uint64_t{}, sdbusplus::vtable::property_::const_,
22                 [](const auto&) -> uint64_t { return minInterval.count(); });
23 
24             dbusIface.register_method(
25                 "AddReport", [this](const std::string& reportName,
26                                     const std::string& reportingType,
27                                     const bool emitsReadingsUpdate,
28                                     const bool logToMetricReportsCollection,
29                                     const uint64_t interval,
30                                     const ReadingParameters& metricParams) {
31                     if (reports.size() >= maxReports)
32                     {
33                         throw sdbusplus::exception::SdBusError(
34                             static_cast<int>(std::errc::too_many_files_open),
35                             "Reached maximal report count");
36                     }
37 
38                     for (const auto& report : reports)
39                     {
40                         if (report->getName() == reportName)
41                         {
42                             throw sdbusplus::exception::SdBusError(
43                                 static_cast<int>(std::errc::file_exists),
44                                 "Duplicate report");
45                         }
46                     }
47 
48                     std::chrono::milliseconds reportInterval{interval};
49                     if (reportInterval < minInterval)
50                     {
51                         throw sdbusplus::exception::SdBusError(
52                             static_cast<int>(std::errc::invalid_argument),
53                             "Invalid interval");
54                     }
55 
56                     reports.emplace_back(reportFactory->make(
57                         reportName, reportingType, emitsReadingsUpdate,
58                         logToMetricReportsCollection, std::move(reportInterval),
59                         metricParams, *this));
60                     return reports.back()->getPath();
61                 });
62         });
63 }
64 
65 void ReportManager::removeReport(const interfaces::Report* report)
66 {
67     reports.erase(
68         std::remove_if(reports.begin(), reports.end(),
69                        [report](const auto& x) { return report == x.get(); }),
70         reports.end());
71 }
72