blob: b8d39e1b7ff7cad374c0c70d3da24c30cba0b31a [file] [log] [blame]
#pragma once
#include "api.hpp"
#include <fmt/printf.h>
#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/bus/match.hpp>
#include <xyz/openbmc_project/Time/Boot/Checkpoint/server.hpp>
#include <xyz/openbmc_project/Time/Boot/Duration/server.hpp>
#include <xyz/openbmc_project/Time/Boot/Statistic/server.hpp>
#include <cstdint>
#include <memory>
#include <string>
namespace boot_time_monitor
{
namespace dbus
{
namespace btm = boot_time_monitor;
/**
* @brief Configuration for the D-Bus handler.
*/
struct DbusConfig
{
/** @brief The D-Bus object path for this handler instance. */
std::string dbusObjPath;
};
/**
* @brief Handles D-Bus requests related to boot time monitoring for a specific
* node.
*
* This class implements the D-Bus interfaces for Checkpoint, Duration, and
* Statistic defined under `xyz.openbmc_project.Time.Boot`. It acts as a
* bridge between incoming D-Bus calls and the underlying boot time monitoring
* API (`api::IApi`). Each instance of this handler is associated with a
* specific node configuration (`NodeConfig`) and interacts with the central API
* to record or retrieve boot time data for that node.
*/
class Handler :
sdbusplus::server::object::object<
sdbusplus::server::xyz::openbmc_project::time::boot::Duration>,
sdbusplus::server::object::object<
sdbusplus::server::xyz::openbmc_project::time::boot::Checkpoint>,
sdbusplus::server::object::object<
sdbusplus::server::xyz::openbmc_project::time::boot::Statistic>
{
public:
/**
* @brief Constructs the D-Bus handler.
*
* @param dbus The sdbusplus bus connection.
* @param nodeConfig Configuration of the node this handler manages.
* @param dbusConfig D-Bus specific configuration (object path).
* @param api Shared pointer to the central boot time monitoring API.
*/
Handler(sdbusplus::bus::bus& dbus, const btm::NodeConfig& nodeConfig,
const btm::dbus::DbusConfig& dbusConfig,
std::shared_ptr<btm::api::IApi> api);
/**
* @brief D-Bus method implementation for setting a boot checkpoint.
*
* Forwards the request to the appropriate API method
* (`SetNodeCheckpoint` or `SetPSUCheckpoint`).
*
* @param checkpointName The name of the checkpoint.
* @param wallTime The wall clock time (epoch time in ms).
* @param selfMeasuredDuration Optional self-measured duration (ms).
*/
void setCheckpoint(std::string checkpointName, int64_t wallTime,
int64_t selfMeasuredDuration) override;
/**
* @brief D-Bus method implementation for retrieving the checkpoint list.
*
* Retrieves the data from the API via `GetNodeCheckpointList`.
*
* @return A vector of tuples: (checkpoint name, wall time ms, monotonic
* time ms).
*/
std::vector<std::tuple<std::string, int64_t, int64_t>>
getCheckpointList() override;
/**
* @brief D-Bus method implementation to signal boot completion.
*
* Calls `NotifyNodeComplete` on the API if the node is currently rebooting.
*/
void rebootComplete() override;
/**
* @brief D-Bus method implementation for setting a boot duration.
*
* Forwards the request to the appropriate API method
* (`SetNodeDuration` or `SetPSUDuration`).
*
* @param durationName The name of the duration measurement.
* @param duration The measured duration in milliseconds.
*/
void setDuration(std::string durationName, int64_t duration) override;
/**
* @brief D-Bus method implementation for retrieving additional durations.
*
* Retrieves the data from the API via `GetNodeAdditionalDurations`.
*
* @return A vector of tuples: (duration name, duration ms).
*/
std::vector<std::tuple<std::string, int64_t>>
getAdditionalDurations() override;
/**
* @brief D-Bus property getter implementation for checking reboot status.
*
* Retrieves the status from the API via `IsNodeRebooting`.
*
* @return True if the node is considered to be rebooting, false otherwise.
*/
bool isRebooting() const override;
private:
/** @brief Configuration of the node associated with this handler. */
NodeConfig mNodeConfig;
/** @brief Shared pointer to the central boot time monitoring API. */
std::shared_ptr<api::IApi> mApi;
};
} // namespace dbus
} // namespace boot_time_monitor