Пример #1
0
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
}