blob: 9f0653ceea902918594d7e12ddfc0964e2328e85 [file] [log] [blame]
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright (C) 2021-2022 YADRO.
*/
#pragma once
#include <boost/asio/io_context.hpp>
#include <boost/asio/steady_timer.hpp>
#include <boost/container/flat_map.hpp>
#include <nlohmann/json.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <filesystem>
#include <list>
#include <string_view>
namespace power_control
{
/**
* @brief Persistent State Manager
*
* This manager supposed to store runtime parameters that supposed to be
* persistent over BMC reboot. It provides simple Get/Set interface and handle
* default values, hardcoded in getDefault() method.
* @note: currently only string parameters supported
*/
using dbusPropertiesList =
boost::container::flat_map<std::string,
std::variant<std::string, uint64_t>>;
/**
* @brief The class contains functions to invoke power restore policy.
*
* This class only exists to unite all PowerRestore-related code. It supposed
* to run only once on application startup.
*/
class PowerRestoreController
{
public:
PowerRestoreController(boost::asio::io_context& io) :
policyInvoked(false), powerRestoreDelay(-1), powerRestoreTimer(io),
timerFired(false)
{}
/**
* @brief Power Restore entry point.
*
* Call this to start Power Restore algorithm.
*/
void run();
/**
* @brief Initialize configuration parameters.
*
* Parse list of properties, received from dbus, to set Power Restore
* algorithm configuration.
* @param props - map of property names and values
*/
void setProperties(const dbusPropertiesList& props);
private:
bool policyInvoked;
std::string powerRestorePolicy;
int powerRestoreDelay;
std::list<sdbusplus::bus::match_t> matches;
boost::asio::steady_timer powerRestoreTimer;
bool timerFired;
#ifdef USE_ACBOOT
std::string acBoot;
#endif // USE_ACBOOT
/**
* @brief Check if all required algorithms parameters are set
*
* Call this after set any of Power Restore algorithm parameters. Once all
* parameters are set this will run invoke() function.
*/
void invokeIfReady();
/**
* @brief Actually perform power restore actions.
*
* Take Power Restore actions according to Policy and other parameters.
*/
void invoke();
/**
* @brief Check if power was dropped.
*
* Read last saved power state to determine if host power was enabled before
* last BMC reboot.
*/
bool wasPowerDropped();
};
class PersistentState
{
public:
/**
* List of all supported parameters
*/
enum class Params
{
PowerState,
};
/**
* @brief Persistent storage initialization
*
* Class constructor automatically load last state from JSON file
*/
PersistentState();
/**
* @brief Persistent storage cleanup
*
* Class destructor automatically save state to JSON file
*/
~PersistentState();
/**
* @brief Get parameter value from the storage
*
* Get the parameter from cached storage. Default value returned, if
* parameter was not set before.
* @param parameter - parameter to get
* @return parameter value
*/
const std::string get(Params parameter);
/**
* @brief Store parameter value
*
* Set the parameter value in cached storage and dump it to disk.
* @param parameter - parameter to set
* @param value - parameter value to assign
*/
void set(Params parameter, const std::string& value);
private:
nlohmann::json stateData;
const std::filesystem::path powerControlDir = "/var/lib/power-control";
const std::string_view stateFile = "state.json";
const int indentationSize = 2;
/**
* @brief Covert parameter ID to name
*
* Get the name corresponding to the given parameter.
* String name only used by the manager internal to generate human-readable
* JSON.
* @param parameter - parameter to convert
* @return parameter name
*/
const std::string getName(const Params parameter);
/**
* @brief Get default parameter value
*
* Get the default value, associated with given parameter.
* @param parameter - parameter to get
* @return parameter default value
*/
const std::string getDefault(const Params parameter);
/**
* @brief Save cache to file on disk
*/
void saveState();
};
} // namespace power_control