m/n/c/network: improve restartability

Deletes all newly-added interfaces as well as sets all reconfigured
interfaces to down if an error occurs in an effort to improve
restartability.

Change-Id: I715514c7f6b7a6f45a1c66333fd540556be2b29b
Reviewed-on: https://review.monogon.dev/c/monogon/+/1808
Tested-by: Jenkins CI
Reviewed-by: Tim Windelschmidt <tim@monogon.tech>
diff --git a/metropolis/node/core/network/static.go b/metropolis/node/core/network/static.go
index a9a5176..ffecf7d 100644
--- a/metropolis/node/core/network/static.go
+++ b/metropolis/node/core/network/static.go
@@ -31,6 +31,7 @@
 
 func (s *Service) runStaticConfig(ctx context.Context) error {
 	l := supervisor.Logger(ctx)
+	var success bool
 	sortedInterfaces, err := getSortedIfaces(s)
 	if err != nil {
 		return err
@@ -95,10 +96,24 @@
 			if err := netlink.LinkAdd(newLink); err != nil {
 				return fmt.Errorf("failed to add link %q: %w", i.Name, err)
 			}
+			defer func() {
+				if !success {
+					if err := netlink.LinkDel(newLink); err != nil {
+						l.Errorf("Failed to delete link on teardown: %v", err)
+					}
+				}
+			}()
 		} else {
 			if err := netlink.LinkModify(newLink); err != nil {
 				return fmt.Errorf("failed to modify link %q: %w", i.Name, err)
 			}
+			defer func() {
+				if !success {
+					if err := netlink.LinkSetDown(newLink); err != nil {
+						l.Errorf("Failed to set link down: %v", err)
+					}
+				}
+			}()
 		}
 		nameLinkMap[i.Name] = newLink
 		if i.Ipv4Autoconfig != nil {
@@ -166,6 +181,7 @@
 	}
 
 	supervisor.Signal(ctx, supervisor.SignalHealthy)
+	success = true
 	supervisor.Signal(ctx, supervisor.SignalDone)
 	return nil
 }