// allocate virtual IP for a single endpoint attachment of the service. func (na *NetworkAllocator) allocateVIP(vip *api.Endpoint_VirtualIP) error { localNet := na.getNetwork(vip.NetworkID) if localNet == nil { return fmt.Errorf("networkallocator: could not find local network state") } ipam, _, err := na.resolveIPAM(localNet.nw) if err != nil { return fmt.Errorf("failed to resolve IPAM while allocating : %v", err) } for _, poolID := range localNet.pools { ip, _, err := ipam.RequestAddress(poolID, nil, nil) if err != nil && err != ipamapi.ErrNoAvailableIPs && err != ipamapi.ErrIPOutOfRange { return fmt.Errorf("could not allocate VIP from IPAM: %v", err) } // If we got an address then we are done. if err == nil { ipStr := ip.String() localNet.endpoints[ipStr] = poolID vip.Addr = ipStr return nil } } return fmt.Errorf("could not find an available IP while allocating VIP") }
// allocate virtual IP for a single endpoint attachment of the service. func (na *NetworkAllocator) allocateVIP(vip *api.Endpoint_VirtualIP) error { localNet := na.getNetwork(vip.NetworkID) if localNet == nil { return fmt.Errorf("networkallocator: could not find local network state") } // If this IP is already allocated in memory we don't need to // do anything. if _, ok := localNet.endpoints[vip.Addr]; ok { return nil } ipam, _, err := na.resolveIPAM(localNet.nw) if err != nil { return fmt.Errorf("failed to resolve IPAM while allocating : %v", err) } var addr net.IP if vip.Addr != "" { var err error addr, _, err = net.ParseCIDR(vip.Addr) if err != nil { return err } } for _, poolID := range localNet.pools { ip, _, err := ipam.RequestAddress(poolID, addr, nil) if err != nil && err != ipamapi.ErrNoAvailableIPs && err != ipamapi.ErrIPOutOfRange { return fmt.Errorf("could not allocate VIP from IPAM: %v", err) } // If we got an address then we are done. if err == nil { ipStr := ip.String() localNet.endpoints[ipStr] = poolID vip.Addr = ipStr return nil } } return fmt.Errorf("could not find an available IP while allocating VIP") }