mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-07-06 10:12:39 +00:00
012 instance from template (#3434)
Signed-off-by: Modular Magician <magic-modules@google.com>
This commit is contained in:
parent
dbf9188792
commit
5c925718d1
1
go.sum
1
go.sum
|
@ -121,6 +121,7 @@ github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASu
|
||||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU=
|
||||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.3 h1:siORttZ36U2R/WjiJuDz8znElWBiAlO9rVt+mqJt0Cc=
|
github.com/googleapis/gax-go/v2 v2.0.3 h1:siORttZ36U2R/WjiJuDz8znElWBiAlO9rVt+mqJt0Cc=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
||||||
|
|
|
@ -370,10 +370,11 @@ func resourceComputeInstance() *schema.Resource {
|
||||||
},
|
},
|
||||||
|
|
||||||
"guest_accelerator": {
|
"guest_accelerator": {
|
||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
|
ConfigMode: schema.SchemaConfigModeAttr,
|
||||||
Elem: &schema.Resource{
|
Elem: &schema.Resource{
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"count": {
|
"count": {
|
||||||
|
|
|
@ -37,6 +37,17 @@ func computeInstanceFromTemplateSchema() map[string]*schema.Schema {
|
||||||
s[field].Optional = true
|
s[field].Optional = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// schema.SchemaConfigModeAttr allows these fields to be removed in Terraform 0.12.
|
||||||
|
// Passing field_name = [] in this mode differentiates between an intentionally empty
|
||||||
|
// block vs an ignored computed block.
|
||||||
|
nic := s["network_interface"].Elem.(*schema.Resource)
|
||||||
|
nic.Schema["alias_ip_range"].ConfigMode = schema.SchemaConfigModeAttr
|
||||||
|
nic.Schema["access_config"].ConfigMode = schema.SchemaConfigModeAttr
|
||||||
|
|
||||||
|
for _, field := range []string{"attached_disk", "guest_accelerator", "service_account", "scratch_disk"} {
|
||||||
|
s[field].ConfigMode = schema.SchemaConfigModeAttr
|
||||||
|
}
|
||||||
|
|
||||||
// Remove deprecated/removed fields that are never d.Set. We can't
|
// Remove deprecated/removed fields that are never d.Set. We can't
|
||||||
// programatically remove all of them, because some of them still have d.Set
|
// programatically remove all of them, because some of them still have d.Set
|
||||||
// calls.
|
// calls.
|
||||||
|
|
|
@ -125,6 +125,50 @@ func TestAccComputeInstanceFromTemplate_overrideScratchDisk(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccComputeInstanceFromTemplate_012_removableFields(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
var instance compute.Instance
|
||||||
|
instanceName := fmt.Sprintf("terraform-test-%s", acctest.RandString(10))
|
||||||
|
templateName := fmt.Sprintf("terraform-test-%s", acctest.RandString(10))
|
||||||
|
resourceName := "google_compute_instance_from_template.inst"
|
||||||
|
|
||||||
|
// First config is a basic instance from template, second tests the empty list syntax
|
||||||
|
config1 := testAccComputeInstanceFromTemplate_012_removableFieldsTpl(templateName) +
|
||||||
|
testAccComputeInstanceFromTemplate_012_removableFields1(instanceName)
|
||||||
|
config2 := testAccComputeInstanceFromTemplate_012_removableFieldsTpl(templateName) +
|
||||||
|
testAccComputeInstanceFromTemplate_012_removableFields2(instanceName)
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckComputeInstanceFromTemplateDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
{
|
||||||
|
Config: config1,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckComputeInstanceExists(resourceName, &instance),
|
||||||
|
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "service_account.#", "1"),
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "service_account.0.scopes.#", "3"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Config: config2,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckComputeInstanceExists(resourceName, &instance),
|
||||||
|
|
||||||
|
// Check that fields were able to be removed
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "service_account.#", "0"),
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "scratch_disk.#", "0"),
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "attached_disk.#", "0"),
|
||||||
|
resource.TestCheckResourceAttr(resourceName, "network_interface.0.alias_ip_range.#", "0"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func testAccCheckComputeInstanceFromTemplateDestroy(s *terraform.State) error {
|
func testAccCheckComputeInstanceFromTemplateDestroy(s *terraform.State) error {
|
||||||
config := testAccProvider.Meta().(*Config)
|
config := testAccProvider.Meta().(*Config)
|
||||||
|
|
||||||
|
@ -390,3 +434,81 @@ resource "google_compute_instance_from_template" "inst" {
|
||||||
}
|
}
|
||||||
`, templateDisk, overrideDisk, template, instance)
|
`, templateDisk, overrideDisk, template, instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccComputeInstanceFromTemplate_012_removableFieldsTpl(template string) string {
|
||||||
|
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
data "google_compute_image" "my_image" {
|
||||||
|
family = "debian-9"
|
||||||
|
project = "debian-cloud"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "google_compute_instance_template" "foobar" {
|
||||||
|
name = "%s"
|
||||||
|
machine_type = "n1-standard-1"
|
||||||
|
|
||||||
|
disk {
|
||||||
|
source_image = "${data.google_compute_image.my_image.self_link}"
|
||||||
|
auto_delete = true
|
||||||
|
disk_size_gb = 20
|
||||||
|
boot = true
|
||||||
|
}
|
||||||
|
|
||||||
|
network_interface {
|
||||||
|
network = "default"
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
foo = "bar"
|
||||||
|
}
|
||||||
|
|
||||||
|
service_account {
|
||||||
|
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
|
||||||
|
}
|
||||||
|
|
||||||
|
can_ip_forward = true
|
||||||
|
}
|
||||||
|
`, template)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccComputeInstanceFromTemplate_012_removableFields1(instance string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_compute_instance_from_template" "inst" {
|
||||||
|
name = "%s"
|
||||||
|
zone = "us-central1-a"
|
||||||
|
|
||||||
|
allow_stopping_for_update = true
|
||||||
|
|
||||||
|
source_instance_template = "${google_compute_instance_template.foobar.self_link}"
|
||||||
|
}
|
||||||
|
`, instance)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccComputeInstanceFromTemplate_012_removableFields2(instance string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_compute_instance_from_template" "inst" {
|
||||||
|
name = "%s"
|
||||||
|
zone = "us-central1-a"
|
||||||
|
|
||||||
|
allow_stopping_for_update = true
|
||||||
|
|
||||||
|
source_instance_template = "${google_compute_instance_template.foobar.self_link}"
|
||||||
|
|
||||||
|
// Overrides
|
||||||
|
network_interface {
|
||||||
|
alias_ip_range = []
|
||||||
|
}
|
||||||
|
|
||||||
|
service_account = []
|
||||||
|
|
||||||
|
scratch_disk = []
|
||||||
|
|
||||||
|
attached_disk = []
|
||||||
|
|
||||||
|
timeouts {
|
||||||
|
create = "10m"
|
||||||
|
update = "10m"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`, instance)
|
||||||
|
}
|
||||||
|
|
|
@ -117,6 +117,7 @@ func resourceComputeSubnetwork() *schema.Resource {
|
||||||
},
|
},
|
||||||
"secondary_ip_range": {
|
"secondary_ip_range": {
|
||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
|
Computed: true,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Elem: &schema.Resource{
|
Elem: &schema.Resource{
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
|
|
|
@ -76,6 +76,14 @@ In addition to these, all arguments from `google_compute_instance` are supported
|
||||||
as a way to override the properties in the template. All exported attributes
|
as a way to override the properties in the template. All exported attributes
|
||||||
from `google_compute_instance` are likewise exported here.
|
from `google_compute_instance` are likewise exported here.
|
||||||
|
|
||||||
|
To support removal of Optional/Computed fields in Terraform 0.12 the following fields
|
||||||
|
are marked [Attributes as Blocks](/docs/configuration/attr-as-blocks.html):
|
||||||
|
* `attached_disk`
|
||||||
|
* `guest_accelerator`
|
||||||
|
* `service_account`
|
||||||
|
* `scratch_disk`
|
||||||
|
* `network_interface.alias_ip_range`
|
||||||
|
* `network_interface.access_config`
|
||||||
|
|
||||||
## Timeouts
|
## Timeouts
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user