Exemple #1
0
// processNetwork parses network args if present
func (c *Create) processNetwork(network *data.NetworkConfig, netName, pgName, staticIP, gateway string) error {
	network.Name = pgName

	var err error

	i := staticIP != ""
	g := gateway != ""
	if !i && !g {
		return nil
	}
	if i != g {
		return fmt.Errorf("%s network IP and gateway must both be specified", netName)
	}

	defer func(net *data.NetworkConfig) {
		if err == nil {
			log.Debugf("%s network: IP %q gateway %q", netName, net.IP, net.Gateway)
		}
	}(network)

	network.Gateway, err = ip.ParseIPandMask(gateway)
	if err != nil {
		return fmt.Errorf("Invalid %s network gateway: %s", netName, err)
	}

	network.IP, err = ip.ParseIPandMask(staticIP)
	if err == nil {
		return nil
	}

	// try treating it as a name, using the mask from the gateway
	ips, err := net.LookupIP(staticIP)
	if err != nil {
		return fmt.Errorf("Invalid %s network address - neither IP nor resolvable hostname", netName)
	}

	for _, ip := range ips {
		if !network.Gateway.Contains(ip) {
			log.Debugf("Skipping %s as value for %s because it's not in the network specified by gateway", ip.String(), staticIP)
			continue
		}

		if ip.String() != staticIP {
			log.Infof("Assigning %s based on %s", ip.String(), staticIP)
		}

		network.IP = net.IPNet{
			IP:   ip,
			Mask: network.Gateway.Mask,
		}

		return nil
	}

	return fmt.Errorf("Invalid %s network address: %s does not resolve to a gateway compatible IP", netName, staticIP)
}