host-bmc: Implement Availability interface
Adding support to host Availability dbus interface. PLDM hosts this dbus
interface to provide the availability of the FRUs hosted by PLDM. The
Availability interface is defined at [1].
Tested:
Functional test passed
[1]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/State/Decorator/Availability.interface.yaml
Change-Id: Ie5912b3683ce102a249c8b503ea9f455f0fbcabf
Signed-off-by: Archana Kakani <archana.kakani@ibm.com>
diff --git a/host-bmc/dbus/availability.cpp b/host-bmc/dbus/availability.cpp
new file mode 100644
index 0000000..c4f10e1
--- /dev/null
+++ b/host-bmc/dbus/availability.cpp
@@ -0,0 +1,21 @@
+#include "availability.hpp"
+
+namespace pldm
+{
+namespace dbus
+{
+
+bool Availability::available() const
+{
+ return sdbusplus::xyz::openbmc_project::State::Decorator::server::
+ Availability::available();
+}
+
+bool Availability::available(bool value)
+{
+ return sdbusplus::xyz::openbmc_project::State::Decorator::server::
+ Availability::available(value);
+}
+
+} // namespace dbus
+} // namespace pldm
diff --git a/host-bmc/dbus/availability.hpp b/host-bmc/dbus/availability.hpp
new file mode 100644
index 0000000..5788f70
--- /dev/null
+++ b/host-bmc/dbus/availability.hpp
@@ -0,0 +1,42 @@
+#pragma once
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server.hpp>
+#include <sdbusplus/server/object.hpp>
+#include <xyz/openbmc_project/State/Decorator/Availability/server.hpp>
+
+#include <string>
+
+namespace pldm
+{
+namespace dbus
+{
+using AvailabilityIntf = sdbusplus::server::object_t<
+ sdbusplus::xyz::openbmc_project::State::Decorator::server::Availability>;
+
+class Availability : public AvailabilityIntf
+{
+ public:
+ Availability() = delete;
+ ~Availability() = default;
+ Availability(const Availability&) = delete;
+ Availability& operator=(const Availability&) = delete;
+ Availability(Availability&&) = delete;
+ Availability& operator=(Availability&&) = delete;
+
+ Availability(sdbusplus::bus_t& bus, const std::string& objPath) :
+ AvailabilityIntf(bus, objPath.c_str()), path(objPath)
+ {}
+
+ /** Get value of Available */
+ bool available() const override;
+
+ /** Set value of Available */
+ bool available(bool value) override;
+
+ private:
+ std::string path;
+};
+
+} // namespace dbus
+} // namespace pldm
diff --git a/host-bmc/dbus/custom_dbus.cpp b/host-bmc/dbus/custom_dbus.cpp
index f5dd592..f4581d8 100644
--- a/host-bmc/dbus/custom_dbus.cpp
+++ b/host-bmc/dbus/custom_dbus.cpp
@@ -166,5 +166,18 @@
}
}
+void CustomDBus::setAvailabilityState(const std::string& path,
+ const bool& state)
+{
+ if (!availabilityState.contains(path))
+ {
+ availabilityState.emplace(
+ path, std::make_unique<Availability>(
+ pldm::utils::DBusHandler::getBus(), path.c_str()));
+ }
+
+ availabilityState.at(path)->available(state);
+}
+
} // namespace dbus
} // namespace pldm
diff --git a/host-bmc/dbus/custom_dbus.hpp b/host-bmc/dbus/custom_dbus.hpp
index 7988bd9..281f928 100644
--- a/host-bmc/dbus/custom_dbus.hpp
+++ b/host-bmc/dbus/custom_dbus.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "asset.hpp"
+#include "availability.hpp"
#include "cable.hpp"
#include "chassis.hpp"
#include "common/utils.hpp"
@@ -165,8 +166,18 @@
*/
void implementAssetInterface(const std::string& path);
+ /** @brief Set the availability state property
+ *
+ * @param[in] path - The object path
+ *
+ * @param[in] state - Availability state
+ */
+ void setAvailabilityState(const std::string& path, const bool& state);
+
private:
std::unordered_map<ObjectPath, std::unique_ptr<Asset>> asset;
+ std::unordered_map<ObjectPath, std::unique_ptr<Availability>>
+ availabilityState;
std::unordered_map<ObjectPath, std::unique_ptr<LocationIntf>> location;
std::unordered_map<ObjectPath, std::unique_ptr<CPUCore>> cpuCore;
std::unordered_map<ObjectPath, std::unique_ptr<ItemChassis>> chassis;