xref: /openbmc/phosphor-state-manager/scheduled_host_transition.hpp (revision d182bff5ef2e7c8526a5dff97372f6eb423abc71)
1 #pragma once
2 
3 #include "config.h"
4 
5 #include <sdbusplus/bus.hpp>
6 #include <sdeventplus/event.hpp>
7 #include <sdeventplus/utility/timer.hpp>
8 #include <xyz/openbmc_project/State/ScheduledHostTransition/server.hpp>
9 
10 class TestScheduledHostTransition;
11 
12 namespace phosphor
13 {
14 namespace state
15 {
16 namespace manager
17 {
18 
19 using Transition =
20     sdbusplus::xyz::openbmc_project::State::server::Host::Transition;
21 using ScheduledHostTransitionInherit = sdbusplus::server::object_t<
22     sdbusplus::xyz::openbmc_project::State::server::ScheduledHostTransition>;
23 
24 /** @class ScheduledHostTransition
25  *  @brief Scheduled host transition implementation.
26  *  @details A concrete implementation for
27  *  xyz.openbmc_project.State.ScheduledHostTransition
28  */
29 class ScheduledHostTransition : public ScheduledHostTransitionInherit
30 {
31   public:
32     ScheduledHostTransition(sdbusplus::bus_t& bus, const char* objPath,
33                             size_t id, const sdeventplus::Event& event) :
34         ScheduledHostTransitionInherit(
35             bus, objPath, ScheduledHostTransition::action::defer_emit),
36         bus(bus), id(id), event(event),
37         timer(event, [this](auto&) { callback(); })
38     {
39         initialize();
40 
41         restoreScheduledValues();
42 
43         // We deferred this until we could get our property correct
44         this->emit_object_added();
45     }
46 
47     ~ScheduledHostTransition();
48 
49     /**
50      * @brief Handle with scheduled time
51      *
52      * @param[in] value - The seconds since epoch
53      * @return The time for the transition. It is the same as the input value if
54      * it is set successfully. Otherwise, it won't return value, but throw an
55      * error.
56      **/
57     uint64_t scheduledTime(uint64_t value) override;
58 
59   private:
60     friend class TestScheduledHostTransition;
61 
62     /** @brief sdbusplus bus client connection */
63     sdbusplus::bus_t& bus;
64 
65     /** @brief Host id. **/
66     const size_t id = 0;
67 
68     /** @brief sdbusplus event */
69     const sdeventplus::Event& event;
70 
71     /** @brief Timer used for host transition with seconds */
72     sdeventplus::utility::Timer<sdeventplus::ClockId::RealTime> timer;
73 
74     /** @brief The fd for time change event */
75     int timeFd = -1;
76 
77     /** @brief Get current time
78      *
79      *  @return - return current epoch time
80      */
81     std::chrono::seconds getTime();
82 
83     /** @brief Implement host transition
84      *
85      *  @return - Does not return anything. Error will result in exception
86      *            being thrown
87      */
88     void hostTransition();
89 
90     /** @brief Used by the timer to do host transition */
91     void callback();
92 
93     /** @brief Initialize timerFd related resource */
94     void initialize();
95 
96     /** @brief The callback function on system time change
97      *
98      * @param[in] es - Source of the event
99      * @param[in] fd - File descriptor of the timer
100      * @param[in] revents - Not used
101      * @param[in] userdata - User data pointer
102      */
103     static int onTimeChange(sd_event_source* es, int fd, uint32_t revents,
104                             void* userdata);
105 
106     /** @brief The deleter of sd_event_source */
107     std::function<void(sd_event_source*)> sdEventSourceDeleter =
108         [](sd_event_source* p) {
109             if (p)
110             {
111                 sd_event_source_unref(p);
112             }
113         };
114 
115     using SdEventSource =
116         std::unique_ptr<sd_event_source, decltype(sdEventSourceDeleter)>;
117 
118     /** @brief The event source on system time change */
119     SdEventSource timeChangeEventSource{nullptr, sdEventSourceDeleter};
120 
121     /** @brief Handle with the process when bmc time is changed*/
122     void handleTimeUpdates();
123 
124     /** @brief Serialize the scheduled values */
125     void serializeScheduledValues();
126 
127     /** @brief Deserialize the scheduled values
128      *
129      *  @param[out] time - Deserialized scheduled time
130      *  @param[out] trans - Deserialized requested transition
131      *
132      *  @return bool - true if successful, false otherwise
133      */
134     bool deserializeScheduledValues(uint64_t& time, Transition& trans);
135 
136     /** @brief Restore scheduled time and requested transition from persisted
137      * file */
138     void restoreScheduledValues();
139 };
140 } // namespace manager
141 } // namespace state
142 } // namespace phosphor
143