Call new chassis power targets during on/off requests
New targets were introduced recently to support just the
power on and off of the chassis (no boot of host). This
code change makes use of these new targets.
Change-Id: Ibf942a9ed27ccc982a36cd755afdf6171cb5c0a6
Signed-off-by: Andrew Geissler <andrewg@us.ibm.com>
diff --git a/chassis_state_manager.cpp b/chassis_state_manager.cpp
index a2b6dbf..fb0c2a3 100644
--- a/chassis_state_manager.cpp
+++ b/chassis_state_manager.cpp
@@ -13,6 +13,17 @@
using namespace phosphor::logging;
+/* Map a transition to it's systemd target */
+const std::map<server::Chassis::Transition,std::string> SYSTEMD_TARGET_TABLE =
+{
+ {server::Chassis::Transition::Off, "obmc-power-chassis-off@0.target"},
+ {server::Chassis::Transition::On, "obmc-power-chassis-on@0.target"}
+};
+
+constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
+constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1";
+constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
+
/* TODO:Issue 774 - Use systemd target signals to control chassis state */
int Chassis::handlePgoodOn(sd_bus_message* /*msg*/, void* usrData,
sd_bus_error* retError)
@@ -73,12 +84,30 @@
return;
}
+void Chassis::executeTransition(Transition tranReq)
+{
+ auto sysdTarget = SYSTEMD_TARGET_TABLE.find(tranReq)->second;
+
+ auto method = this->bus.new_method_call(SYSTEMD_SERVICE,
+ SYSTEMD_OBJ_PATH,
+ SYSTEMD_INTERFACE,
+ "StartUnit");
+
+ method.append(sysdTarget);
+ method.append("replace");
+
+ this->bus.call_noreply(method);
+
+ return;
+}
+
Chassis::Transition Chassis::requestedPowerTransition(Transition value)
{
log<level::INFO>("Change to Chassis Requested Power State",
entry("CHASSIS_REQUESTED_POWER_STATE=%s",
convertForMessage(value).c_str()));
+ executeTransition(value);
return server::Chassis::requestedPowerTransition(value);
}
diff --git a/chassis_state_manager.hpp b/chassis_state_manager.hpp
index 16456bf..181d75c 100644
--- a/chassis_state_manager.hpp
+++ b/chassis_state_manager.hpp
@@ -61,6 +61,15 @@
PowerState currentPowerState(PowerState value) override;
private:
+ /** @brief Execute the transition request
+ *
+ * This function calls the appropriate systemd target for the input
+ * transition.
+ *
+ * @param[in] tranReq - Transition requested
+ */
+ void executeTransition(Transition tranReq);
+
/** @brief Callback function for pgood going to on state
*
* Update chassis object state to reflect pgood going to on state