Merge pull request #3030 from caiush/gce-external-static-ip

Added support for GCE external static IPs
This commit is contained in:
Chris Bednarski 2016-01-12 19:36:32 -08:00
commit f1d6fbb8c4
5 changed files with 25 additions and 4 deletions

View File

@ -31,6 +31,7 @@ type Config struct {
MachineType string `mapstructure:"machine_type"` MachineType string `mapstructure:"machine_type"`
Metadata map[string]string `mapstructure:"metadata"` Metadata map[string]string `mapstructure:"metadata"`
Network string `mapstructure:"network"` Network string `mapstructure:"network"`
Address string `mapstructure:"address"`
Preemptible bool `mapstructure:"preemptible"` Preemptible bool `mapstructure:"preemptible"`
SourceImage string `mapstructure:"source_image"` SourceImage string `mapstructure:"source_image"`
SourceImageProjectId string `mapstructure:"source_image_project_id"` SourceImageProjectId string `mapstructure:"source_image_project_id"`

View File

@ -47,6 +47,7 @@ type InstanceConfig struct {
Metadata map[string]string Metadata map[string]string
Name string Name string
Network string Network string
Address string
Preemptible bool Preemptible bool
Tags []string Tags []string
Zone string Zone string

View File

@ -13,6 +13,7 @@ import (
"golang.org/x/oauth2/google" "golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt" "golang.org/x/oauth2/jwt"
"google.golang.org/api/compute/v1" "google.golang.org/api/compute/v1"
"strings"
) )
// driverGCE is a Driver implementation that actually talks to GCE. // driverGCE is a Driver implementation that actually talks to GCE.
@ -214,6 +215,23 @@ func (d *driverGCE) RunInstance(c *InstanceConfig) (<-chan error, error) {
return nil, err return nil, err
} }
// If given a regional ip, get it
accessconfig := compute.AccessConfig{
Name: "AccessConfig created by Packer",
Type: "ONE_TO_ONE_NAT",
}
if c.Address != "" {
d.ui.Message(fmt.Sprintf("Looking up address: %s", c.Address))
region_url := strings.Split(zone.Region, "/")
region := region_url[len(region_url)-1]
address, err := d.service.Addresses.Get(d.projectId, region, c.Address).Do()
if err != nil {
return nil, err
}
accessconfig.NatIP = address.Address
}
// Build up the metadata // Build up the metadata
metadata := make([]*compute.MetadataItems, len(c.Metadata)) metadata := make([]*compute.MetadataItems, len(c.Metadata))
for k, v := range c.Metadata { for k, v := range c.Metadata {
@ -247,10 +265,7 @@ func (d *driverGCE) RunInstance(c *InstanceConfig) (<-chan error, error) {
NetworkInterfaces: []*compute.NetworkInterface{ NetworkInterfaces: []*compute.NetworkInterface{
&compute.NetworkInterface{ &compute.NetworkInterface{
AccessConfigs: []*compute.AccessConfig{ AccessConfigs: []*compute.AccessConfig{
&compute.AccessConfig{ &accessconfig,
Name: "AccessConfig created by Packer",
Type: "ONE_TO_ONE_NAT",
},
}, },
Network: network.SelfLink, Network: network.SelfLink,
}, },

View File

@ -59,6 +59,7 @@ func (s *StepCreateInstance) Run(state multistep.StateBag) multistep.StepAction
Metadata: config.getInstanceMetadata(sshPublicKey), Metadata: config.getInstanceMetadata(sshPublicKey),
Name: name, Name: name,
Network: config.Network, Network: config.Network,
Address: config.Address,
Preemptible: config.Preemptible, Preemptible: config.Preemptible,
Tags: config.Tags, Tags: config.Tags,
Zone: config.Zone, Zone: config.Zone,

View File

@ -118,6 +118,9 @@ builder.
Not required if you run Packer on a GCE instance with a service account. Not required if you run Packer on a GCE instance with a service account.
Instructions for creating file or using service accounts are above. Instructions for creating file or using service accounts are above.
- `address` (string) - The name of a pre-allocated static external IP address.
Note, must be the name and not the actual IP address.
- `disk_size` (integer) - The size of the disk in GB. This defaults to `10`, - `disk_size` (integer) - The size of the disk in GB. This defaults to `10`,
which is 10GB. which is 10GB.