func (n *Network) Init(iface *net.Interface, iaddr net.IP, eaddr net.IP) *backend.SubnetDef { var be backend.Backend var sn *backend.SubnetDef steps := []func() error{ func() (err error) { n.Config, err = n.sm.GetNetworkConfig(n.ctx, n.Name) if err != nil { log.Error("Failed to retrieve network config: ", err) } return }, func() (err error) { be, err = newBackend(n.sm, n.Config.BackendType, iface, iaddr, eaddr) if err != nil { log.Errorf("Failed to create and initialize network %v (type %v): %v", n.Name, n.Config.BackendType, err) } else { n.be = be } return }, func() (err error) { sn, err = be.RegisterNetwork(n.ctx, n.Name, n.Config) if err != nil { log.Errorf("Failed register network %v (type %v): %v", n.Name, n.Config.BackendType, err) } else { n.lease = sn.Lease } return }, func() (err error) { if n.ipMasq { flannelNet := n.Config.Network if err = setupIPMasq(flannelNet); err != nil { log.Errorf("Failed to set up IP Masquerade for network %v: %v", n.Name, err) } } return }, } for _, s := range steps { for { if err := s(); err == nil { break } select { case <-time.After(time.Second): case <-n.ctx.Done(): return nil } } } return sn }