Google driver: add `--google-use-internal-ip-only` flag

This addresses previously-closed issue #2876, which points out that
instances created with the `--google-use-internal-ip` command-line flag
are still assigned an external IP address. The new flag (which implies
the presence of `--google-use-internal-ip` if it isn't specified) will
cause the new instance to have no externally-accessible IP address.

Signed-off-by: Jason Roehm <jroehm@gmail.com>
This commit is contained in:
Jason Roehm 2016-03-01 12:41:19 -05:00
parent d87383e8f3
commit 6789c51b83
2 changed files with 55 additions and 42 deletions

View File

@ -20,19 +20,20 @@ import (
// ComputeUtil is used to wrap the raw GCE API code and store common parameters. // ComputeUtil is used to wrap the raw GCE API code and store common parameters.
type ComputeUtil struct { type ComputeUtil struct {
zone string zone string
instanceName string instanceName string
userName string userName string
project string project string
diskTypeURL string diskTypeURL string
address string address string
preemptible bool preemptible bool
useInternalIP bool useInternalIP bool
service *raw.Service useInternalIPOnly bool
zoneURL string service *raw.Service
globalURL string zoneURL string
SwarmMaster bool globalURL string
SwarmHost string SwarmMaster bool
SwarmHost string
} }
const ( const (
@ -57,19 +58,20 @@ func newComputeUtil(driver *Driver) (*ComputeUtil, error) {
} }
return &ComputeUtil{ return &ComputeUtil{
zone: driver.Zone, zone: driver.Zone,
instanceName: driver.MachineName, instanceName: driver.MachineName,
userName: driver.SSHUser, userName: driver.SSHUser,
project: driver.Project, project: driver.Project,
diskTypeURL: driver.DiskType, diskTypeURL: driver.DiskType,
address: driver.Address, address: driver.Address,
preemptible: driver.Preemptible, preemptible: driver.Preemptible,
useInternalIP: driver.UseInternalIP, useInternalIP: driver.UseInternalIP,
service: service, useInternalIPOnly: driver.UseInternalIPOnly,
zoneURL: apiURL + driver.Project + "/zones/" + driver.Zone, service: service,
globalURL: apiURL + driver.Project + "/global", zoneURL: apiURL + driver.Project + "/zones/" + driver.Zone,
SwarmMaster: driver.SwarmMaster, globalURL: apiURL + driver.Project + "/global",
SwarmHost: driver.SwarmHost, SwarmMaster: driver.SwarmMaster,
SwarmHost: driver.SwarmHost,
}, nil }, nil
} }
@ -235,9 +237,6 @@ func (c *ComputeUtil) createInstance(d *Driver) error {
}, },
NetworkInterfaces: []*raw.NetworkInterface{ NetworkInterfaces: []*raw.NetworkInterface{
{ {
AccessConfigs: []*raw.AccessConfig{
{Type: "ONE_TO_ONE_NAT"},
},
Network: c.globalURL + "/networks/default", Network: c.globalURL + "/networks/default",
}, },
}, },
@ -255,6 +254,13 @@ func (c *ComputeUtil) createInstance(d *Driver) error {
}, },
} }
if !c.useInternalIPOnly {
cfg := &raw.AccessConfig{
Type: "ONE_TO_ONE_NAT",
}
instance.NetworkInterfaces[0].AccessConfigs = append(instance.NetworkInterfaces[0].AccessConfigs, cfg)
}
if c.address != "" { if c.address != "" {
staticAddress, err := c.staticAddress() staticAddress, err := c.staticAddress()
if err != nil { if err != nil {

View File

@ -15,18 +15,19 @@ import (
// Driver is a struct compatible with the docker.hosts.drivers.Driver interface. // Driver is a struct compatible with the docker.hosts.drivers.Driver interface.
type Driver struct { type Driver struct {
*drivers.BaseDriver *drivers.BaseDriver
Zone string Zone string
MachineType string MachineType string
MachineImage string MachineImage string
DiskType string DiskType string
Address string Address string
Preemptible bool Preemptible bool
UseInternalIP bool UseInternalIP bool
Scopes string UseInternalIPOnly bool
DiskSize int Scopes string
Project string DiskSize int
Tags string Project string
UseExisting bool Tags string
UseExisting bool
} }
const ( const (
@ -111,6 +112,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
Usage: "Use internal GCE Instance IP rather than public one", Usage: "Use internal GCE Instance IP rather than public one",
EnvVar: "GOOGLE_USE_INTERNAL_IP", EnvVar: "GOOGLE_USE_INTERNAL_IP",
}, },
mcnflag.BoolFlag{
Name: "google-use-internal-ip-only",
Usage: "Configure GCE instance to not have an external IP address",
EnvVar: "GOOGLE_USE_INTERNAL_IP_ONLY",
},
mcnflag.BoolFlag{ mcnflag.BoolFlag{
Name: "google-use-existing", Name: "google-use-existing",
Usage: "Don't create a new VM, use an existing one", Usage: "Don't create a new VM, use an existing one",
@ -170,7 +176,8 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
d.DiskType = flags.String("google-disk-type") d.DiskType = flags.String("google-disk-type")
d.Address = flags.String("google-address") d.Address = flags.String("google-address")
d.Preemptible = flags.Bool("google-preemptible") d.Preemptible = flags.Bool("google-preemptible")
d.UseInternalIP = flags.Bool("google-use-internal-ip") d.UseInternalIP = flags.Bool("google-use-internal-ip") || flags.Bool("google-use-internal-ip-only")
d.UseInternalIPOnly = flags.Bool("google-use-internal-ip-only")
d.Scopes = flags.String("google-scopes") d.Scopes = flags.String("google-scopes")
d.Tags = flags.String("google-tags") d.Tags = flags.String("google-tags")
} }