summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Tritz <mtritz@us.ibm.com>2017-02-06 16:01:23 -0600
committerPatrick Williams <patrick@stwcx.xyz>2017-02-20 17:18:47 +0000
commit206a833b2c0708f4e77c8b4ff4dc39075f53d651 (patch)
tree940b42cb534f2ab4a8d8b3c3b34580b11f6ef2ad
parentd3e58474dad16a9e215df1687f72dd9f80f0c231 (diff)
downloadphosphor-state-manager-206a833b2c0708f4e77c8b4ff4dc39075f53d651.tar.gz
phosphor-state-manager-206a833b2c0708f4e77c8b4ff4dc39075f53d651.zip
State manager auto-reboot logic for quiesce state
These changes will add logic to state manager so that, when the system reaches quiesce state, it will either reboot or not, per the user preference. Change-Id: I72952cd9528620fabeb499109e3790298fdd976b Signed-off-by: Michael Tritz <mtritz@us.ibm.com>
-rw-r--r--host_state_manager.cpp84
-rw-r--r--host_state_manager.hpp8
2 files changed, 92 insertions, 0 deletions
diff --git a/host_state_manager.cpp b/host_state_manager.cpp
index 497908a..7925b87 100644
--- a/host_state_manager.cpp
+++ b/host_state_manager.cpp
@@ -2,6 +2,7 @@
#include <map>
#include <string>
#include <systemd/sd-bus.h>
+#include <sdbusplus/server.hpp>
#include <log.hpp>
#include "host_state_manager.hpp"
@@ -19,6 +20,7 @@ using namespace phosphor::logging;
constexpr auto HOST_STATE_POWEROFF_TGT = "obmc-chassis-stop@0.target";
constexpr auto HOST_STATE_POWERON_TGT = "obmc-chassis-start@0.target";
+constexpr auto HOST_STATE_QUIESCE_TGT = "obmc-quiesce-host@0.target";
/* Map a transition to it's systemd target */
const std::map<server::Host::Transition,std::string> SYSTEMD_TARGET_TABLE =
@@ -35,6 +37,10 @@ constexpr auto SYSTEM_SERVICE = "org.openbmc.managers.System";
constexpr auto SYSTEM_OBJ_PATH = "/org/openbmc/managers/System";
constexpr auto SYSTEM_INTERFACE = SYSTEM_SERVICE;
+constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
+constexpr auto MAPPER_PATH = "/xyz/openbmc_project/ObjectMapper";
+constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
+
/* Map a system state to the HostState */
const std::map<std::string, server::Host::HostState> SYS_HOST_STATE_TABLE = {
{"HOST_BOOTING", server::Host::HostState::Running},
@@ -108,6 +114,70 @@ void Host::executeTransition(Transition tranReq)
return;
}
+bool Host::isAutoReboot()
+{
+ sdbusplus::message::variant<std::string> autoRebootParam;
+ std::string strParam;
+
+ std::string HOST_PATH("/org/openbmc/settings/host0");
+ std::string HOST_INTERFACE("org.openbmc.settings.Host");
+
+ auto mapper = this->bus.new_method_call(MAPPER_BUSNAME,
+ MAPPER_PATH,
+ MAPPER_INTERFACE,
+ "GetObject");
+
+ mapper.append(HOST_PATH, std::vector<std::string>({HOST_INTERFACE}));
+ auto mapperResponseMsg = this->bus.call(mapper);
+
+ if (mapperResponseMsg.is_method_error())
+ {
+ log<level::ERR>("Error in mapper call");
+ return false;
+ }
+
+ std::map<std::string, std::vector<std::string>> mapperResponse;
+ mapperResponseMsg.read(mapperResponse);
+ if (mapperResponse.empty())
+ {
+ log<level::ERR>("Error reading mapper response");
+ return false;
+ }
+
+ const auto& host = mapperResponse.begin()->first;
+
+ auto method = this->bus.new_method_call(host.c_str(),
+ HOST_PATH.c_str(),
+ "org.freedesktop.DBus.Properties",
+ "Get");
+
+ method.append(HOST_INTERFACE.c_str(), "auto_reboot");
+ auto reply = this->bus.call(method);
+
+ if (reply.is_method_error())
+ {
+ log<level::ERR>("Error in auto_reboot Get");
+ return false;
+ }
+
+ reply.read(autoRebootParam);
+ strParam =
+ sdbusplus::message::variant_ns::get<std::string>(autoRebootParam);
+
+ if (strParam.empty())
+ {
+ log<level::ERR>("Error reading auto_reboot response");
+ return false;
+ }
+
+ if (strParam == "yes")
+ {
+ return true;
+ }
+
+ return false;
+}
+
int Host::sysStateChangeSignal(sd_bus_message *msg, void *userData,
sd_bus_error *retError)
{
@@ -146,6 +216,20 @@ int Host::sysStateChange(sd_bus_message* msg,
log<level::INFO>("Recieved signal that host is running");
this->currentHostState(server::Host::HostState::Running);
}
+ else if((newStateUnit == HOST_STATE_QUIESCE_TGT) &&
+ (newStateResult == "done"))
+ {
+ if (Host::isAutoReboot())
+ {
+ log<level::INFO>("Auto reboot enabled. Beginning reboot...");
+ Host::requestedHostTransition(server::Host::Transition::Reboot);
+ }
+ else
+ {
+ log<level::INFO>("Auto reboot disabled. Maintaining quiesce.");
+ }
+
+ }
return 0;
}
diff --git a/host_state_manager.hpp b/host_state_manager.hpp
index 597efa5..4678746 100644
--- a/host_state_manager.hpp
+++ b/host_state_manager.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include <string>
#include <sdbusplus/bus.hpp>
#include "xyz/openbmc_project/State/Host/server.hpp"
@@ -86,6 +87,13 @@ class Host : public sdbusplus::server::object::object<
*/
void executeTransition(Transition tranReq);
+ /**
+ * @brief Determine if auto reboot flag is set
+ *
+ * @return boolean corresponding to current auto_reboot setting
+ **/
+ bool isAutoReboot();
+
/** @brief Callback function on systemd state changes
*
* Will just do a call into the appropriate object for processing
OpenPOWER on IntegriCloud