blob: 84f8ec241609e7956a9aa23f5c4d4622e555aede [file] [log] [blame]
Matthew Barth81748b12018-05-02 16:03:48 -05001#include "conditions.hpp"
Matthew Barth177fe982020-05-26 11:05:19 -05002
Matthew Barth81748b12018-05-02 16:03:48 -05003#include "sdbusplus.hpp"
Matthew Barth3ad14342020-06-08 16:17:42 -05004#include "types.hpp"
5
6#include <nlohmann/json.hpp>
Anwaar Hadia00f6832025-03-27 15:03:11 +00007#include <phosphor-logging/lg2.hpp>
Matthew Barth81748b12018-05-02 16:03:48 -05008
Matthew Barth177fe982020-05-26 11:05:19 -05009#include <algorithm>
10
Matthew Barth81748b12018-05-02 16:03:48 -050011namespace phosphor
12{
13namespace fan
14{
15namespace monitor
16{
17namespace condition
18{
19
Matthew Barth3ad14342020-06-08 16:17:42 -050020using json = nlohmann::json;
Matthew Barth3ad14342020-06-08 16:17:42 -050021
Matthew Barth81748b12018-05-02 16:03:48 -050022Condition propertiesMatch(std::vector<PropertyState>&& propStates)
23{
Patrick Williamscb356d42022-07-22 19:26:53 -050024 return [pStates = std::move(propStates)](sdbusplus::bus_t& bus) {
Patrick Williamsdfddd642024-08-16 15:21:51 -040025 return std::all_of(
26 pStates.begin(), pStates.end(), [&bus](const auto& p) {
27 return util::SDBusPlus::getPropertyVariant<PropertyValue>(
28 bus, std::get<propObj>(p.first),
29 std::get<propIface>(p.first),
30 std::get<propName>(p.first)) == p.second;
31 });
Matthew Barth81748b12018-05-02 16:03:48 -050032 };
33}
34
Matthew Barth3ad14342020-06-08 16:17:42 -050035Condition getPropertiesMatch(const json& condParams)
36{
37 if (!condParams.contains("properties"))
38 {
39 // Log error on missing required parameter
Anwaar Hadia00f6832025-03-27 15:03:11 +000040 lg2::error("Missing fan monitor condition properties {NAME}", "NAME",
41 condParams["name"].get<std::string>());
Matthew Barth3ad14342020-06-08 16:17:42 -050042 throw std::runtime_error("Missing fan monitor condition properties");
43 }
44 std::vector<PropertyState> propStates;
45 for (auto& param : condParams["properties"])
46 {
47 if (!param.contains("object") || !param.contains("interface") ||
48 !param.contains("property"))
49 {
50 // Log error on missing required parameters
Anwaar Hadia00f6832025-03-27 15:03:11 +000051 lg2::error(
52 "Missing properties. Match condition parameters 'object, interface, property'");
Matthew Barth3ad14342020-06-08 16:17:42 -050053 throw std::runtime_error(
54 "Missing propertiesMatch condition parameters");
55 }
56
57 auto propAttrs = param["property"];
58 if (!propAttrs.contains("name") || !propAttrs.contains("value"))
59 {
60 // Log error on missing required parameters
Anwaar Hadia00f6832025-03-27 15:03:11 +000061 lg2::error(
62 "Missing properties. Match condition property attributes 'name, value'");
Matthew Barth3ad14342020-06-08 16:17:42 -050063 throw std::runtime_error(
64 "Missing propertiesMatch condition property attributes");
65 }
66
67 std::string type = "";
68 if (propAttrs.contains("type"))
69 {
70 type = propAttrs["type"].get<std::string>();
71 }
72
73 // Add property for propertiesMatch condition
74 propStates.emplace_back(PropertyState(
75 {param["object"].get<std::string>(),
76 param["interface"].get<std::string>(),
77 propAttrs["name"].get<std::string>()},
78 JsonTypeHandler::getPropValue(propAttrs["value"], type)));
79 }
80
81 return make_condition(condition::propertiesMatch(std::move(propStates)));
82}
83
Matthew Barth81748b12018-05-02 16:03:48 -050084} // namespace condition
85} // namespace monitor
86} // namespace fan
87} // namespace phosphor