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