blob: 9f0653ceea902918594d7e12ddfc0964e2328e85 [file] [log] [blame]
Andrei Kartashev50fe8ee2022-01-04 21:24:22 +03001/*
2 * SPDX-License-Identifier: Apache-2.0
3 * Copyright (C) 2021-2022 YADRO.
4 */
5
6#pragma once
7
Ed Tanous744e9a92023-02-28 13:35:22 -08008#include <boost/asio/io_context.hpp>
Andrei Kartashev99e8f9d2022-01-09 12:15:05 +03009#include <boost/asio/steady_timer.hpp>
10#include <boost/container/flat_map.hpp>
Andrei Kartashev50fe8ee2022-01-04 21:24:22 +030011#include <nlohmann/json.hpp>
Andrei Kartashev99e8f9d2022-01-09 12:15:05 +030012#include <sdbusplus/asio/object_server.hpp>
Andrei Kartashev50fe8ee2022-01-04 21:24:22 +030013
14#include <filesystem>
Ed Tanouscea510b2023-03-07 12:15:05 -080015#include <list>
Andrei Kartashev50fe8ee2022-01-04 21:24:22 +030016#include <string_view>
17
18namespace power_control
19{
20
21/**
22 * @brief Persistent State Manager
23 *
24 * This manager supposed to store runtime parameters that supposed to be
25 * persistent over BMC reboot. It provides simple Get/Set interface and handle
26 * default values, hardcoded in getDefault() method.
27 * @note: currently only string parameters supported
28 */
Andrei Kartashev99e8f9d2022-01-09 12:15:05 +030029using dbusPropertiesList =
30 boost::container::flat_map<std::string,
31 std::variant<std::string, uint64_t>>;
32/**
33 * @brief The class contains functions to invoke power restore policy.
34 *
35 * This class only exists to unite all PowerRestore-related code. It supposed
36 * to run only once on application startup.
37 */
38class PowerRestoreController
39{
40 public:
Ed Tanous744e9a92023-02-28 13:35:22 -080041 PowerRestoreController(boost::asio::io_context& io) :
Andrei Kartashev99e8f9d2022-01-09 12:15:05 +030042 policyInvoked(false), powerRestoreDelay(-1), powerRestoreTimer(io),
43 timerFired(false)
44 {}
45 /**
46 * @brief Power Restore entry point.
47 *
48 * Call this to start Power Restore algorithm.
49 */
50 void run();
51 /**
52 * @brief Initialize configuration parameters.
53 *
54 * Parse list of properties, received from dbus, to set Power Restore
55 * algorithm configuration.
56 * @param props - map of property names and values
57 */
58 void setProperties(const dbusPropertiesList& props);
59
60 private:
61 bool policyInvoked;
62 std::string powerRestorePolicy;
63 int powerRestoreDelay;
Patrick Williams439b9c32022-07-22 19:26:53 -050064 std::list<sdbusplus::bus::match_t> matches;
Andrei Kartashev99e8f9d2022-01-09 12:15:05 +030065 boost::asio::steady_timer powerRestoreTimer;
66 bool timerFired;
67#ifdef USE_ACBOOT
68 std::string acBoot;
69#endif // USE_ACBOOT
70
71 /**
72 * @brief Check if all required algorithms parameters are set
73 *
74 * Call this after set any of Power Restore algorithm parameters. Once all
75 * parameters are set this will run invoke() function.
76 */
77 void invokeIfReady();
78 /**
79 * @brief Actually perform power restore actions.
80 *
81 * Take Power Restore actions according to Policy and other parameters.
82 */
83 void invoke();
84 /**
85 * @brief Check if power was dropped.
86 *
87 * Read last saved power state to determine if host power was enabled before
88 * last BMC reboot.
89 */
90 bool wasPowerDropped();
91};
92
Andrei Kartashev50fe8ee2022-01-04 21:24:22 +030093class PersistentState
94{
95 public:
96 /**
97 * List of all supported parameters
98 */
99 enum class Params
100 {
101 PowerState,
102 };
103
104 /**
105 * @brief Persistent storage initialization
106 *
107 * Class constructor automatically load last state from JSON file
108 */
109 PersistentState();
110 /**
111 * @brief Persistent storage cleanup
112 *
113 * Class destructor automatically save state to JSON file
114 */
115 ~PersistentState();
116 /**
117 * @brief Get parameter value from the storage
118 *
119 * Get the parameter from cached storage. Default value returned, if
120 * parameter was not set before.
121 * @param parameter - parameter to get
122 * @return parameter value
123 */
124 const std::string get(Params parameter);
125 /**
126 * @brief Store parameter value
127 *
128 * Set the parameter value in cached storage and dump it to disk.
129 * @param parameter - parameter to set
130 * @param value - parameter value to assign
131 */
132 void set(Params parameter, const std::string& value);
133
134 private:
135 nlohmann::json stateData;
136 const std::filesystem::path powerControlDir = "/var/lib/power-control";
137 const std::string_view stateFile = "state.json";
138 const int indentationSize = 2;
139
140 /**
141 * @brief Covert parameter ID to name
142 *
143 * Get the name corresponding to the given parameter.
144 * String name only used by the manager internal to generate human-readable
145 * JSON.
146 * @param parameter - parameter to convert
147 * @return parameter name
148 */
149 const std::string getName(const Params parameter);
150 /**
151 * @brief Get default parameter value
152 *
153 * Get the default value, associated with given parameter.
154 * @param parameter - parameter to get
155 * @return parameter default value
156 */
157 const std::string getDefault(const Params parameter);
158 /**
159 * @brief Save cache to file on disk
160 */
161 void saveState();
162};
163
164} // namespace power_control