network_manager: Add support for non-disruptive reconfiguration
This makes it possible for network interfaces to non-disruptively reload
configurations and tell systemd-networkd to reconfigure interaces.
Change-Id: Ia4003854b6fe845a67b954068ec363bc4c622837
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index 4ff9e17..ab8a636 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -26,6 +26,10 @@
constexpr char SYSTEMD_INTERFACE[] = "org.freedesktop.systemd1.Manager";
constexpr auto FirstBootFile = "/var/lib/network/firstBoot_";
+constexpr char NETWORKD_BUSNAME[] = "org.freedesktop.network1";
+constexpr char NETWORKD_PATH[] = "/org/freedesktop/network1";
+constexpr char NETWORKD_INTERFACE[] = "org.freedesktop.network1.Manager";
+
namespace phosphor
{
namespace network
@@ -294,5 +298,21 @@
}
}
+void Manager::reloadConfigs()
+{
+ try
+ {
+ auto method = bus.new_method_call(NETWORKD_BUSNAME, NETWORKD_PATH,
+ NETWORKD_INTERFACE, "Reload");
+ bus.call_noreply(method);
+ }
+ catch (const sdbusplus::exception::exception& ex)
+ {
+ log<level::ERR>("Failed to reload configuration",
+ entry("ERR=%s", ex.what()));
+ elog<InternalFailure>();
+ }
+}
+
} // namespace network
} // namespace phosphor
diff --git a/src/network_manager.hpp b/src/network_manager.hpp
index 12b3d7d..ceb62c4 100644
--- a/src/network_manager.hpp
+++ b/src/network_manager.hpp
@@ -132,6 +132,10 @@
*/
virtual void restartSystemdUnit(const std::string& unit);
+ /** @brief Tell systemd-network to reload all of the network configurations
+ */
+ virtual void reloadConfigs();
+
/** @brief Returns the number of interfaces under this manager.
*
* @return the number of interfaces managed by this manager.
diff --git a/test/mock_network_manager.hpp b/test/mock_network_manager.hpp
index 1fc3f9b..9e27c9c 100644
--- a/test/mock_network_manager.hpp
+++ b/test/mock_network_manager.hpp
@@ -46,6 +46,7 @@
}
}
MOCK_METHOD1(restartSystemdUnit, void(const std::string& service));
+ MOCK_METHOD(void, reloadConfigs, (), (override));
};
} // namespace network