blob: 640ea94907e198052bec9c31e7063b00622c7478 [file] [log] [blame]
Andrew Geissler36529022016-11-29 15:23:54 -06001#include <iostream>
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -06002#include <map>
3#include <string>
Andrew Geissleref3c1842016-12-01 12:33:09 -06004#include <systemd/sd-bus.h>
Andrew Geissler36529022016-11-29 15:23:54 -06005#include "host_state_manager.hpp"
6
7namespace phosphor
8{
9namespace state
10{
11namespace manager
12{
13
Andrew Geissler3e3b84b2016-12-02 15:46:17 -060014// When you see server:: you know we're referencing our base class
15namespace server = sdbusplus::xyz::openbmc_project::State::server;
16
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060017/* Map a transition to it's systemd target */
18const std::map<server::Host::Transition,std::string> SYSTEMD_TARGET_TABLE =
19{
20 {server::Host::Transition::Off,"obmc-chassis-stop@0.target"},
21 {server::Host::Transition::On,"obmc-chassis-start@0.target"}
22};
23
24constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
25constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1";
26constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
27
28constexpr auto SYSTEM_SERVICE = "org.openbmc.managers.System";
29constexpr auto SYSTEM_OBJ_PATH = "/org/openbmc/managers/System";
30constexpr auto SYSTEM_INTERFACE = SYSTEM_SERVICE;
31
Andrew Geissleref3c1842016-12-01 12:33:09 -060032// TODO - Will be rewritten once sdbusplus client bindings are in place
33// and persistent storage design is in place
34void Host::determineInitialState()
35{
36 std::string sysState;
37
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060038 auto method = this->bus.new_method_call(SYSTEM_SERVICE,
39 SYSTEM_OBJ_PATH,
40 SYSTEM_INTERFACE,
Andrew Geissleref3c1842016-12-01 12:33:09 -060041 "getSystemState");
42
43 auto reply = this->bus.call(method);
44
45 reply.read(sysState);
46
47 if(sysState == "HOST_BOOTED")
48 {
49 std::cout << "HOST is BOOTED " << sysState << std::endl;
Andrew Geissler3e3b84b2016-12-02 15:46:17 -060050 server::Host::currentHostState(HostState::Running);
Andrew Geissleref3c1842016-12-01 12:33:09 -060051 }
52 else
53 {
54 std::cout << "HOST is not BOOTED " << sysState << std::endl;
Andrew Geissler3e3b84b2016-12-02 15:46:17 -060055 server::Host::currentHostState(HostState::Off);
Andrew Geissleref3c1842016-12-01 12:33:09 -060056 }
57
58 // Set transition initially to Off
59 // TODO - Eventually need to restore this from persistent storage
Andrew Geissler3e3b84b2016-12-02 15:46:17 -060060 server::Host::requestedHostTransition(Transition::Off);
Andrew Geissleref3c1842016-12-01 12:33:09 -060061
62 return;
63}
64
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060065void Host::executeTransition(Transition tranReq)
66{
67 auto sysdUnit = SYSTEMD_TARGET_TABLE.find(tranReq)->second;
68
69 auto method = this->bus.new_method_call(SYSTEMD_SERVICE,
70 SYSTEMD_OBJ_PATH,
71 SYSTEMD_INTERFACE,
72 "StartUnit");
73
74 method.append(sysdUnit);
75 method.append("replace");
76
77 this->bus.call(method);
78
79 return;
80}
81
Andrew Geissleref3c1842016-12-01 12:33:09 -060082Host::Transition Host::requestedHostTransition(Transition value)
83{
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060084 std::cout << "Someone is setting the RequestedHostTransition field"
85 << std::endl;
86 executeTransition(value);
87 std::cout << "Transition executed with success" << std::endl;
88
Andrew Geissler3e3b84b2016-12-02 15:46:17 -060089 return server::Host::requestedHostTransition(value);
Andrew Geissleref3c1842016-12-01 12:33:09 -060090}
91
Andrew Geissleref3c1842016-12-01 12:33:09 -060092Host::HostState Host::currentHostState(HostState value)
93{
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060094 std::cout << "Someone is being bad and trying to set the HostState field"
95 << std::endl;
Andrew Geissleref3c1842016-12-01 12:33:09 -060096
Andrew Geissler3e3b84b2016-12-02 15:46:17 -060097 return server::Host::currentHostState();
Andrew Geissleref3c1842016-12-01 12:33:09 -060098}
99
Andrew Geissler36529022016-11-29 15:23:54 -0600100} // namespace manager
101} // namespace state
102} // namepsace phosphor