From fc39c2a15ac8190acf4c7a13464ba35dddd95ad7 Mon Sep 17 00:00:00 2001 From: Modular Magician Date: Tue, 14 Feb 2023 18:35:25 +0000 Subject: [PATCH] Fix patching in stateful disks1 (#7254) * use null-values for removing stateful disks * Modify test to check if all stateful disks can be removed. --------- Co-authored-by: Adam Skubis Signed-off-by: Modular Magician --- .changelog/7254.txt | 3 ++ ...resource_compute_instance_group_manager.go | 50 ++++++++++++++++--- ...rce_compute_instance_group_manager_test.go | 8 +-- ...pute_region_instance_group_manager_test.go | 8 --- 4 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 .changelog/7254.txt diff --git a/.changelog/7254.txt b/.changelog/7254.txt new file mode 100644 index 00000000000..c820a6defce --- /dev/null +++ b/.changelog/7254.txt @@ -0,0 +1,3 @@ +```release-note:bug +compute: added possibility to remove `stateful_disks` in `compute_instance_group_manager` and `compute_region_instance_group_manager`. +``` diff --git a/google/resource_compute_instance_group_manager.go b/google/resource_compute_instance_group_manager.go index c0c9be87ed2..0b8f41a369d 100644 --- a/google/resource_compute_instance_group_manager.go +++ b/google/resource_compute_instance_group_manager.go @@ -877,23 +877,57 @@ func expandAutoHealingPolicies(configured []interface{}) []*compute.InstanceGrou } func expandStatefulPolicy(d *schema.ResourceData) *compute.StatefulPolicy { + preservedState := &compute.StatefulPolicyPreservedState{} - stateful_disks := d.Get("stateful_disk").(*schema.Set).List() - disks := make(map[string]compute.StatefulPolicyPreservedStateDiskDevice) - for _, raw := range stateful_disks { - data := raw.(map[string]interface{}) - disk := compute.StatefulPolicyPreservedStateDiskDevice{ - AutoDelete: data["delete_rule"].(string), + + isRemovingAStatefulDisk := false + if d.HasChange("stateful_disk") { + oldDisks, newDisks := d.GetChange("stateful_disk") + preservedState.Disks = expandStatefulDisks(newDisks.(*schema.Set).List()) + // Remove Disks + for _, raw := range oldDisks.(*schema.Set).List() { + data := raw.(map[string]interface{}) + deviceName := data["device_name"].(string) + if _, exist := preservedState.Disks[deviceName]; !exist { + isRemovingAStatefulDisk = true + preservedState.NullFields = append(preservedState.NullFields, "Disks."+deviceName) + } } - disks[data["device_name"].(string)] = disk + preservedState.ForceSendFields = append(preservedState.ForceSendFields, "Disks") } - preservedState.Disks = disks + if !isRemovingAStatefulDisk { + preservedState := &compute.StatefulPolicyPreservedState{} + stateful_disks := d.Get("stateful_disk").(*schema.Set).List() + disks := make(map[string]compute.StatefulPolicyPreservedStateDiskDevice) + for _, raw := range stateful_disks { + data := raw.(map[string]interface{}) + disk := compute.StatefulPolicyPreservedStateDiskDevice{ + AutoDelete: data["delete_rule"].(string), + } + disks[data["device_name"].(string)] = disk + } + preservedState.Disks = disks + } + statefulPolicy := &compute.StatefulPolicy{PreservedState: preservedState} statefulPolicy.ForceSendFields = append(statefulPolicy.ForceSendFields, "PreservedState") return statefulPolicy } +func expandStatefulDisks(statefulDisk []interface{}) map[string]compute.StatefulPolicyPreservedStateDiskDevice { + statefulDisksMap := make(map[string]compute.StatefulPolicyPreservedStateDiskDevice) + + for _, raw := range statefulDisk { + data := raw.(map[string]interface{}) + deviceName := compute.StatefulPolicyPreservedStateDiskDevice{ + AutoDelete: data["delete_rule"].(string), + } + statefulDisksMap[data["device_name"].(string)] = deviceName + } + return statefulDisksMap +} + func expandVersions(configured []interface{}) []*compute.InstanceGroupManagerVersion { versions := make([]*compute.InstanceGroupManagerVersion, 0, len(configured)) for _, raw := range configured { diff --git a/google/resource_compute_instance_group_manager_test.go b/google/resource_compute_instance_group_manager_test.go index 2414cabaa09..4d2e218db16 100644 --- a/google/resource_compute_instance_group_manager_test.go +++ b/google/resource_compute_instance_group_manager_test.go @@ -1493,6 +1493,10 @@ resource "google_compute_instance_group_manager" "igm-basic" { device_name = "my-stateful-disk" delete_rule = "NEVER" } + stateful_disk { + device_name = "my-stateful-disk2" + delete_rule = "ON_PERMANENT_INSTANCE_DELETION" + } } @@ -1570,10 +1574,6 @@ resource "google_compute_instance_group_manager" "igm-basic" { base_instance_name = "tf-test-igm-basic" zone = "us-central1-c" target_size = 2 - stateful_disk { - device_name = "my-stateful-disk" - delete_rule = "NEVER" - } } `, network, template, target, igm) } diff --git a/google/resource_compute_region_instance_group_manager_test.go b/google/resource_compute_region_instance_group_manager_test.go index f9cb39df794..6733b23f6fe 100644 --- a/google/resource_compute_region_instance_group_manager_test.go +++ b/google/resource_compute_region_instance_group_manager_test.go @@ -1507,14 +1507,6 @@ resource "google_compute_region_instance_group_manager" "igm-basic" { max_surge_fixed = 0 max_unavailable_fixed = 6 } - stateful_disk { - device_name = "stateful-disk" - delete_rule = "NEVER" - } - stateful_disk { - device_name = "stateful-disk2" - delete_rule = "ON_PERMANENT_INSTANCE_DELETION" - } } `, network, template, igm) }