func (n *Network) Init(ctx context.Context, iface *net.Interface, ipaddr net.IP) *backend.SubnetDef { var cfg *subnet.Config var be backend.Backend var sn *backend.SubnetDef steps := []func() error{ func() (err error) { cfg, err = n.sm.GetNetworkConfig(ctx, n.Name) if err != nil { log.Error("Failed to retrieve network config: ", err) } return }, func() (err error) { be, err = newBackend(n.sm, n.Name, cfg) if err != nil { log.Error("Failed to create backend: ", err) } else { n.be = be } return }, func() (err error) { sn, err = be.Init(iface, ipaddr) if err != nil { log.Errorf("Failed to initialize network %v (type %v): %v", n.Name, be.Name(), err) } return }, func() (err error) { if n.ipMasq { flannelNet := cfg.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 ; ; time.Sleep(time.Second) { select { case <-ctx.Done(): return nil default: } err := s() if err == nil { break } } } return sn }
func run(be backend.Backend, exit chan int) { var err error defer func() { if err == nil || err == task.ErrCanceled { exit <- 0 } else { log.Error(err) exit <- 1 } }() iface, ipaddr, err := lookupIface() if err != nil { return } if iface.MTU == 0 { err = fmt.Errorf("Failed to determine MTU for %s interface", ipaddr) return } log.Infof("Using %s as external interface", ipaddr) sn, err := be.Init(iface, ipaddr, opts.ipMasq) if err != nil { log.Error("Could not init %v backend: %v", be.Name(), err) return } writeSubnetFile(sn) daemon.SdNotify("READY=1") log.Infof("%s mode initialized", be.Name()) be.Run() }