From 6789c51b83af67231bfa0f6acb87757c0b3e5206 Mon Sep 17 00:00:00 2001 From: Jason Roehm Date: Tue, 1 Mar 2016 12:41:19 -0500 Subject: [PATCH] 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 --- drivers/google/compute_util.go | 64 +++++++++++++++++++--------------- drivers/google/google.go | 33 +++++++++++------- 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index 6b50f6b7c9..92e2d47270 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -20,19 +20,20 @@ import ( // ComputeUtil is used to wrap the raw GCE API code and store common parameters. type ComputeUtil struct { - zone string - instanceName string - userName string - project string - diskTypeURL string - address string - preemptible bool - useInternalIP bool - service *raw.Service - zoneURL string - globalURL string - SwarmMaster bool - SwarmHost string + zone string + instanceName string + userName string + project string + diskTypeURL string + address string + preemptible bool + useInternalIP bool + useInternalIPOnly bool + service *raw.Service + zoneURL string + globalURL string + SwarmMaster bool + SwarmHost string } const ( @@ -57,19 +58,20 @@ func newComputeUtil(driver *Driver) (*ComputeUtil, error) { } return &ComputeUtil{ - zone: driver.Zone, - instanceName: driver.MachineName, - userName: driver.SSHUser, - project: driver.Project, - diskTypeURL: driver.DiskType, - address: driver.Address, - preemptible: driver.Preemptible, - useInternalIP: driver.UseInternalIP, - service: service, - zoneURL: apiURL + driver.Project + "/zones/" + driver.Zone, - globalURL: apiURL + driver.Project + "/global", - SwarmMaster: driver.SwarmMaster, - SwarmHost: driver.SwarmHost, + zone: driver.Zone, + instanceName: driver.MachineName, + userName: driver.SSHUser, + project: driver.Project, + diskTypeURL: driver.DiskType, + address: driver.Address, + preemptible: driver.Preemptible, + useInternalIP: driver.UseInternalIP, + useInternalIPOnly: driver.UseInternalIPOnly, + service: service, + zoneURL: apiURL + driver.Project + "/zones/" + driver.Zone, + globalURL: apiURL + driver.Project + "/global", + SwarmMaster: driver.SwarmMaster, + SwarmHost: driver.SwarmHost, }, nil } @@ -235,9 +237,6 @@ func (c *ComputeUtil) createInstance(d *Driver) error { }, NetworkInterfaces: []*raw.NetworkInterface{ { - AccessConfigs: []*raw.AccessConfig{ - {Type: "ONE_TO_ONE_NAT"}, - }, 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 != "" { staticAddress, err := c.staticAddress() if err != nil { diff --git a/drivers/google/google.go b/drivers/google/google.go index 4bf007c20f..4eee269614 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -15,18 +15,19 @@ import ( // Driver is a struct compatible with the docker.hosts.drivers.Driver interface. type Driver struct { *drivers.BaseDriver - Zone string - MachineType string - MachineImage string - DiskType string - Address string - Preemptible bool - UseInternalIP bool - Scopes string - DiskSize int - Project string - Tags string - UseExisting bool + Zone string + MachineType string + MachineImage string + DiskType string + Address string + Preemptible bool + UseInternalIP bool + UseInternalIPOnly bool + Scopes string + DiskSize int + Project string + Tags string + UseExisting bool } const ( @@ -111,6 +112,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Use internal GCE Instance IP rather than public one", 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{ Name: "google-use-existing", 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.Address = flags.String("google-address") 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.Tags = flags.String("google-tags") }