blob: 3380e49787d040fc656c3fd8b00d06ef3ae72ee7 [file] [log] [blame]
Matt Spinler403d1f52021-02-01 15:35:25 -06001/**
2 * Copyright © 2021 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
Matt Spinler66e75a72021-05-14 10:32:47 -050018#include "power_state.hpp"
19
Matt Spinler403d1f52021-02-01 15:35:25 -060020#include <sdbusplus/bus.hpp>
21#include <sdbusplus/bus/match.hpp>
22#include <sdeventplus/event.hpp>
23
24namespace sensor::monitor
25{
26
Matt Spinler50bf8162021-02-01 16:24:01 -060027using InterfaceName = std::string;
28using PropertyName = std::string;
29using ErrorName = std::string;
30using ObjectPath = std::string;
31using InterfaceKey = std::tuple<ObjectPath, InterfaceName>;
32
Matt Spinler403d1f52021-02-01 15:35:25 -060033/**
34 * @class ThresholdAlarmLogger
35 *
36 * This class watches the threshold interfaces
37 * openbmc_project.Sensor.Threshold.Warning
38 * openbmc_project.Sensor.Threshold.Critical
39 * openbmc_project.Sensor.Threshold.PerformanceLoss
40 *
41 * and creates event logs when their high and low alarm
42 * properties set and clear. The error names of the
43 * event logs are based on the sensor type and look like:
44 *
45 * xyz.openbmc_project.Sensor.Threshold.Error.TemperatureWarningHigh
46 * xyz.openbmc_project.Sensor.Threshold.Error.TemperatureWarningHighClear
Matt Spinler66e75a72021-05-14 10:32:47 -050047 *
48 * Event logs are only created when the power is on.
Matt Spinler403d1f52021-02-01 15:35:25 -060049 */
50class ThresholdAlarmLogger
51{
52 public:
53 ThresholdAlarmLogger() = delete;
54 ~ThresholdAlarmLogger() = default;
55 ThresholdAlarmLogger(const ThresholdAlarmLogger&) = default;
56 ThresholdAlarmLogger& operator=(const ThresholdAlarmLogger&) = default;
57 ThresholdAlarmLogger(ThresholdAlarmLogger&&) = default;
58 ThresholdAlarmLogger& operator=(ThresholdAlarmLogger&&) = default;
59
60 /**
61 * @brief Constructor
62 *
63 * Looks for existing active threshold alarms.
64 *
65 * @param[in] bus - The sdbusplus bus object
66 * @param[in] event - The sdeventplus event object
Matt Spinler7f6946b2021-05-14 12:43:50 -050067 * @param[in] powerState - The PowerState object
Matt Spinler403d1f52021-02-01 15:35:25 -060068 */
Matt Spinler7f6946b2021-05-14 12:43:50 -050069 ThresholdAlarmLogger(sdbusplus::bus::bus& bus, sdeventplus::Event& event,
70 std::shared_ptr<phosphor::fan::PowerState> powerState);
Matt Spinler403d1f52021-02-01 15:35:25 -060071
72 private:
73 /**
74 * @brief The propertiesChanged handler for all of the thresholds
75 * interfaces.
76 *
77 * Creates event logs for high/low alarm sets and clears.
78 *
79 * @param[in] msg - The signal message payload.
80 */
81 void propertiesChanged(sdbusplus::message::message& msg);
82
83 /**
Matt Spinler50bf8162021-02-01 16:24:01 -060084 * @brief Checks for active alarms on the path and threshold interface
85 * passed in and creates event logs if necessary.
86 *
87 * @param[in] interface - The threshold interface
88 * @param[in] sensorPath - The sensor D-Bus path
89 * @param[in] service - The D-Bus service that owns the interface
90 */
91 void checkThresholds(const std::string& interface,
92 const std::string& sensorPath,
93 const std::string& service);
94
95 /**
Matt Spinler66e75a72021-05-14 10:32:47 -050096 * @brief Checks for all active alarms on all existing
97 * threshold interfaces and creates event logs
98 * if necessary.
99 */
100 void checkThresholds();
101
102 /**
Matt Spinler50bf8162021-02-01 16:24:01 -0600103 * @brief Creates an event log for the alarm set/clear
104 *
105 * @param[in] sensorPath - The sensor object path
106 * @param[in] interface - The threshold interface
107 * @param[in] alarmProperty - The alarm property name
108 * @param[in] alarmValue - The alarm value
109 */
110 void createEventLog(const std::string& sensorPath,
111 const std::string& interface,
112 const std::string& alarmProperty, bool alarmValue);
113
114 /**
Matt Spinler2f182672021-02-01 16:51:38 -0600115 * @brief Returns the type of the sensor using the path segment
116 * that precedes the sensor name.
117 *
118 * /xyz/openbmc_project/sensors/voltage/vout -> type == voltage
119 *
120 * @param[in] sensorPath - The sensor object path name
121 *
122 * @return std::string The type segment
123 */
124 std::string getSensorType(std::string sensorPath);
125
126 /**
127 * @brief Allows for skipping event logs based on the sensor type.
128 *
129 * Specifically for the 'utilization' type because its provider
130 * doesn't support configurable thresholds yet.
131 *
132 * @param[in] type - The sensor type, like 'temperature'.
133 * @return bool - If it can be skipped or not.
134 */
135 bool skipSensorType(const std::string& type);
136
137 /**
138 * @brief Returns the inventory path to use for a FRU callout
139 * for the alarm exceeded errors.
140 *
141 * It finds the path by looking for 'inventory' or 'chassis'
142 * association objects on the sensor that point to a FRU.
143 *
144 * @param[in] std::string - The sensor object path
145 * @return std::string - The inventory path for the FRU callout.
146 * May be empty if none found.
147 */
148 std::string getCallout(const std::string& sensorPath);
149
150 /**
Matt Spinler66e75a72021-05-14 10:32:47 -0500151 * @brief The power state changed handler.
152 *
153 * Checks alarms when power is turned on.
154 *
155 * @param[in] powerStateOn - If the power is now on or off.
156 */
157 void powerStateChanged(bool powerStateOn);
158
159 /**
Matt Spinler403d1f52021-02-01 15:35:25 -0600160 * @brief The sdbusplus bus object
161 */
162 sdbusplus::bus::bus& bus;
163
164 /**
165 * @brief The sdeventplus Event object
166 */
167 sdeventplus::Event& event;
168
169 /**
Matt Spinler66e75a72021-05-14 10:32:47 -0500170 * @brief The PowerState object to track power state changes.
171 */
Matt Spinler7f6946b2021-05-14 12:43:50 -0500172 std::shared_ptr<phosphor::fan::PowerState> _powerState;
Matt Spinler66e75a72021-05-14 10:32:47 -0500173
174 /**
Matt Spinler403d1f52021-02-01 15:35:25 -0600175 * @brief The Warning interface match object
176 */
177 sdbusplus::bus::match::match warningMatch;
178
179 /**
180 * @brief The Critical interface match object
181 */
182 sdbusplus::bus::match::match criticalMatch;
183
184 /**
185 * @brief The PerformanceLoss interface match object
186 */
187 sdbusplus::bus::match::match perfLossMatch;
Matt Spinler50bf8162021-02-01 16:24:01 -0600188
189 /**
190 * @brief The current alarm values
191 */
192 std::map<InterfaceKey, std::map<PropertyName, bool>> alarms;
Matt Spinler403d1f52021-02-01 15:35:25 -0600193};
194
195} // namespace sensor::monitor