// 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) }