blob: 00f41cbfdd2be85bbba8bb43cd08ebab89b6781c [file] [log] [blame]
Andrew Geisslere426b582020-05-28 12:40:55 -05001#include "config.h"
2
3#include "host_state_manager.hpp"
4
Andrew Geissler0d1c3f12021-07-27 16:21:01 -04005#include "host_check.hpp"
6
Matt Spinlerbbbc0162020-11-11 14:43:50 -06007#include <fmt/format.h>
Andrew Geissler131d04a2021-03-12 11:02:41 -06008#include <stdio.h>
Andrew Geisslere426b582020-05-28 12:40:55 -05009#include <systemd/sd-bus.h>
10
11#include <cereal/archives/json.hpp>
12#include <cereal/cereal.hpp>
13#include <cereal/types/string.hpp>
14#include <cereal/types/tuple.hpp>
15#include <cereal/types/vector.hpp>
16#include <phosphor-logging/elog-errors.hpp>
17#include <phosphor-logging/log.hpp>
18#include <sdbusplus/exception.hpp>
19#include <sdbusplus/server.hpp>
20#include <xyz/openbmc_project/Common/error.hpp>
21#include <xyz/openbmc_project/Control/Power/RestorePolicy/server.hpp>
22
Andrew Geissler131d04a2021-03-12 11:02:41 -060023#include <filesystem>
Andrew Geisslere426b582020-05-28 12:40:55 -050024#include <fstream>
Andrew Geissler36529022016-11-29 15:23:54 -060025#include <iostream>
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060026#include <map>
27#include <string>
Dhruvaraj Subhashchandran3f475242017-07-12 00:44:27 -050028
Vishwanatha Subbanna0a838732017-10-05 12:43:19 +053029// Register class version with Cereal
Andrew Geissler769a62f2019-12-06 13:36:08 -060030CEREAL_CLASS_VERSION(phosphor::state::manager::Host, CLASS_VERSION)
Andrew Geissler36529022016-11-29 15:23:54 -060031
32namespace phosphor
33{
34namespace state
35{
36namespace manager
37{
38
Andrew Geissler7b90a622017-08-08 11:41:08 -050039// When you see server:: or reboot:: you know we're referencing our base class
Andrew Geissler3e3b84b2016-12-02 15:46:17 -060040namespace server = sdbusplus::xyz::openbmc_project::State::server;
Andrew Geissler7b90a622017-08-08 11:41:08 -050041namespace reboot = sdbusplus::xyz::openbmc_project::Control::Boot::server;
Dhruvaraj Subhashchandrana3b8d7e2017-08-10 05:40:04 -050042namespace bootprogress = sdbusplus::xyz::openbmc_project::State::Boot::server;
43namespace osstatus =
44 sdbusplus::xyz::openbmc_project::State::OperatingSystem::server;
Andrew Geissler1e3bf942016-12-13 15:32:22 -060045using namespace phosphor::logging;
Dhruvaraj Subhashchandran3f475242017-07-12 00:44:27 -050046namespace fs = std::experimental::filesystem;
Andrew Geissler2f60aae2019-09-12 13:25:21 -050047using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
Andrew Geissler1e3bf942016-12-13 15:32:22 -060048
Andrew Geissler4f309e82017-05-24 15:18:01 -050049// host-shutdown notifies host of shutdown and that leads to host-stop being
50// called so initiate a host shutdown with the -shutdown target and consider the
51// host shut down when the -stop target is complete
52constexpr auto HOST_STATE_SOFT_POWEROFF_TGT = "obmc-host-shutdown@0.target";
Josh D. Kingca357922017-04-11 13:44:09 -050053constexpr auto HOST_STATE_POWEROFF_TGT = "obmc-host-stop@0.target";
54constexpr auto HOST_STATE_POWERON_TGT = "obmc-host-start@0.target";
Andrew Geissler969b2612018-03-29 10:16:51 -070055constexpr auto HOST_STATE_POWERON_MIN_TGT = "obmc-host-startmin@0.target";
Andrew Geisslera27a6e82017-07-27 16:44:43 -050056constexpr auto HOST_STATE_REBOOT_TGT = "obmc-host-reboot@0.target";
Andrew Geissler40dd6e72020-02-07 14:31:12 -060057constexpr auto HOST_STATE_WARM_REBOOT = "obmc-host-warm-reboot@0.target";
58constexpr auto HOST_STATE_FORCE_WARM_REBOOT =
59 "obmc-host-force-warm-reboot@0.target";
Andrew Geissler47b96122020-02-11 16:13:13 -060060constexpr auto HOST_STATE_DIAGNOSTIC_MODE =
61 "obmc-host-diagnostic-mode@0.target";
Andrew Geissler40dd6e72020-02-07 14:31:12 -060062
Josh D. Kingcc3fb5d2017-04-19 15:45:10 -050063constexpr auto HOST_STATE_QUIESCE_TGT = "obmc-host-quiesce@0.target";
Andrew Geissler4da7e002017-01-24 15:21:40 -060064
Josh D. King929ef702017-03-02 10:58:11 -060065constexpr auto ACTIVE_STATE = "active";
66constexpr auto ACTIVATING_STATE = "activating";
67
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060068/* Map a transition to it's systemd target */
Andrew Geissler58a18012018-01-19 19:36:05 -080069const std::map<server::Host::Transition, std::string> SYSTEMD_TARGET_TABLE = {
70 {server::Host::Transition::Off, HOST_STATE_SOFT_POWEROFF_TGT},
71 {server::Host::Transition::On, HOST_STATE_POWERON_TGT},
Andrew Geissler40dd6e72020-02-07 14:31:12 -060072 {server::Host::Transition::Reboot, HOST_STATE_REBOOT_TGT},
Andrew Geissler7fdad602020-06-22 13:46:16 -050073// Some systems do not support a warm reboot so just map the reboot
74// requests to our normal cold reboot in that case
75#if ENABLE_WARM_REBOOT
Andrew Geissler40dd6e72020-02-07 14:31:12 -060076 {server::Host::Transition::GracefulWarmReboot, HOST_STATE_WARM_REBOOT},
77 {server::Host::Transition::ForceWarmReboot, HOST_STATE_FORCE_WARM_REBOOT}};
Andrew Geissler7fdad602020-06-22 13:46:16 -050078#else
79 {server::Host::Transition::GracefulWarmReboot, HOST_STATE_REBOOT_TGT},
80 {server::Host::Transition::ForceWarmReboot, HOST_STATE_REBOOT_TGT}};
81#endif
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060082
Andrew Geissler58a18012018-01-19 19:36:05 -080083constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
84constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1";
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -060085constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
86
Josh D. King929ef702017-03-02 10:58:11 -060087constexpr auto SYSTEMD_PROPERTY_IFACE = "org.freedesktop.DBus.Properties";
88constexpr auto SYSTEMD_INTERFACE_UNIT = "org.freedesktop.systemd1.Unit";
89
Andrew Geissler4da7e002017-01-24 15:21:40 -060090void Host::subscribeToSystemdSignals()
91{
Andrew Geissler58a18012018-01-19 19:36:05 -080092 auto method = this->bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
93 SYSTEMD_INTERFACE, "Subscribe");
Andrew Geissler2f60aae2019-09-12 13:25:21 -050094 try
95 {
96 this->bus.call_noreply(method);
97 }
Patrick Williams0a675212021-09-02 09:49:43 -050098 catch (const sdbusplus::exception::exception& e)
Andrew Geissler2f60aae2019-09-12 13:25:21 -050099 {
100 log<level::ERR>("Failed to subscribe to systemd signals",
101 entry("ERR=%s", e.what()));
102 elog<InternalFailure>();
103 }
Andrew Geissler4da7e002017-01-24 15:21:40 -0600104 return;
105}
106
Andrew Geissleref3c1842016-12-01 12:33:09 -0600107void Host::determineInitialState()
108{
Andrew Geissleref3c1842016-12-01 12:33:09 -0600109
Andrew Geissler0d1c3f12021-07-27 16:21:01 -0400110 if (stateActive(HOST_STATE_POWERON_MIN_TGT) || isHostRunning())
Andrew Geissleref3c1842016-12-01 12:33:09 -0600111 {
Andrew Geissler1e3bf942016-12-13 15:32:22 -0600112 log<level::INFO>("Initial Host State will be Running",
113 entry("CURRENT_HOST_STATE=%s",
114 convertForMessage(HostState::Running).c_str()));
Andrew Geissler97924142017-01-24 16:10:18 -0600115 server::Host::currentHostState(HostState::Running);
116 server::Host::requestedHostTransition(Transition::On);
Andrew Geissleref3c1842016-12-01 12:33:09 -0600117 }
118 else
119 {
Andrew Geissler1e3bf942016-12-13 15:32:22 -0600120 log<level::INFO>("Initial Host State will be Off",
121 entry("CURRENT_HOST_STATE=%s",
122 convertForMessage(HostState::Off).c_str()));
Andrew Geissler97924142017-01-24 16:10:18 -0600123 server::Host::currentHostState(HostState::Off);
124 server::Host::requestedHostTransition(Transition::Off);
Andrew Geissleref3c1842016-12-01 12:33:09 -0600125 }
126
Andrew Geissler033fc3b2017-08-30 15:11:44 -0500127 if (!deserialize(HOST_STATE_PERSIST_PATH))
Dhruvaraj Subhashchandran3f475242017-07-12 00:44:27 -0500128 {
Andrew Geissler58a18012018-01-19 19:36:05 -0800129 // set to default value.
Dhruvaraj Subhashchandran3f475242017-07-12 00:44:27 -0500130 server::Host::requestedHostTransition(Transition::Off);
131 }
Andrew Geissleref3c1842016-12-01 12:33:09 -0600132
133 return;
134}
135
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -0600136void Host::executeTransition(Transition tranReq)
137{
138 auto sysdUnit = SYSTEMD_TARGET_TABLE.find(tranReq)->second;
139
Andrew Geissler58a18012018-01-19 19:36:05 -0800140 auto method = this->bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
141 SYSTEMD_INTERFACE, "StartUnit");
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -0600142
143 method.append(sysdUnit);
144 method.append("replace");
145
Andrew Geissler4da7e002017-01-24 15:21:40 -0600146 this->bus.call_noreply(method);
Andrew Geissler0cd2eaf2016-12-07 10:50:13 -0600147
148 return;
149}
150
Josh D. King929ef702017-03-02 10:58:11 -0600151bool Host::stateActive(const std::string& target)
152{
Patrick Williams2975e262020-05-13 18:01:09 -0500153 std::variant<std::string> currentState;
Josh D. King929ef702017-03-02 10:58:11 -0600154 sdbusplus::message::object_path unitTargetPath;
155
Andrew Geissler58a18012018-01-19 19:36:05 -0800156 auto method = this->bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
157 SYSTEMD_INTERFACE, "GetUnit");
Josh D. King929ef702017-03-02 10:58:11 -0600158
159 method.append(target);
Josh D. King929ef702017-03-02 10:58:11 -0600160
Anthony Wilson32c532e2018-10-25 21:56:07 -0500161 try
Josh D. King929ef702017-03-02 10:58:11 -0600162 {
Anthony Wilson32c532e2018-10-25 21:56:07 -0500163 auto result = this->bus.call(method);
164 result.read(unitTargetPath);
165 }
Patrick Williams0a675212021-09-02 09:49:43 -0500166 catch (const sdbusplus::exception::exception& e)
Anthony Wilson32c532e2018-10-25 21:56:07 -0500167 {
168 log<level::ERR>("Error in GetUnit call", entry("ERROR=%s", e.what()));
Josh D. King929ef702017-03-02 10:58:11 -0600169 return false;
170 }
171
Andrew Geissler58a18012018-01-19 19:36:05 -0800172 method = this->bus.new_method_call(
173 SYSTEMD_SERVICE,
174 static_cast<const std::string&>(unitTargetPath).c_str(),
175 SYSTEMD_PROPERTY_IFACE, "Get");
Josh D. King929ef702017-03-02 10:58:11 -0600176
177 method.append(SYSTEMD_INTERFACE_UNIT, "ActiveState");
Josh D. King929ef702017-03-02 10:58:11 -0600178
Anthony Wilson32c532e2018-10-25 21:56:07 -0500179 try
Josh D. King929ef702017-03-02 10:58:11 -0600180 {
Anthony Wilson32c532e2018-10-25 21:56:07 -0500181 auto result = this->bus.call(method);
182 result.read(currentState);
183 }
Patrick Williams0a675212021-09-02 09:49:43 -0500184 catch (const sdbusplus::exception::exception& e)
Anthony Wilson32c532e2018-10-25 21:56:07 -0500185 {
186 log<level::ERR>("Error in ActiveState Get",
187 entry("ERROR=%s", e.what()));
Josh D. King929ef702017-03-02 10:58:11 -0600188 return false;
189 }
190
Patrick Williams37413dc2020-05-13 11:29:54 -0500191 const auto& currentStateStr = std::get<std::string>(currentState);
William A. Kennington III7a0689a2018-11-12 17:19:33 -0800192 return currentStateStr == ACTIVE_STATE ||
193 currentStateStr == ACTIVATING_STATE;
Josh D. King929ef702017-03-02 10:58:11 -0600194}
195
Michael Tritz206a8332017-02-06 16:01:23 -0600196bool Host::isAutoReboot()
197{
Deepak Kodihalli3dd08a52017-07-25 07:34:44 -0500198 using namespace settings;
Michael Tritz206a8332017-02-06 16:01:23 -0600199
Andrew Geissler7f620832020-10-23 08:25:52 -0500200 /* The logic here is to first check the one-time AutoReboot setting.
201 * If this property is true (the default) then look at the persistent
202 * user setting in the non one-time object, otherwise honor the one-time
203 * setting and do not auto reboot.
204 */
205 auto methodOneTime = bus.new_method_call(
Andrew Geissler58a18012018-01-19 19:36:05 -0800206 settings.service(settings.autoReboot, autoRebootIntf).c_str(),
Andrew Geissler7f620832020-10-23 08:25:52 -0500207 settings.autoRebootOneTime.c_str(), SYSTEMD_PROPERTY_IFACE, "Get");
208 methodOneTime.append(autoRebootIntf, "AutoReboot");
209
210 auto methodUserSetting = bus.new_method_call(
211 settings.service(settings.autoReboot, autoRebootIntf).c_str(),
212 settings.autoReboot.c_str(), SYSTEMD_PROPERTY_IFACE, "Get");
213 methodUserSetting.append(autoRebootIntf, "AutoReboot");
Michael Tritz206a8332017-02-06 16:01:23 -0600214
Anthony Wilson32c532e2018-10-25 21:56:07 -0500215 try
Michael Tritz206a8332017-02-06 16:01:23 -0600216 {
Andrew Geissler7f620832020-10-23 08:25:52 -0500217 auto reply = bus.call(methodOneTime);
Patrick Williams2975e262020-05-13 18:01:09 -0500218 std::variant<bool> result;
Anthony Wilson32c532e2018-10-25 21:56:07 -0500219 reply.read(result);
Patrick Williams37413dc2020-05-13 11:29:54 -0500220 auto autoReboot = std::get<bool>(result);
Andrew Geissler7f620832020-10-23 08:25:52 -0500221
222 if (!autoReboot)
223 {
224 log<level::INFO>("Auto reboot (one-time) disabled");
225 return false;
226 }
227 else
228 {
229 // one-time is true so read the user setting
230 reply = bus.call(methodUserSetting);
231 reply.read(result);
232 autoReboot = std::get<bool>(result);
233 }
234
Anthony Wilson32c532e2018-10-25 21:56:07 -0500235 auto rebootCounterParam = reboot::RebootAttempts::attemptsLeft();
236
237 if (autoReboot)
Saqib Khancbe08d12017-03-10 01:29:20 -0600238 {
Anthony Wilson32c532e2018-10-25 21:56:07 -0500239 if (rebootCounterParam > 0)
240 {
241 // Reduce BOOTCOUNT by 1
242 log<level::INFO>("Auto reboot enabled, rebooting");
243 return true;
244 }
245 else if (rebootCounterParam == 0)
246 {
247 // Reset reboot counter and go to quiesce state
248 log<level::INFO>("Auto reboot enabled. "
249 "HOST BOOTCOUNT already set to 0.");
250 attemptsLeft(BOOT_COUNT_MAX_ALLOWED);
251 return false;
252 }
253 else
254 {
255 log<level::INFO>("Auto reboot enabled. "
256 "HOST BOOTCOUNT has an invalid value.");
257 return false;
258 }
Saqib Khand5ac6352017-04-04 09:53:59 -0500259 }
260 else
261 {
Anthony Wilson32c532e2018-10-25 21:56:07 -0500262 log<level::INFO>("Auto reboot disabled.");
Saqib Khancbe08d12017-03-10 01:29:20 -0600263 return false;
264 }
Michael Tritz206a8332017-02-06 16:01:23 -0600265 }
Patrick Williams0a675212021-09-02 09:49:43 -0500266 catch (const sdbusplus::exception::exception& e)
Saqib Khand5ac6352017-04-04 09:53:59 -0500267 {
Anthony Wilson32c532e2018-10-25 21:56:07 -0500268 log<level::ERR>("Error in AutoReboot Get", entry("ERROR=%s", e.what()));
Saqib Khand5ac6352017-04-04 09:53:59 -0500269 return false;
270 }
Michael Tritz206a8332017-02-06 16:01:23 -0600271}
272
Andrew Geisslere4039a82020-02-11 15:51:59 -0600273void Host::sysStateChangeJobRemoved(sdbusplus::message::message& msg)
Andrew Geissler4da7e002017-01-24 15:21:40 -0600274{
Andrew Geissler58a18012018-01-19 19:36:05 -0800275 uint32_t newStateID{};
Andrew Geissler4da7e002017-01-24 15:21:40 -0600276 sdbusplus::message::object_path newStateObjPath;
277 std::string newStateUnit{};
278 std::string newStateResult{};
279
Andrew Geissler58a18012018-01-19 19:36:05 -0800280 // Read the msg and populate each variable
Patrick Williamsd22706f2017-05-04 05:42:49 -0500281 msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult);
Andrew Geissler4da7e002017-01-24 15:21:40 -0600282
Andrew Geissler58a18012018-01-19 19:36:05 -0800283 if ((newStateUnit == HOST_STATE_POWEROFF_TGT) &&
Andrew Geissler969b2612018-03-29 10:16:51 -0700284 (newStateResult == "done") &&
285 (!stateActive(HOST_STATE_POWERON_MIN_TGT)))
Andrew Geissleref621162016-12-08 12:56:21 -0600286 {
Andrew Jeffery55b983e2017-04-19 11:11:26 +0930287 log<level::INFO>("Received signal that host is off");
Andrew Geissler4da7e002017-01-24 15:21:40 -0600288 this->currentHostState(server::Host::HostState::Off);
Dhruvaraj Subhashchandrana3b8d7e2017-08-10 05:40:04 -0500289 this->bootProgress(bootprogress::Progress::ProgressStages::Unspecified);
290 this->operatingSystemState(osstatus::Status::OSStatus::Inactive);
Andrew Geissleref621162016-12-08 12:56:21 -0600291 }
Andrew Geissler969b2612018-03-29 10:16:51 -0700292 else if ((newStateUnit == HOST_STATE_POWERON_MIN_TGT) &&
Andrew Geissler58a18012018-01-19 19:36:05 -0800293 (newStateResult == "done") &&
Andrew Geissler969b2612018-03-29 10:16:51 -0700294 (stateActive(HOST_STATE_POWERON_MIN_TGT)))
Andrew Geissler58a18012018-01-19 19:36:05 -0800295 {
296 log<level::INFO>("Received signal that host is running");
297 this->currentHostState(server::Host::HostState::Running);
Andrew Geissler131d04a2021-03-12 11:02:41 -0600298
299 // Remove temporary file which is utilized for scenarios where the
300 // BMC is rebooted while the host is still up.
301 // This file is used to indicate to host related systemd services
302 // that the host is already running and they should skip running.
303 // Once the host state is back to running we can clear this file.
304 auto size = std::snprintf(nullptr, 0, HOST_RUNNING_FILE, 0);
305 size++; // null
306 std::unique_ptr<char[]> hostFile(new char[size]);
307 std::snprintf(hostFile.get(), size, HOST_RUNNING_FILE, 0);
308 if (std::filesystem::exists(hostFile.get()))
309 {
310 std::filesystem::remove(hostFile.get());
311 }
Andrew Geissler58a18012018-01-19 19:36:05 -0800312 }
313 else if ((newStateUnit == HOST_STATE_QUIESCE_TGT) &&
Josh D. King29d025d2017-04-27 12:40:22 -0500314 (newStateResult == "done") &&
315 (stateActive(HOST_STATE_QUIESCE_TGT)))
Andrew Geissler58a18012018-01-19 19:36:05 -0800316 {
317 if (Host::isAutoReboot())
318 {
319 log<level::INFO>("Beginning reboot...");
320 Host::requestedHostTransition(server::Host::Transition::Reboot);
321 }
322 else
323 {
324 log<level::INFO>("Maintaining quiesce");
325 this->currentHostState(server::Host::HostState::Quiesced);
326 }
327 }
Andrew Geissleref621162016-12-08 12:56:21 -0600328}
329
Andrew Geissler47b96122020-02-11 16:13:13 -0600330void Host::sysStateChangeJobNew(sdbusplus::message::message& msg)
331{
332 uint32_t newStateID{};
333 sdbusplus::message::object_path newStateObjPath;
334 std::string newStateUnit{};
335
336 // Read the msg and populate each variable
337 msg.read(newStateID, newStateObjPath, newStateUnit);
338
339 if (newStateUnit == HOST_STATE_DIAGNOSTIC_MODE)
340 {
341 log<level::INFO>("Received signal that host is in diagnostice mode");
342 this->currentHostState(server::Host::HostState::DiagnosticMode);
343 }
344}
345
Andrew Geissler7b90a622017-08-08 11:41:08 -0500346uint32_t Host::decrementRebootCount()
347{
348 auto rebootCount = reboot::RebootAttempts::attemptsLeft();
Andrew Geissler58a18012018-01-19 19:36:05 -0800349 if (rebootCount > 0)
Andrew Geissler7b90a622017-08-08 11:41:08 -0500350 {
Andrew Geissler58a18012018-01-19 19:36:05 -0800351 return (reboot::RebootAttempts::attemptsLeft(rebootCount - 1));
Andrew Geissler7b90a622017-08-08 11:41:08 -0500352 }
353 return rebootCount;
354}
355
Andrew Geissler033fc3b2017-08-30 15:11:44 -0500356fs::path Host::serialize(const fs::path& dir)
357{
358 std::ofstream os(dir.c_str(), std::ios::binary);
359 cereal::JSONOutputArchive oarchive(os);
360 oarchive(*this);
361 return dir;
362}
363
364bool Host::deserialize(const fs::path& path)
365{
Jayanth Othayothe39f3792017-09-19 23:53:31 -0500366 try
Andrew Geissler033fc3b2017-08-30 15:11:44 -0500367 {
Jayanth Othayothe39f3792017-09-19 23:53:31 -0500368 if (fs::exists(path))
369 {
370 std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
371 cereal::JSONInputArchive iarchive(is);
372 iarchive(*this);
373 return true;
374 }
375 return false;
Andrew Geissler033fc3b2017-08-30 15:11:44 -0500376 }
Andrew Geissler58a18012018-01-19 19:36:05 -0800377 catch (cereal::Exception& e)
Jayanth Othayothe39f3792017-09-19 23:53:31 -0500378 {
379 log<level::ERR>(e.what());
380 fs::remove(path);
381 return false;
382 }
Andrew Geissler033fc3b2017-08-30 15:11:44 -0500383}
384
Andrew Geissleref3c1842016-12-01 12:33:09 -0600385Host::Transition Host::requestedHostTransition(Transition value)
386{
Matt Spinlerbbbc0162020-11-11 14:43:50 -0600387 log<level::INFO>(fmt::format("Host state transition request of {}",
388 convertForMessage(value))
389 .c_str());
Andrew Geissler7b90a622017-08-08 11:41:08 -0500390 // If this is not a power off request then we need to
391 // decrement the reboot counter. This code should
392 // never prevent a power on, it should just decrement
393 // the count to 0. The quiesce handling is where the
394 // check of this count will occur
Andrew Geissler58a18012018-01-19 19:36:05 -0800395 if (value != server::Host::Transition::Off)
Andrew Geissler7b90a622017-08-08 11:41:08 -0500396 {
397 decrementRebootCount();
398 }
399
Andrew Geisslera27a6e82017-07-27 16:44:43 -0500400 executeTransition(value);
Andrew Geissler7b90a622017-08-08 11:41:08 -0500401
Andrew Geissler58a18012018-01-19 19:36:05 -0800402 auto retVal = server::Host::requestedHostTransition(value);
Andrew Geissler033fc3b2017-08-30 15:11:44 -0500403 serialize();
Dhruvaraj Subhashchandran3f475242017-07-12 00:44:27 -0500404 return retVal;
Andrew Geissleref3c1842016-12-01 12:33:09 -0600405}
406
Dhruvaraj Subhashchandran4e6534f2017-09-19 06:13:20 -0500407Host::ProgressStages Host::bootProgress(ProgressStages value)
408{
409 auto retVal = bootprogress::Progress::bootProgress(value);
410 serialize();
411 return retVal;
412}
413
414Host::OSStatus Host::operatingSystemState(OSStatus value)
415{
416 auto retVal = osstatus::Status::operatingSystemState(value);
417 serialize();
418 return retVal;
419}
420
Andrew Geissleref3c1842016-12-01 12:33:09 -0600421Host::HostState Host::currentHostState(HostState value)
422{
Andrew Geissler58a18012018-01-19 19:36:05 -0800423 log<level::INFO>(
Matt Spinlerbbbc0162020-11-11 14:43:50 -0600424 fmt::format("Change to Host State: {}", convertForMessage(value))
425 .c_str());
Andrew Geissleref621162016-12-08 12:56:21 -0600426 return server::Host::currentHostState(value);
Andrew Geissleref3c1842016-12-01 12:33:09 -0600427}
428
Andrew Geissler36529022016-11-29 15:23:54 -0600429} // namespace manager
430} // namespace state
Andrew Geisslera965cf02018-08-31 08:37:05 -0700431} // namespace phosphor