func LoadIPAMConfig()

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
}