xref: /openbmc/telemetry/src/types/trigger_types.hpp (revision 66db900fa95b28f8e5f4a313196026cc4d04cfed)
1 #pragma once
2 
3 #include "types/sensor_types.hpp"
4 #include "utils/conversion.hpp"
5 #include "utils/labeled_tuple.hpp"
6 #include "utils/tstring.hpp"
7 #include "utils/variant_utils.hpp"
8 
9 #include <string>
10 #include <tuple>
11 #include <utility>
12 #include <variant>
13 #include <vector>
14 
15 enum class TriggerAction
16 {
17     LogToRedfishEventLog,
18     UpdateReport,
19 };
20 
21 namespace details
22 {
23 constexpr std::array<std::pair<std::string_view, TriggerAction>, 3>
24     convDataTriggerAction = {
25         std::make_pair("xyz.openbmc_project.Telemetry.Trigger.TriggerAction."
26                        "LogToRedfishEventLog",
27                        TriggerAction::LogToRedfishEventLog),
28         std::make_pair(
29             "xyz.openbmc_project.Telemetry.Trigger.TriggerAction.UpdateReport",
30             TriggerAction::UpdateReport)};
31 }
32 
toTriggerAction(const std::string & str)33 inline TriggerAction toTriggerAction(const std::string& str)
34 {
35     return utils::toEnum(details::convDataTriggerAction, str);
36 }
37 
actionToString(TriggerAction v)38 inline std::string actionToString(TriggerAction v)
39 {
40     return std::string(utils::enumToString(details::convDataTriggerAction, v));
41 }
42 
43 namespace discrete
44 {
45 
46 enum class Severity
47 {
48     ok = 0,
49     warning,
50     critical
51 };
52 
53 using ThresholdParam =
54     std::tuple<std::string, std::string, uint64_t, std::string>;
55 
56 using LabeledThresholdParam = utils::LabeledTuple<
57     std::tuple<std::string, Severity, uint64_t, std::string>,
58     utils::tstring::UserId, utils::tstring::Severity, utils::tstring::DwellTime,
59     utils::tstring::ThresholdValue>;
60 } // namespace discrete
61 
62 namespace numeric
63 {
64 
65 enum class Type
66 {
67     lowerCritical = 0,
68     lowerWarning,
69     upperWarning,
70     upperCritical
71 };
72 
73 enum class Direction
74 {
75     either = 0,
76     decreasing,
77     increasing
78 };
79 
80 namespace details
81 {
82 
83 constexpr std::array<std::pair<std::string_view, Type>, 4> convDataType = {
84     std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.LowerCritical",
85                    Type::lowerCritical),
86     std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.LowerWarning",
87                    Type::lowerWarning),
88     std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.UpperWarning",
89                    Type::upperWarning),
90     std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.UpperCritical",
91                    Type::upperCritical)};
92 
93 constexpr std::array<std::pair<std::string_view, Direction>, 3>
94     convDataDirection = {
95         std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Direction.Either",
96                        Direction::either),
97         std::make_pair(
98             "xyz.openbmc_project.Telemetry.Trigger.Direction.Decreasing",
99             Direction::decreasing),
100         std::make_pair(
101             "xyz.openbmc_project.Telemetry.Trigger.Direction.Increasing",
102             Direction::increasing)};
103 
104 } // namespace details
105 
toType(const std::string & str)106 inline Type toType(const std::string& str)
107 {
108     return utils::toEnum(details::convDataType, str);
109 }
110 
typeToString(Type v)111 inline std::string typeToString(Type v)
112 {
113     return std::string(utils::enumToString(details::convDataType, v));
114 }
115 
toDirection(const std::string & str)116 inline Direction toDirection(const std::string& str)
117 {
118     return utils::toEnum(details::convDataDirection, str);
119 }
120 
directionToString(Direction v)121 inline std::string directionToString(Direction v)
122 {
123     return std::string(utils::enumToString(details::convDataDirection, v));
124 }
125 
126 using ThresholdParam = std::tuple<std::string, uint64_t, std::string, double>;
127 
128 using LabeledThresholdParam = utils::LabeledTuple<
129     std::tuple<Type, uint64_t, Direction, double>, utils::tstring::Type,
130     utils::tstring::DwellTime, utils::tstring::Direction,
131     utils::tstring::ThresholdValue>;
132 } // namespace numeric
133 
134 using TriggerThresholdParams =
135     std::variant<std::vector<numeric::ThresholdParam>,
136                  std::vector<discrete::ThresholdParam>>;
137 
138 using LabeledTriggerThresholdParams =
139     std::variant<std::vector<numeric::LabeledThresholdParam>,
140                  std::vector<discrete::LabeledThresholdParam>>;
141 
142 using LabeledThresholdParam =
143     std::variant<std::monostate, numeric::LabeledThresholdParam,
144                  discrete::LabeledThresholdParam>;
145 
isTriggerThresholdDiscrete(const LabeledTriggerThresholdParams & params)146 inline bool isTriggerThresholdDiscrete(
147     const LabeledTriggerThresholdParams& params)
148 {
149     return std::holds_alternative<std::vector<discrete::LabeledThresholdParam>>(
150         params);
151 }
152 
153 using TriggerId = std::unique_ptr<const std::string>;
154 using TriggerValue = std::variant<double, std::string>;
155 using ThresholdName = std::optional<std::reference_wrapper<const std::string>>;
156 
triggerValueToString(TriggerValue val)157 inline std::string triggerValueToString(TriggerValue val)
158 {
159     if (auto* doubleVal = std::get_if<double>(&val); doubleVal != nullptr)
160     {
161         return std::to_string(*doubleVal);
162     }
163     else
164     {
165         return std::get<std::string>(val);
166     }
167 }
168 
169 namespace utils
170 {
171 
172 constexpr std::array<std::pair<std::string_view, discrete::Severity>, 3>
173     convDataSeverity = {
174         std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Severity.OK",
175                        discrete::Severity::ok),
176         std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Severity.Warning",
177                        discrete::Severity::warning),
178         std::make_pair(
179             "xyz.openbmc_project.Telemetry.Trigger.Severity.Critical",
180             discrete::Severity::critical)};
181 
toSeverity(const std::string & str)182 inline discrete::Severity toSeverity(const std::string& str)
183 {
184     return utils::toEnum(convDataSeverity, str);
185 }
186 
enumToString(discrete::Severity v)187 inline std::string enumToString(discrete::Severity v)
188 {
189     return std::string(enumToString(convDataSeverity, v));
190 }
191 
192 template <>
193 struct EnumTraits<TriggerAction>
194 {
195     static constexpr auto propertyName = ConstexprString{"TriggerAction"};
196 };
197 
198 template <>
199 struct EnumTraits<discrete::Severity>
200 {
201     static constexpr auto propertyName = ConstexprString{"discrete::Severity"};
202 };
203 
204 template <>
205 struct EnumTraits<numeric::Type>
206 {
207     static constexpr auto propertyName = ConstexprString{"numeric::Type"};
208 };
209 
210 template <>
211 struct EnumTraits<numeric::Direction>
212 {
213     static constexpr auto propertyName = ConstexprString{"numeric::Direction"};
214 };
215 
216 } // namespace utils
217