Adding system configuration object & UT
This commit adds the system config object that implements
the SystemConfiguration interface.
The hostname property under this interface will initially
be set from the bios table when the service starts.
Whenever user sets the property, the same will be updated
in the bios table.
busctl tree xyz.openbmc_project.Network.Hypervisor
└─/xyz
└─/xyz/openbmc_project
└─/xyz/openbmc_project/network
└─/xyz/openbmc_project/network/hypervisor
└─/xyz/openbmc_project/network/hypervisor/config
Tested By:
busctl set-property xyz.openbmc_project.Network.Hypervisor
/xyz/openbmc_project/network/hypervisor/config
xyz.openbmc_project.Network.SystemConfiguration HostName s "vmi HN"
busctl introspect xyz.openbmc_project.Network.Hypervisor /xyz/openbmc_project/network/hypervisor/config
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
xyz.openbmc_project.Network.SystemConfiguration interface - - -
.DefaultGateway property s "" emits-change writable
.DefaultGateway6 property s "" emits-change writable
.HostName property s "vmi HN" emits-change writable
busctl call xyz.openbmc_project.BIOSConfigManager /xyz/openbmc_project/bios_config/manager xyz.openbmc_project.BIOSConfig.Manager GetAttribute s vmi_hostname
svv "xyz.openbmc_project.BIOSConfig.Manager.AttributeType.String" s "vmi HN" s ""
Signed-off-by: Asmitha Karunanithi <asmitk01@in.ibm.com>
Change-Id: Ib3afaef2da039d18cc672a1759b721698f9c14e2
diff --git a/src/ibm/hypervisor-network-mgr-src/hyp_sys_config.cpp b/src/ibm/hypervisor-network-mgr-src/hyp_sys_config.cpp
new file mode 100644
index 0000000..29c2660
--- /dev/null
+++ b/src/ibm/hypervisor-network-mgr-src/hyp_sys_config.cpp
@@ -0,0 +1,88 @@
+#include "hyp_sys_config.hpp"
+
+#include "hyp_network_manager.hpp"
+
+#include <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/log.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+namespace phosphor
+{
+namespace network
+{
+
+constexpr auto BIOS_SERVICE = "xyz.openbmc_project.BIOSConfigManager";
+constexpr auto BIOS_OBJPATH = "/xyz/openbmc_project/bios_config/manager";
+constexpr auto BIOS_MGR_INTF = "xyz.openbmc_project.BIOSConfig.Manager";
+
+using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+using InvalidArgumentMetadata = xyz::openbmc_project::Common::InvalidArgument;
+
+using SysConfigIntf =
+ sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration;
+
+void HypSysConfig::setHostName()
+{
+ auto name = getHostNameFromBios();
+
+ SysConfigIntf::hostName(std::move(name));
+}
+
+std::string HypSysConfig::hostName(std::string name)
+{
+ if (SysConfigIntf::hostName() == name)
+ {
+ return name;
+ }
+
+ name = SysConfigIntf::hostName(name);
+ setHostNameInBios(name);
+ return name;
+}
+
+std::string HypSysConfig::getHostNameFromBios() const
+{
+ try
+ {
+ using getAttrRetType =
+ std::tuple<std::string, std::variant<std::string, int64_t>,
+ std::variant<std::string, int64_t>>;
+ getAttrRetType name;
+ auto method = bus.new_method_call(BIOS_SERVICE, BIOS_OBJPATH,
+ BIOS_MGR_INTF, "GetAttribute");
+
+ method.append("vmi_hostname");
+
+ auto reply = bus.call(method);
+
+ std::string type;
+ std::variant<std::string, int64_t> currValue;
+ std::variant<std::string, int64_t> defValue;
+ reply.read(type, currValue, defValue);
+ return std::get<std::string>(currValue);
+ }
+ catch (const sdbusplus::exception::SdBusError& ex)
+ {
+ log<level::ERR>("Failed to get the hostname from bios table",
+ entry("ERR=%s", ex.what()));
+ }
+ return std::string();
+}
+
+void HypSysConfig::setHostNameInBios(const std::string& name)
+{
+ auto properties = bus.new_method_call(BIOS_SERVICE, BIOS_OBJPATH,
+ BIOS_MGR_INTF, "SetAttribute");
+ properties.append("vmi_hostname");
+ properties.append(std::variant<std::string>(name));
+ auto result = bus.call(properties);
+
+ if (result.is_method_error())
+ {
+ throw std::runtime_error("Set attribute api failed");
+ }
+}
+
+} // namespace network
+} // namespace phosphor