ethernet_interface: Fix VLAN delete

This ensures that we delete the interface in the correct order with
reloads.

Change-Id: I6fec890b112b62be15256af415a6df1bfb6ccd38
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/ethernet_interface.cpp b/src/ethernet_interface.cpp
index 2e42e7f..2e1e252 100644
--- a/src/ethernet_interface.cpp
+++ b/src/ethernet_interface.cpp
@@ -888,6 +888,14 @@
     std::filesystem::remove(config::pathForIntfConf(confDir, intf), ec);
     std::filesystem::remove(config::pathForIntfDev(confDir, intf), ec);
 
+    if (eth.ifIdx > 0)
+    {
+        eth.manager.interfacesByIdx.erase(eth.ifIdx);
+    }
+    auto it = eth.manager.interfaces.find(intf);
+    auto obj = std::move(it->second);
+    eth.manager.interfaces.erase(it);
+
     // Write an updated parent interface since it has a VLAN entry
     for (const auto& [_, intf] : eth.manager.interfaces)
     {
@@ -900,11 +908,14 @@
     if (eth.ifIdx > 0)
     {
         // We need to forcibly delete the interface as systemd does not
-        system::deleteIntf(eth.ifIdx);
+        eth.manager.addReloadPostHook(
+            [idx = eth.ifIdx]() { system::deleteIntf(idx); });
 
-        eth.manager.interfacesByIdx.erase(eth.ifIdx);
+        // Ignore the interface so the reload doesn't re-query it
+        eth.manager.ignoredIntf.emplace(eth.ifIdx);
     }
-    eth.manager.interfaces.erase(intf);
+
+    eth.manager.reloadConfigs();
 }
 
 } // namespace network
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index 2d0f506..30af9a6 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -119,6 +119,10 @@
 
 void Manager::createInterface(const AllIntfInfo& info, bool enabled)
 {
+    if (ignoredIntf.find(info.intf.idx) != ignoredIntf.end())
+    {
+        return;
+    }
     if (auto it = interfacesByIdx.find(info.intf.idx);
         it != interfacesByIdx.end())
     {
diff --git a/src/network_manager.hpp b/src/network_manager.hpp
index 146da33..27ac8ae 100644
--- a/src/network_manager.hpp
+++ b/src/network_manager.hpp
@@ -117,6 +117,7 @@
      */
     string_umap<std::unique_ptr<EthernetInterface>> interfaces;
     std::unordered_map<unsigned, EthernetInterface*> interfacesByIdx;
+    std::unordered_set<unsigned> ignoredIntf;
 
     /** @brief Adds a hook that runs immediately prior to reloading
      *
@@ -152,7 +153,6 @@
 
     /** @brief Map of interface info for undiscovered interfaces */
     std::unordered_map<unsigned, AllIntfInfo> intfInfo;
-    std::unordered_set<unsigned> ignoredIntf;
 
     /** @brief Map of enabled interfaces */
     std::unordered_map<unsigned, bool> systemdNetworkdEnabled;