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