summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYong Li <yong.b.li@linux.intel.com>2019-09-30 09:13:04 +0300
committerYong Li <yong.b.li@intel.com>2019-10-25 03:48:47 +0300
commit51709ffd22973ca2212f221e80e72984627c80c1 (patch)
treefa8e06d1151ea3769073cd2ebd37b07cff95fd58
parent5bc2dc8e385484539fa9b636c0a53dabcd0b2b2c (diff)
downloadbmcweb-51709ffd22973ca2212f221e80e72984627c80c1.tar.xz
Add HostWatchdogTimer attribute in redfish
Add HostWatchdogTimer attribute in redfish Based on redfish spec, add HostWatchdogTimer property in redfish/v1/Systems/system. This object describes the Host Watchdog Timer functionality, including FunctionEnabled, Status and TimeoutActionproperties: "HostWatchdogTimer": { "FunctionEnabled": false, "Status": { "State": "Enabled" }, "TimeoutAction": "None" } Tested: Validator checking for HostWatchdogTimer in below test cases: Set different timeout actions reset|poweroff|cycle|none: ipmitool mc watchdog set action=reset timeout=1000 int=msg use=oem Start watchdog: ipmitool mc watchdog reset ComputerSystem.v1_5_0.ComputerSystem:HostWatchdogTimer value: OrderedDict([('FunctionEnabled', False), ('Status', OrderedDict([('State', 'Enabled')])), ('TimeoutAction', 'None')]) <class 'collections.OrderedDict'> has Type: ComputerSystem.v1_5_0.WatchdogTimer complex is Optional ***going into Complex ComputerSystem.v1_5_0.WatchdogTimer:FunctionEnabled value: False <class 'bool'> has Type: Edm.Boolean Edm.Boolean Mandatory Test: OK permission OData.Permission/ReadWrite Success ComputerSystem.v1_5_0.WatchdogTimer:WarningAction value: n/a <class 'str'> has Type: ComputerSystem.v1_5_0.WatchdogWarningActions enum is Optional prop Does not exist, skip... ComputerSystem.v1_5_0.WatchdogTimer:TimeoutAction value: None <class 'str'> has Type: ComputerSystem.v1_5_0.WatchdogTimeoutActions enum Mandatory Test: OK permission OData.Permission/ReadWrite Success ComputerSystem.v1_5_0.WatchdogTimer:Status value: OrderedDict([('State', 'Enabled')]) <class 'collections.OrderedDict'> has Type: Resource.Status complex is Optional ***going into Complex Resource.Status:State value: Enabled <class 'str'> has Type: Resource.State enum is Optional permission OData.Permission/Read Success HostWatchdogTimer.FunctionEnabled PASS HostWatchdogTimer.WarningAction Optional HostWatchdogTimer.TimeoutAction PASS HostWatchdogTimer.Status complex HostWatchdogTimer.Status.State PASS Watchdog service is stopped, no such property in redfish Change-Id: I883e4b739a3fe525080ed486d2ca8e461fddf212 Signed-off-by: Yong Li <yong.b.li@linux.intel.com>
-rw-r--r--redfish-core/lib/systems.hpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index b91296f18b..145537b52e 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -1158,6 +1158,106 @@ static void setBootProperties(std::shared_ptr<AsyncResp> aResp,
}
/**
+ * @brief Translates watchdog timeout action DBUS property value to redfish.
+ *
+ * @param[in] dbusAction The watchdog timeout action in D-BUS.
+ *
+ * @return Returns as a string, the timeout action in Redfish terms. If
+ * translation cannot be done, returns an empty string.
+ */
+static std::string dbusToRfWatchdogAction(const std::string &dbusAction)
+{
+ if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.None")
+ {
+ return "None";
+ }
+ else if (dbusAction ==
+ "xyz.openbmc_project.State.Watchdog.Action.HardReset")
+ {
+ return "ResetSystem";
+ }
+ else if (dbusAction == "xyz.openbmc_project.State.Watchdog.Action.PowerOff")
+ {
+ return "PowerDown";
+ }
+ else if (dbusAction ==
+ "xyz.openbmc_project.State.Watchdog.Action.PowerCycle")
+ {
+ return "PowerCycle";
+ }
+
+ return "";
+}
+
+/**
+ * @brief Retrieves host watchdog timer properties over DBUS
+ *
+ * @param[in] aResp Shared pointer for completing asynchronous calls.
+ *
+ * @return None.
+ */
+void getHostWatchdogTimer(std::shared_ptr<AsyncResp> aResp)
+{
+ BMCWEB_LOG_DEBUG << "Get host watchodg";
+ crow::connections::systemBus->async_method_call(
+ [aResp](const boost::system::error_code ec,
+ PropertiesType &properties) {
+ if (ec)
+ {
+ // watchdog service is stopped
+ BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
+ return;
+ }
+
+ BMCWEB_LOG_DEBUG << "Got " << properties.size() << " wdt prop.";
+
+ nlohmann::json &hostWatchdogTimer =
+ aResp->res.jsonValue["HostWatchdogTimer"];
+
+ // watchdog service is running/enabled
+ hostWatchdogTimer["Status"]["State"] = "Enabled";
+
+ for (const auto &property : properties)
+ {
+ BMCWEB_LOG_DEBUG << "prop=" << property.first;
+ if (property.first == "Enabled")
+ {
+ const bool *state = std::get_if<bool>(&property.second);
+
+ if (!state)
+ {
+ messages::internalError(aResp->res);
+ continue;
+ }
+
+ hostWatchdogTimer["FunctionEnabled"] = *state;
+ }
+ else if (property.first == "ExpireAction")
+ {
+ const std::string *s =
+ std::get_if<std::string>(&property.second);
+ if (!s)
+ {
+ messages::internalError(aResp->res);
+ continue;
+ }
+
+ std::string action = dbusToRfWatchdogAction(*s);
+ if (action.empty())
+ {
+ messages::internalError(aResp->res);
+ continue;
+ }
+ hostWatchdogTimer["TimeoutAction"] = action;
+ }
+ }
+ },
+ "xyz.openbmc_project.Watchdog", "/xyz/openbmc_project/watchdog/host0",
+ "org.freedesktop.DBus.Properties", "GetAll",
+ "xyz.openbmc_project.State.Watchdog");
+}
+
+/**
* SystemsCollection derived class for delivering ComputerSystems Collection
* Schema
*/
@@ -1472,6 +1572,7 @@ class Systems : public Node
getHostState(asyncResp);
getBootProperties(asyncResp);
getPCIeDeviceList(asyncResp);
+ getHostWatchdogTimer(asyncResp);
}
void doPatch(crow::Response &res, const crow::Request &req,