diff options
| author | Yong Li <yong.b.li@linux.intel.com> | 2019-10-10 14:19:01 +0800 |
|---|---|---|
| committer | Yong Li <yong.b.li@intel.com> | 2019-10-25 00:49:01 +0000 |
| commit | c45f00821add8cd29cbd148d4b4b9f6e988665cf (patch) | |
| tree | 7e49c27091f46f714df8b26e926b7e0122ffdaf4 | |
| parent | 51709ffd22973ca2212f221e80e72984627c80c1 (diff) | |
| download | bmcweb-c45f00821add8cd29cbd148d4b4b9f6e988665cf.tar.gz bmcweb-c45f00821add8cd29cbd148d4b4b9f6e988665cf.zip | |
Support PATCH for HostWatchDogTimer in redfish
This commit adds support for SET DBUS properties "Enabled"
and "ExpireAction" for WatchDogTimer in the Redfish ComputerSystems schema.
FunctionEnabled values can be false/true .
TimeoutAction values can be "None","PowerCycle","PowerDown","ResetSystem".
Tested:
Modify the watchdog properties:
curl --noproxy $BMCIP -k -H "Content-Type: application/json" -X PATCH \
https://root:0penBmc@$BMCIP/redfish/v1/Systems/system -d \
'{"WatchdogTimer":{"FunctionEnabled": false,"TimeoutAction": "PowerCycle"}}'
Check them:
curl --noproxy $BMCIP -k -H "Content-Type: application/json" -X GET \
https://root:0penBmc@$BMCIP/redfish/v1/Systems/system
ipmitool mc watchdog get
Signed-off-by: Yong Li <yong.b.li@linux.intel.com>
Change-Id: Ie41232a56b3d0a62be76ae27d6ded8920f7b9407
| -rw-r--r-- | redfish-core/lib/systems.hpp | 114 |
1 files changed, 113 insertions, 1 deletions
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp index 145537b..0e2e52d 100644 --- a/redfish-core/lib/systems.hpp +++ b/redfish-core/lib/systems.hpp @@ -1190,6 +1190,37 @@ static std::string dbusToRfWatchdogAction(const std::string &dbusAction) } /** + *@brief Translates timeout action from Redfish to DBUS property value. + * + *@param[in] rfAction The timeout action in Redfish. + * + *@return Returns as a string, the time_out action as expected by DBUS. + *If translation cannot be done, returns an empty string. + */ + +static std::string rfToDbusWDTTimeOutAct(const std::string &rfAction) +{ + if (rfAction == "None") + { + return "xyz.openbmc_project.State.Watchdog.Action.None"; + } + else if (rfAction == "PowerCycle") + { + return "xyz.openbmc_project.State.Watchdog.Action.PowerCycle"; + } + else if (rfAction == "PowerDown") + { + return "xyz.openbmc_project.State.Watchdog.Action.PowerOff"; + } + else if (rfAction == "ResetSystem") + { + return "xyz.openbmc_project.State.Watchdog.Action.HardReset"; + } + + return ""; +} + +/** * @brief Retrieves host watchdog timer properties over DBUS * * @param[in] aResp Shared pointer for completing asynchronous calls. @@ -1258,6 +1289,70 @@ void getHostWatchdogTimer(std::shared_ptr<AsyncResp> aResp) } /** + * @brief Sets Host WatchDog Timer properties. + * + * @param[in] aResp Shared pointer for generating response message. + * @param[in] wdtEnable The WDTimer Enable value (true/false) from incoming + * RF request. + * @param[in] wdtTimeOutAction The WDT Timeout action, from incoming RF request. + * + * @return None. + */ +static void setWDTProperties(std::shared_ptr<AsyncResp> aResp, + const std::optional<bool> wdtEnable, + const std::optional<std::string> &wdtTimeOutAction) +{ + BMCWEB_LOG_DEBUG << "Set host watchdog"; + + if (wdtTimeOutAction) + { + std::string wdtTimeOutActStr = rfToDbusWDTTimeOutAct(*wdtTimeOutAction); + // check if TimeOut Action is Valid + if (wdtTimeOutActStr.empty()) + { + BMCWEB_LOG_DEBUG << "Unsupported value for TimeoutAction: " + << *wdtTimeOutAction; + messages::propertyValueNotInList(aResp->res, *wdtTimeOutAction, + "TimeoutAction"); + return; + } + + crow::connections::systemBus->async_method_call( + [aResp](const boost::system::error_code ec) { + if (ec) + { + BMCWEB_LOG_DEBUG << "DBUS response error " << ec; + messages::internalError(aResp->res); + return; + } + }, + "xyz.openbmc_project.Watchdog", + "/xyz/openbmc_project/watchdog/host0", + "org.freedesktop.DBus.Properties", "Set", + "xyz.openbmc_project.State.Watchdog", "ExpireAction", + std::variant<std::string>(wdtTimeOutActStr)); + } + + if (wdtEnable) + { + crow::connections::systemBus->async_method_call( + [aResp](const boost::system::error_code ec) { + if (ec) + { + BMCWEB_LOG_DEBUG << "DBUS response error " << ec; + messages::internalError(aResp->res); + return; + } + }, + "xyz.openbmc_project.Watchdog", + "/xyz/openbmc_project/watchdog/host0", + "org.freedesktop.DBus.Properties", "Set", + "xyz.openbmc_project.State.Watchdog", "Enabled", + std::variant<bool>(*wdtEnable)); + } +} + +/** * SystemsCollection derived class for delivering ComputerSystems Collection * Schema */ @@ -1580,15 +1675,32 @@ class Systems : public Node { std::optional<std::string> indicatorLed; std::optional<nlohmann::json> bootProps; + std::optional<nlohmann::json> wdtTimerProps; auto asyncResp = std::make_shared<AsyncResp>(res); if (!json_util::readJson(req, res, "IndicatorLED", indicatorLed, "Boot", - bootProps)) + bootProps, "WatchdogTimer", wdtTimerProps)) { return; } res.result(boost::beast::http::status::no_content); + + if (wdtTimerProps) + { + std::optional<bool> wdtEnable; + std::optional<std::string> wdtTimeOutAction; + + if (!json_util::readJson(*wdtTimerProps, asyncResp->res, + "FunctionEnabled", wdtEnable, + "TimeoutAction", wdtTimeOutAction)) + { + return; + } + setWDTProperties(asyncResp, std::move(wdtEnable), + std::move(wdtTimeOutAction)); + } + if (bootProps) { std::optional<std::string> bootSource; |

