in plugins/ipam/config/config.go [60:108]
func LoadIPAMConfig(bytes []byte, args string) (*IPAMConfig, string, error) {
ipamConf := &Conf{}
if err := json.Unmarshal(bytes, &ipamConf); err != nil {
return nil, "", errors.Wrapf(err, "loadIPAMConfig config: failed to load netconf, %s", string(bytes))
}
if ipamConf.IPAM == nil {
return nil, "", errors.New("loadIPAMConfig config: 'IPAM' field missing in configuration: " + string(bytes))
}
// subnet is required to allocate ip address
if ipamConf.IPAM.IPV4Subnet.IP == nil || ipamConf.IPAM.IPV4Subnet.Mask == nil {
return nil, "", errors.New("loadIPAMConfig config: subnet is required")
}
if ones, _ := ipamConf.IPAM.IPV4Subnet.Mask.Size(); ones > ipstore.MaxMask {
return nil, "", errors.New("loadIPAMConfig config: no available ip in the subnet")
}
// convert from types.IPNet to net.IPNet
subnet := net.IPNet{
IP: ipamConf.IPAM.IPV4Subnet.IP,
Mask: ipamConf.IPAM.IPV4Subnet.Mask,
}
// Validate the ip if specified explicitly
if ipamConf.IPAM.IPV4Address.IP != nil {
err := verifyIPSubnet(ipamConf.IPAM.IPV4Address.IP, subnet)
if err != nil {
return nil, "", err
}
if isNetworkOrBroadcast(subnet, ipamConf.IPAM.IPV4Address.IP) {
return nil, "", errors.Errorf("ip specified is reserved by default: %v", ipamConf.IPAM.IPV4Address)
}
}
// get the default gateway
if ipamConf.IPAM.IPV4Gateway == nil {
ipamConf.IPAM.IPV4Gateway = getDefaultIPV4GW(ipamConf.IPAM.IPV4Subnet)
} else {
if isNetworkOrBroadcast(subnet, ipamConf.IPAM.IPV4Gateway) {
return nil, "", errors.Errorf("gateway specified is reserved by default: %v", ipamConf.IPAM.IPV4Gateway)
}
if err := verifyIPSubnet(ipamConf.IPAM.IPV4Gateway, subnet); err != nil {
return nil, "", err
}
}
return ipamConf.IPAM, ipamConf.CNIVersion, nil
}