xref: /openbmc/phosphor-fan-presence/presence/json_parser.hpp (revision 9e9f599cece7fe6cdf99b1927a515fc8a552b7e9)
1 #pragma once
2 
3 #include "error_reporter.hpp"
4 #include "fan.hpp"
5 #include "psensor.hpp"
6 #include "rpolicy.hpp"
7 
8 #include <nlohmann/json.hpp>
9 #include <sdbusplus/bus.hpp>
10 #include <sdeventplus/source/signal.hpp>
11 
12 #include <filesystem>
13 #include <memory>
14 #include <string>
15 #include <vector>
16 
17 namespace phosphor
18 {
19 namespace fan
20 {
21 namespace presence
22 {
23 
24 namespace fs = std::filesystem;
25 using json = nlohmann::json;
26 
27 constexpr auto confFileName = "config.json";
28 constexpr auto confAppName = "presence";
29 
30 using policies = std::vector<std::unique_ptr<RedundancyPolicy>>;
31 
32 constexpr auto fanPolicyFanPos = 0;
33 constexpr auto fanPolicySensorListPos = 1;
34 using fanPolicy = std::tuple<Fan, std::vector<std::unique_ptr<PresenceSensor>>>;
35 
36 // Presence method handler function
37 using methodHandler =
38     std::function<std::unique_ptr<PresenceSensor>(size_t, const json&)>;
39 // Presence redundancy policy handler function
40 using rpolicyHandler =
41     std::function<std::unique_ptr<RedundancyPolicy>(const fanPolicy&)>;
42 
43 class JsonConfig
44 {
45   public:
46     JsonConfig() = delete;
47     JsonConfig(const JsonConfig&) = delete;
48     JsonConfig(JsonConfig&&) = delete;
49     JsonConfig& operator=(const JsonConfig&) = delete;
50     JsonConfig& operator=(JsonConfig&&) = delete;
51     ~JsonConfig() = default;
52 
53     /**
54      * Constructor
55      * Parses and populates the fan presence policies from a json file
56      *
57      * @param[in] bus - sdbusplus bus object
58      */
59     explicit JsonConfig(sdbusplus::bus::bus& bus);
60 
61     /**
62      * @brief Get the json config based fan presence policies
63      *
64      * @return - The fan presence policies
65      */
66     static const policies& get();
67 
68     /**
69      * @brief Callback function to handle receiving a HUP signal to
70      * reload the json configuration.
71      *
72      * @param[in] sigSrc - sd_event_source signal wrapper
73      * @param[in] sigInfo - signal info on signal fd
74      */
75     void sighupHandler(sdeventplus::source::Signal& sigSrc,
76                        const struct signalfd_siginfo* sigInfo);
77 
78   private:
79     /* Fan presence policies */
80     static policies _policies;
81 
82     /* The sdbusplus bus object */
83     sdbusplus::bus::bus& _bus;
84 
85     /* List of Fan objects to have presence policies */
86     std::vector<fanPolicy> _fans;
87 
88     /* Presence methods mapping to their associated handler function */
89     static const std::map<std::string, methodHandler> _methods;
90 
91     /**
92      * Presence redundancy policy mapping to their associated handler
93      * function
94      */
95     static const std::map<std::string, rpolicyHandler> _rpolicies;
96 
97     /**
98      * Class that handles reporting errors for missing fans.
99      */
100     std::unique_ptr<ErrorReporter> _reporter;
101 
102     /**
103      * @brief Process the json config to extract the defined fan presence
104      * policies.
105      *
106      * @param[in] jsonConf - parsed json configuration data
107      */
108     void process(const json& jsonConf);
109 
110     /**
111      * @brief Get the redundancy policy of presence detection for a fan
112      *
113      * @param[in] rpolicy - policy type to construct
114      * @param[in] fpolicy - fan policy object
115      *
116      * @return - The constructed redundancy policy type for the fan
117      */
118     std::unique_ptr<RedundancyPolicy> getPolicy(const json& rpolicy,
119                                                 const fanPolicy& fpolicy);
120 };
121 
122 /**
123  * Methods of fan presence detection function declarations
124  */
125 namespace method
126 {
127 /**
128  * @brief Fan presence detection method by tach feedback
129  *
130  * @param[in] fanIndex - fan object index to add tach method
131  * @param[in] method - json properties for a tach method
132  *
133  * @return - A presence sensor to detect fan presence by tach feedback
134  */
135 std::unique_ptr<PresenceSensor> getTach(size_t fanIndex, const json& method);
136 
137 /**
138  * @brief Fan presence detection method by gpio
139  *
140  * @param[in] fanIndex - fan object index to add gpio method
141  * @param[in] method - json properties for a gpio method
142  *
143  * @return - A presence sensor to detect fan presence by gpio
144  */
145 std::unique_ptr<PresenceSensor> getGpio(size_t fanIndex, const json& method);
146 
147 } // namespace method
148 
149 /**
150  * Redundancy policies for fan presence detection function declarations
151  */
152 namespace rpolicy
153 {
154 /**
155  * @brief Create an `Anyof` redundancy policy on the created presence
156  * sensors for a fan
157  *
158  * @param[in] fan - fan policy object with the presence sensors for the fan
159  *
160  * @return - An `Anyof` redundancy policy
161  */
162 std::unique_ptr<RedundancyPolicy> getAnyof(const fanPolicy& fan);
163 
164 /**
165  * @brief Create a `Fallback` redundancy policy on the created presence
166  * sensors for a fan
167  *
168  * @param[in] fan - fan policy object with the presence sensors for the fan
169  *
170  * @return - A `Fallback` redundancy policy
171  */
172 std::unique_ptr<RedundancyPolicy> getFallback(const fanPolicy& fan);
173 
174 } // namespace rpolicy
175 
176 } // namespace presence
177 } // namespace fan
178 } // namespace phosphor
179