Skip to content

Commit 93bcf85

Browse files
authored
Remove SchemaConfigModeAttr (#11506)
1 parent 5e11f50 commit 93bcf85

15 files changed

+12
-361
lines changed

docs/content/develop/breaking-changes/breaking-changes.md

-3
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ For more information, see
8484
* <a name="field-removing-diff-suppress"></a> Removing diff suppression from a field.
8585
* For MMv1 resources, removing `diff_suppress_func` from a field.
8686
* For handwritten resources, removing `DiffSuppressFunc` from a field.
87-
* <a name="field-adding-subfield-to-config-mode-attr"></a> Adding a subfield to
88-
a SchemaConfigModeAttr field.
89-
* Subfields of SchemaConfigModeAttr fields are treated as required even if the schema says they are optional.
9087
* Removing update support from a field.
9188

9289
### Making validation more strict

mmv1/products/compute/Subnetwork.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ properties:
242242
api_name: secondaryIpRanges
243243
unordered_list: true
244244
default_from_api: true
245-
schema_config_mode_attr: true
246245
send_empty_value: true
247246
description: |
248247
An array of configurations for secondary IP ranges for VM instances

mmv1/templates/terraform/schema_property.erb

-3
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@
2626
<% if property.default_from_api -%>
2727
Computed: true,
2828
Optional: true,
29-
<% if property.schema_config_mode_attr -%>
30-
ConfigMode: schema.SchemaConfigModeAttr,
31-
<% end -%>
3229
<% elsif property.required -%>
3330
Required: true,
3431
<% elsif property.output -%>

mmv1/templates/terraform/schema_property.go.tmpl

-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@
2727
{{ if .DefaultFromApi -}}
2828
Computed: true,
2929
Optional: true,
30-
{{ if .SchemaConfigModeAttr -}}
31-
ConfigMode: schema.SchemaConfigModeAttr,
32-
{{ end -}}
3330
{{ else if .Required -}}
3431
Required: true,
3532
{{ else if .Output -}}

mmv1/third_party/terraform/services/composer/resource_composer_environment.go.erb

-1
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,6 @@ func ResourceComposerEnvironment() *schema.Resource {
338338
Optional: true,
339339
Computed: true,
340340
ForceNew: true,
341-
ConfigMode: schema.SchemaConfigModeAttr,
342341
MaxItems: 1,
343342
Description: `Configuration for controlling how IPs are allocated in the GKE cluster. Cannot be updated.`,
344343
Elem: &schema.Resource{

mmv1/third_party/terraform/services/compute/resource_compute_instance.go.erb

-1
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,6 @@ func ResourceComputeInstance() *schema.Resource {
668668
Optional: true,
669669
Computed: true,
670670
ForceNew: true,
671-
ConfigMode: schema.SchemaConfigModeAttr,
672671
Description: `List of the type and count of accelerator cards attached to the instance.`,
673672
Elem: &schema.Resource{
674673
Schema: map[string]*schema.Schema{

mmv1/third_party/terraform/services/compute/resource_compute_instance_from_machine_image.go.erb

-11
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,6 @@ func computeInstanceFromMachineImageSchema() map[string]*schema.Schema {
4747
s[field].Optional = true
4848
}
4949

50-
// schema.SchemaConfigModeAttr allows these fields to be removed in Terraform 0.12.
51-
// Passing field_name = [] in this mode differentiates between an intentionally empty
52-
// block vs an ignored computed block.
53-
nic := s["network_interface"].Elem.(*schema.Resource)
54-
nic.Schema["alias_ip_range"].ConfigMode = schema.SchemaConfigModeAttr
55-
nic.Schema["access_config"].ConfigMode = schema.SchemaConfigModeAttr
56-
57-
for _, field := range []string{"attached_disk", "guest_accelerator", "service_account", "scratch_disk"} {
58-
s[field].ConfigMode = schema.SchemaConfigModeAttr
59-
}
60-
6150
recurseOnSchema(s, func(field *schema.Schema) {
6251
// We don't want to accidentally use default values to override the instance
6352
// machine image, so remove defaults.

mmv1/third_party/terraform/services/compute/resource_compute_instance_from_template.go.erb

-11
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,6 @@ func computeInstanceFromTemplateSchema() map[string]*schema.Schema {
5151
s[field].Optional = true
5252
}
5353

54-
// schema.SchemaConfigModeAttr allows these fields to be removed in Terraform 0.12.
55-
// Passing field_name = [] in this mode differentiates between an intentionally empty
56-
// block vs an ignored computed block.
57-
nic := s["network_interface"].Elem.(*schema.Resource)
58-
nic.Schema["alias_ip_range"].ConfigMode = schema.SchemaConfigModeAttr
59-
nic.Schema["access_config"].ConfigMode = schema.SchemaConfigModeAttr
60-
61-
for _, field := range []string{"attached_disk", "guest_accelerator", "service_account", "scratch_disk"} {
62-
s[field].ConfigMode = schema.SchemaConfigModeAttr
63-
}
64-
6554
// Remove deprecated/removed fields that are never d.Set. We can't
6655
// programmatically remove all of them, because some of them still have d.Set
6756
// calls.

mmv1/third_party/terraform/services/compute/resource_compute_instance_from_template_test.go.erb

-121
Original file line numberDiff line numberDiff line change
@@ -378,49 +378,6 @@ func TestAccComputeInstanceFromTemplate_overrideScheduling(t *testing.T) {
378378
})
379379
}
380380

381-
func TestAccComputeInstanceFromTemplate_012_removableFields(t *testing.T) {
382-
t.Parallel()
383-
384-
var instance compute.Instance
385-
instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
386-
templateName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
387-
resourceName := "google_compute_instance_from_template.inst"
388-
389-
// First config is a basic instance from template, second tests the empty list syntax
390-
config1 := testAccComputeInstanceFromTemplate_012_removableFieldsTpl(templateName) +
391-
testAccComputeInstanceFromTemplate_012_removableFields1(instanceName)
392-
config2 := testAccComputeInstanceFromTemplate_012_removableFieldsTpl(templateName) +
393-
testAccComputeInstanceFromTemplate_012_removableFields2(instanceName)
394-
395-
acctest.VcrTest(t, resource.TestCase{
396-
PreCheck: func() { acctest.AccTestPreCheck(t) },
397-
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
398-
CheckDestroy: testAccCheckComputeInstanceFromTemplateDestroyProducer(t),
399-
Steps: []resource.TestStep{
400-
{
401-
Config: config1,
402-
Check: resource.ComposeTestCheckFunc(
403-
testAccCheckComputeInstanceExists(t, resourceName, &instance),
404-
405-
resource.TestCheckResourceAttr(resourceName, "service_account.#", "1"),
406-
resource.TestCheckResourceAttr(resourceName, "service_account.0.scopes.#", "3"),
407-
),
408-
},
409-
{
410-
Config: config2,
411-
Check: resource.ComposeTestCheckFunc(
412-
testAccCheckComputeInstanceExists(t, resourceName, &instance),
413-
414-
// Check that fields were able to be removed
415-
resource.TestCheckResourceAttr(resourceName, "scratch_disk.#", "0"),
416-
resource.TestCheckResourceAttr(resourceName, "attached_disk.#", "0"),
417-
resource.TestCheckResourceAttr(resourceName, "network_interface.0.alias_ip_range.#", "0"),
418-
),
419-
},
420-
},
421-
})
422-
}
423-
424381
func TestAccComputeInstanceFromTemplate_overrideMetadataDotStartupScript(t *testing.T) {
425382
var instance compute.Instance
426383
instanceName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
@@ -1496,84 +1453,6 @@ resource "google_compute_instance_from_template" "inst" {
14961453
`, templateDisk, template, instance)
14971454
}
14981455

1499-
func testAccComputeInstanceFromTemplate_012_removableFieldsTpl(template string) string {
1500-
1501-
return fmt.Sprintf(`
1502-
data "google_compute_image" "my_image" {
1503-
family = "debian-11"
1504-
project = "debian-cloud"
1505-
}
1506-
1507-
resource "google_compute_instance_template" "foobar" {
1508-
name = "%s"
1509-
machine_type = "e2-medium"
1510-
1511-
disk {
1512-
source_image = data.google_compute_image.my_image.self_link
1513-
auto_delete = true
1514-
disk_size_gb = 20
1515-
boot = true
1516-
}
1517-
1518-
network_interface {
1519-
network = "default"
1520-
}
1521-
1522-
metadata = {
1523-
foo = "bar"
1524-
}
1525-
1526-
service_account {
1527-
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
1528-
}
1529-
1530-
can_ip_forward = true
1531-
}
1532-
`, template)
1533-
}
1534-
1535-
func testAccComputeInstanceFromTemplate_012_removableFields1(instance string) string {
1536-
return fmt.Sprintf(`
1537-
resource "google_compute_instance_from_template" "inst" {
1538-
name = "%s"
1539-
zone = "us-central1-a"
1540-
1541-
allow_stopping_for_update = true
1542-
1543-
source_instance_template = google_compute_instance_template.foobar.self_link
1544-
}
1545-
`, instance)
1546-
}
1547-
1548-
func testAccComputeInstanceFromTemplate_012_removableFields2(instance string) string {
1549-
return fmt.Sprintf(`
1550-
resource "google_compute_instance_from_template" "inst" {
1551-
name = "%s"
1552-
zone = "us-central1-a"
1553-
1554-
allow_stopping_for_update = true
1555-
1556-
source_instance_template = google_compute_instance_template.foobar.self_link
1557-
1558-
// Overrides
1559-
network_interface {
1560-
alias_ip_range = []
1561-
}
1562-
1563-
service_account = []
1564-
1565-
scratch_disk = []
1566-
1567-
attached_disk = []
1568-
1569-
timeouts {
1570-
create = "10m"
1571-
update = "10m"
1572-
}
1573-
}
1574-
`, instance)
1575-
}
1576-
15771456
func testAccComputeInstanceFromTemplate_overrideMetadataDotStartupScript(instance, template string) string {
15781457
return fmt.Sprintf(`
15791458
data "google_compute_image" "my_image" {

mmv1/third_party/terraform/services/compute/resource_compute_instance_test.go.erb

-46
Original file line numberDiff line numberDiff line change
@@ -1741,20 +1741,6 @@ func TestAccComputeInstance_guestAcceleratorSkip(t *testing.T) {
17411741
testAccCheckComputeInstanceLacksGuestAccelerator(&instance),
17421742
),
17431743
},
1744-
// Recreate with guest_accelerator = []
1745-
{
1746-
Config: testAccComputeInstance_guestAcceleratorEmptyBlock(instanceName),
1747-
Check: resource.ComposeTestCheckFunc(
1748-
testAccCheckComputeInstanceExists(t, "google_compute_instance.foobar", &instance),
1749-
testAccCheckComputeInstanceLacksGuestAccelerator(&instance),
1750-
),
1751-
},
1752-
// Check that count = 0 is the same as empty block []
1753-
{
1754-
Config: testAccComputeInstance_guestAccelerator(instanceName, 0),
1755-
ExpectNonEmptyPlan: false,
1756-
PlanOnly: true,
1757-
},
17581744
},
17591745
})
17601746

@@ -7154,38 +7140,6 @@ resource "google_compute_instance" "foobar" {
71547140
`, instance, count)
71557141
}
71567142

7157-
func testAccComputeInstance_guestAcceleratorEmptyBlock(instance string) string {
7158-
return fmt.Sprintf(`
7159-
data "google_compute_image" "my_image" {
7160-
family = "debian-11"
7161-
project = "debian-cloud"
7162-
}
7163-
7164-
resource "google_compute_instance" "foobar" {
7165-
name = "%s"
7166-
machine_type = "n1-standard-1" // can't be e2 because of guest_accelerator
7167-
zone = "us-east1-d"
7168-
7169-
boot_disk {
7170-
initialize_params {
7171-
image = data.google_compute_image.my_image.self_link
7172-
}
7173-
}
7174-
7175-
network_interface {
7176-
network = "default"
7177-
}
7178-
7179-
scheduling {
7180-
# Instances with guest accelerators do not support live migration.
7181-
on_host_maintenance = "TERMINATE"
7182-
}
7183-
7184-
guest_accelerator = []
7185-
}
7186-
`, instance)
7187-
}
7188-
71897143
func testAccComputeInstance_minCpuPlatform(instance string) string {
71907144
return fmt.Sprintf(`
71917145
data "google_compute_image" "my_image" {

mmv1/third_party/terraform/services/compute/resource_compute_subnetwork_test.go.erb

-57
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,6 @@ func TestAccComputeSubnetwork_secondaryIpRanges(t *testing.T) {
188188
testAccCheckComputeSubnetworkHasSecondaryIpRange(&subnetwork, "tf-test-secondary-range-update2", "192.168.11.0/24"),
189189
),
190190
},
191-
{
192-
Config: testAccComputeSubnetwork_secondaryIpRanges_update4(cnName, subnetworkName),
193-
Check: resource.ComposeTestCheckFunc(
194-
testAccCheckComputeSubnetworkExists(t, "google_compute_subnetwork.network-with-private-secondary-ip-ranges", &subnetwork),
195-
testAccCheckComputeSubnetworkHasNotSecondaryIpRange(&subnetwork, "tf-test-secondary-range-update1", "192.168.10.0/24"),
196-
testAccCheckComputeSubnetworkHasNotSecondaryIpRange(&subnetwork, "tf-test-secondary-range-update2", "192.168.11.0/24"),
197-
),
198-
},
199191
{
200192
Config: testAccComputeSubnetwork_secondaryIpRanges_update1(cnName, subnetworkName),
201193
Check: resource.ComposeTestCheckFunc(
@@ -244,12 +236,6 @@ func TestAccComputeSubnetwork_secondaryIpRanges_sendEmpty(t *testing.T) {
244236
testAccCheckComputeSubnetworkHasNotSecondaryIpRange(&subnetwork, "tf-test-secondary-range-update1", "192.168.10.0/24"),
245237
),
246238
},
247-
// Check that empty block secondary_ip_range = [] is not different
248-
{
249-
Config: testAccComputeSubnetwork_sendEmpty_emptyBlock(cnName, subnetworkName, "true"),
250-
PlanOnly: true,
251-
ExpectNonEmptyPlan: false,
252-
},
253239
// Apply two secondary_ip_range
254240
{
255241
Config: testAccComputeSubnetwork_sendEmpty_double(cnName, subnetworkName, "true"),
@@ -282,14 +268,6 @@ func TestAccComputeSubnetwork_secondaryIpRanges_sendEmpty(t *testing.T) {
282268
PlanOnly: true,
283269
ExpectNonEmptyPlan: false,
284270
},
285-
// Remove with empty block []
286-
{
287-
Config: testAccComputeSubnetwork_sendEmpty_emptyBlock(cnName, subnetworkName, "true"),
288-
Check: resource.ComposeTestCheckFunc(
289-
testAccCheckComputeSubnetworkExists(t, "google_compute_subnetwork.network-with-private-secondary-ip-ranges", &subnetwork),
290-
testAccCheckComputeSubnetworkHasNotSecondaryIpRange(&subnetwork, "tf-test-secondary-range-update1", "192.168.10.0/24"),
291-
),
292-
},
293271
},
294272
})
295273
}
@@ -691,23 +669,6 @@ resource "google_compute_subnetwork" "network-with-private-secondary-ip-ranges"
691669
`, cnName, subnetworkName)
692670
}
693671

694-
func testAccComputeSubnetwork_secondaryIpRanges_update4(cnName, subnetworkName string) string {
695-
return fmt.Sprintf(`
696-
resource "google_compute_network" "custom-test" {
697-
name = "%s"
698-
auto_create_subnetworks = false
699-
}
700-
701-
resource "google_compute_subnetwork" "network-with-private-secondary-ip-ranges" {
702-
name = "%s"
703-
ip_cidr_range = "10.2.0.0/16"
704-
region = "us-central1"
705-
network = google_compute_network.custom-test.self_link
706-
secondary_ip_range = []
707-
}
708-
`, cnName, subnetworkName)
709-
}
710-
711672
func testAccComputeSubnetwork_sendEmpty_removed(cnName, subnetworkName, sendEmpty string) string {
712673
return fmt.Sprintf(`
713674
resource "google_compute_network" "custom-test" {
@@ -725,24 +686,6 @@ resource "google_compute_subnetwork" "network-with-private-secondary-ip-ranges"
725686
`, cnName, subnetworkName, sendEmpty)
726687
}
727688

728-
func testAccComputeSubnetwork_sendEmpty_emptyBlock(cnName, subnetworkName, sendEmpty string) string {
729-
return fmt.Sprintf(`
730-
resource "google_compute_network" "custom-test" {
731-
name = "%s"
732-
auto_create_subnetworks = false
733-
}
734-
735-
resource "google_compute_subnetwork" "network-with-private-secondary-ip-ranges" {
736-
name = "%s"
737-
ip_cidr_range = "10.2.0.0/16"
738-
region = "us-central1"
739-
network = google_compute_network.custom-test.self_link
740-
secondary_ip_range = []
741-
send_secondary_ip_range_if_empty = "%s"
742-
}
743-
`, cnName, subnetworkName, sendEmpty)
744-
}
745-
746689
func testAccComputeSubnetwork_sendEmpty_single(cnName, subnetworkName, sendEmpty string) string {
747690
return fmt.Sprintf(`
748691
resource "google_compute_network" "custom-test" {

0 commit comments

Comments
 (0)