1 #pragma once
2 
3 #include "config.h"
4 
5 #include "settings.hpp"
6 #include "xyz/openbmc_project/State/Host/server.hpp"
7 
8 #include <sdbusplus/bus.hpp>
9 
10 namespace phosphor
11 {
12 namespace state
13 {
14 namespace manager
15 {
16 
17 using HypervisorInherit = sdbusplus::server::object::object<
18     sdbusplus::xyz::openbmc_project::State::server::Host>;
19 
20 namespace server = sdbusplus::xyz::openbmc_project::State::server;
21 namespace sdbusRule = sdbusplus::bus::match::rules;
22 
23 /** @class Host
24  *  @brief OpenBMC host state management implementation.
25  *  @details A concrete implementation for xyz.openbmc_project.State.Host
26  *  DBus API.
27  */
28 class Hypervisor : public HypervisorInherit
29 {
30   public:
31     Hypervisor() = delete;
32     Hypervisor(const Hypervisor&) = delete;
33     Hypervisor& operator=(const Hypervisor&) = delete;
34     Hypervisor(Hypervisor&&) = delete;
35     Hypervisor& operator=(Hypervisor&&) = delete;
36     virtual ~Hypervisor() = default;
37 
38     /** @brief Constructs Hypervisor State Manager
39      *
40      * @param[in] bus       - The Dbus bus object
41      * @param[in] objPath   - The Dbus object path
42      */
43     Hypervisor(sdbusplus::bus::bus& bus, const char* objPath) :
44         HypervisorInherit(bus, objPath,
45                           HypervisorInherit::action::emit_object_added),
46         bus(bus),
47         bootProgressChangeSignal(
48             bus,
49             sdbusRule::propertiesChanged(
50                 "/xyz/openbmc_project/state/host0",
51                 "xyz.openbmc_project.State.Boot.Progress"),
52             std::bind(std::mem_fn(&Hypervisor::bootProgressChangeEvent), this,
53                       std::placeholders::_1))
54     {}
55 
56     /** @brief Set value of HostTransition */
57     server::Host::Transition
58         requestedHostTransition(server::Host::Transition value) override;
59 
60     /** @brief Set value of CurrentHostState */
61     server::Host::HostState
62         currentHostState(server::Host::HostState value) override;
63 
64     /** @brief Return value of CurrentHostState */
65     server::Host::HostState currentHostState();
66 
67     /** @brief Check if BootProgress change affects hypervisor state
68      *
69      * @param[in]  bootProgress     - BootProgress value to check
70      *
71      */
72     void updateCurrentHostState(std::string& bootProgress);
73 
74   private:
75     /** @brief Process BootProgress property changes
76      *
77      * Instance specific interface to monitor for changes to the BootProgress
78      * property which may impact Hypervisor state.
79      *
80      * @param[in]  msg              - Data associated with subscribed signal
81      *
82      */
83     void bootProgressChangeEvent(sdbusplus::message::message& msg);
84 
85     /** @brief Persistent sdbusplus DBus bus connection. */
86     sdbusplus::bus::bus& bus;
87 
88     /** @brief Watch BootProgress changes to know hypervisor state **/
89     sdbusplus::bus::match_t bootProgressChangeSignal;
90 };
91 
92 } // namespace manager
93 } // namespace state
94 } // namespace phosphor
95