diff --git a/builtin/providers/google/resource_compute_instance_template.go b/builtin/providers/google/resource_compute_instance_template.go index 21b1d9982..f1d2f9bc3 100644 --- a/builtin/providers/google/resource_compute_instance_template.go +++ b/builtin/providers/google/resource_compute_instance_template.go @@ -48,7 +48,6 @@ func resourceComputeInstanceTemplate() *schema.Resource { ForceNew: true, }, - // TODO: Constraint either source or other disk params "disk": &schema.Schema{ Type: schema.TypeList, Required: true, @@ -131,22 +130,30 @@ func resourceComputeInstanceTemplate() *schema.Resource { ForceNew: true, }, - "network": &schema.Schema{ + "network_interface": &schema.Schema{ Type: schema.TypeList, - Required: true, + Optional: true, ForceNew: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ - "source": &schema.Schema{ + "network": &schema.Schema{ Type: schema.TypeString, - ForceNew: true, Required: true, + ForceNew: true, }, - "address": &schema.Schema{ - Type: schema.TypeString, - ForceNew: true, + "access_config": &schema.Schema{ + Type: schema.TypeList, Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "nat_ip": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + Optional: true, + }, + }, + }, }, }, }, @@ -284,31 +291,35 @@ func buildDisks(d *schema.ResourceData, meta interface{}) []*compute.AttachedDis func buildNetworks(d *schema.ResourceData, meta interface{}) (error, []*compute.NetworkInterface) { // Build up the list of networks - networksCount := d.Get("network.#").(int) - networks := make([]*compute.NetworkInterface, 0, networksCount) + networksCount := d.Get("network_interface.#").(int) + networkInterfaces := make([]*compute.NetworkInterface, 0, networksCount) for i := 0; i < networksCount; i++ { - prefix := fmt.Sprintf("network.%d", i) + prefix := fmt.Sprintf("network_interface.%d", i) source := "global/networks/default" - if v, ok := d.GetOk(prefix + ".source"); ok { + if v, ok := d.GetOk(prefix + ".network"); ok { if v.(string) != "default" { source = v.(string) } } - // Build the interface + // Build the networkInterface var iface compute.NetworkInterface - iface.AccessConfigs = []*compute.AccessConfig{ - &compute.AccessConfig{ - Type: "ONE_TO_ONE_NAT", - NatIP: d.Get(prefix + ".address").(string), - }, - } iface.Network = source - networks = append(networks, &iface) + accessConfigsCount := d.Get(prefix + ".access_config.#").(int) + iface.AccessConfigs = make([]*compute.AccessConfig, accessConfigsCount) + for j := 0; j < accessConfigsCount; j++ { + acPrefix := fmt.Sprintf("%s.access_config.%d", prefix, j) + iface.AccessConfigs[j] = &compute.AccessConfig{ + Type: "ONE_TO_ONE_NAT", + NatIP: d.Get(acPrefix + ".nat_ip").(string), + } + } + + networkInterfaces = append(networkInterfaces, &iface) } - return nil, networks + return nil, networkInterfaces } func resourceComputeInstanceTemplateCreate(d *schema.ResourceData, meta interface{}) error { diff --git a/builtin/providers/google/resource_compute_instance_template_test.go b/builtin/providers/google/resource_compute_instance_template_test.go index f9b3ac2b4..c552b125c 100644 --- a/builtin/providers/google/resource_compute_instance_template_test.go +++ b/builtin/providers/google/resource_compute_instance_template_test.go @@ -214,8 +214,8 @@ resource "google_compute_instance_template" "foobar" { boot = true } - network { - source = "default" + network_interface { + network = "default" } metadata { @@ -241,9 +241,11 @@ resource "google_compute_instance_template" "foobar" { source_image = "debian-7-wheezy-v20140814" } - network { - source = "default" - address = "${google_compute_address.foo.address}" + network_interface { + network = "default" + access_config { + nat_ip = "${google_compute_address.foo.address}" + } } metadata { @@ -276,8 +278,8 @@ resource "google_compute_instance_template" "foobar" { boot = false } - network { - source = "default" + network_interface { + network = "default" } metadata { diff --git a/website/source/docs/providers/google/r/compute_instance_template.html.markdown b/website/source/docs/providers/google/r/compute_instance_template.html.markdown index bb1f8bd15..927390bc9 100644 --- a/website/source/docs/providers/google/r/compute_instance_template.html.markdown +++ b/website/source/docs/providers/google/r/compute_instance_template.html.markdown @@ -42,8 +42,8 @@ resource "google_compute_instance_template" "foobar" { boot = false } - network { - source = "default" + network_interface { + network = "default" } metadata { @@ -82,7 +82,7 @@ The following arguments are supported: * `metadata` - (Optional) Metadata key/value pairs to make available from within instances created from this template. -* `network` - (Required) Networks to attach to instances created from this template. +* `network_interface` - (Required) Networks to attach to instances created from this template. This can be specified multiple times for multiple networks. Structure is documented below. @@ -130,12 +130,20 @@ The `disk` block supports: * `type` - (Optional) The GCE disk type. -The `network` block supports: +The `network_interface` block supports: -* `source` - (Required) The name of the network to attach this interface to. +* `network` - (Required) The name of the network to attach this interface to. -* `address` - (Optional) The IP address of a reserved IP address to assign - to this interface. +* `access_config` - (Optional) Access configurations, i.e. IPs via which this instance can be + accessed via the Internet. Omit to ensure that the instance is not accessible from the Internet +(this means that ssh provisioners will not work unless you are running Terraform can send traffic to +the instance's network (e.g. via tunnel or because it is running on another cloud instance on that +network). This block can be repeated multiple times. Structure documented below. + +The `access_config` block supports: + +* `nat_ip` - (Optional) The IP address that will be 1:1 mapped to the instance's network ip. If not + given, one will be generated. The `service_account` block supports: