From b1e185141bdd6b25cea10627045d80e457105baf Mon Sep 17 00:00:00 2001 From: Matt Spinler Date: Thu, 27 Apr 2017 14:42:33 -0500 Subject: Add inventory update support Set a fan's Functional property to false when it has been out of spec for too long. When it is back in spec, set it back to functional. Change-Id: I264129479c58fd296df7c3a1d3d42f5d7aa7b60b Signed-off-by: Matt Spinler --- monitor/fan.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- monitor/fan.hpp | 25 ++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/monitor/fan.cpp b/monitor/fan.cpp index d1101b9..639d88e 100644 --- a/monitor/fan.cpp +++ b/monitor/fan.cpp @@ -17,6 +17,7 @@ #include #include "fan.hpp" #include "types.hpp" +#include "utility.hpp" namespace phosphor { @@ -28,6 +29,14 @@ namespace monitor using namespace phosphor::logging; using TimerType = phosphor::fan::util::Timer::TimerType; +constexpr auto INVENTORY_PATH = "/xyz/openbmc_project/inventory"; +constexpr auto INVENTORY_INTF = "xyz.openbmc_project.Inventory.Manager"; + +constexpr auto FUNCTIONAL_PROPERTY = "Functional"; +constexpr auto OPERATIONAL_STATUS_INTF = + "xyz.openbmc_project.State.Decorator.OperationalStatus"; + + Fan::Fan(sdbusplus::bus::bus& bus, std::shared_ptr& events, const FanDefinition& def) : @@ -49,6 +58,9 @@ Fan::Fan(sdbusplus::bus::bus& bus, events)); } + //Start from a known state of functional + updateInventory(true); + //The TachSensors will now have already read the input //and target values, so check them. tachChanged(); @@ -101,7 +113,7 @@ void Fan::tachChanged(TachSensor& sensor) log("Setting a fan back to functional", entry("FAN=%s", _name.c_str())); - //TODO: actually update inventory + updateInventory(true); } } } @@ -171,9 +183,64 @@ void Fan::timerExpired(TachSensor& sensor) //If the fan is currently functional, but too many //contained sensors are now nonfunctional, update //the whole fan nonfunctional. - //TODO + + if (_functional && tooManySensorsNonfunctional()) + { + log("Setting a fan to nonfunctional", + entry("FAN=%s", _name.c_str())); + + updateInventory(false); + } } + +void Fan::updateInventory(bool functional) +{ + ObjectMap objectMap = getObjectMap(functional); + std::string service; + + try + { + service = phosphor::fan::util::getInvService(_bus); + } + catch (const std::runtime_error& err) + { + log(err.what()); + return; + } + + auto msg = _bus.new_method_call(service.c_str(), + INVENTORY_PATH, + INVENTORY_INTF, + "Notify"); + + msg.append(std::move(objectMap)); + auto response = _bus.call(msg); + if (response.is_method_error()) + { + log("Error in Notify call to update inventory"); + return; + } + + //This will always track the current state of the inventory. + _functional = functional; +} + + +Fan::ObjectMap Fan::getObjectMap(bool functional) +{ + ObjectMap objectMap; + InterfaceMap interfaceMap; + PropertyMap propertyMap; + + propertyMap.emplace(FUNCTIONAL_PROPERTY, functional); + interfaceMap.emplace(OPERATIONAL_STATUS_INTF, std::move(propertyMap)); + objectMap.emplace(_name, std::move(interfaceMap)); + + return objectMap; +} + + } } } diff --git a/monitor/fan.hpp b/monitor/fan.hpp index 9aeccd2..910b4eb 100644 --- a/monitor/fan.hpp +++ b/monitor/fan.hpp @@ -45,6 +45,15 @@ namespace monitor */ class Fan { + using Property = std::string; + using Value = sdbusplus::message::variant; + using PropertyMap = std::map; + + using Interface = std::string; + using InterfaceMap = std::map; + + using Object = sdbusplus::message::object_path; + using ObjectMap = std::map; public: @@ -117,6 +126,22 @@ class Fan */ bool tooManySensorsNonfunctional(); + /** + * @brief Updates the Functional property in the inventory + * for the fan based on the value passed in. + * + * @param[in] functional - If the Functional property should + * be set to true or false. + */ + void updateInventory(bool functional); + + /** + * @brief Returns the object map to use when updating the inventory + * + * @param[in] functional - If the Functional property should + * be set to true or false. + */ + ObjectMap getObjectMap(bool functional); /** * @brief the dbus object -- cgit v1.2.1