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
}