// Allocate an address from the network func networkAllocAddress(nwCfg *mastercfg.CfgNetworkState, reqAddr string, isIPv6 bool) (string, error) { var ipAddress string var ipAddrValue uint var found bool var err error var hostID string // alloc address if reqAddr == "" { if isIPv6 { // Get the next available IPv6 address hostID, err = netutils.GetNextIPv6HostID(nwCfg.IPv6LastHost, nwCfg.IPv6Subnet, nwCfg.IPv6SubnetLen, nwCfg.IPv6AllocMap) if err != nil { log.Errorf("create eps: error allocating ip. Error: %s", err) return "", err } ipAddress, err = netutils.GetSubnetIPv6(nwCfg.IPv6Subnet, nwCfg.IPv6SubnetLen, hostID) if err != nil { log.Errorf("create eps: error acquiring subnet ip. Error: %s", err) return "", err } nwCfg.IPv6LastHost = hostID } else { ipAddrValue, found = nwCfg.IPAllocMap.NextClear(0) if !found { log.Errorf("auto allocation failed - address exhaustion in subnet %s/%d", nwCfg.SubnetIP, nwCfg.SubnetLen) err = core.Errorf("auto allocation failed - address exhaustion in subnet %s/%d", nwCfg.SubnetIP, nwCfg.SubnetLen) return "", err } ipAddress, err = netutils.GetSubnetIP(nwCfg.SubnetIP, nwCfg.SubnetLen, 32, ipAddrValue) if err != nil { log.Errorf("create eps: error acquiring subnet ip. Error: %s", err) return "", err } } // Docker, Mesos issue a Alloc Address first, followed by a CreateEndpoint // Kubernetes issues a create endpoint directly // since networkAllocAddress is called from both AllocAddressHandler and CreateEndpointHandler, // we need to make sure that the EpCount is incremented only when we are allocating // a new IP. In case of Docker, Mesos CreateEndPoint will already request a IP that // allocateAddress had allocated in the earlier call. nwCfg.EpAddrCount++ } else if reqAddr != "" && nwCfg.SubnetIP != "" { if isIPv6 { hostID, err = netutils.GetIPv6HostID(nwCfg.IPv6Subnet, nwCfg.IPv6SubnetLen, reqAddr) if err != nil { log.Errorf("create eps: error getting host id from hostIP %s Subnet %s/%d. Error: %s", reqAddr, nwCfg.IPv6Subnet, nwCfg.IPv6SubnetLen, err) return "", err } } else { ipAddrValue, err = netutils.GetIPNumber(nwCfg.SubnetIP, nwCfg.SubnetLen, 32, reqAddr) if err != nil { log.Errorf("create eps: error getting host id from hostIP %s Subnet %s/%d. Error: %s", reqAddr, nwCfg.SubnetIP, nwCfg.SubnetLen, err) return "", err } } ipAddress = reqAddr } if isIPv6 { netutils.ReserveIPv6HostID(hostID, &nwCfg.IPv6AllocMap) } else { // Set the bitmap nwCfg.IPAllocMap.Set(ipAddrValue) } err = nwCfg.Write() if err != nil { log.Errorf("error writing nw config. Error: %s", err) return "", err } return ipAddress, nil }