From 144cf03d96783d0d4f9fe727e8953ebc2ff57ebb Mon Sep 17 00:00:00 2001 From: Karol Gorczyk Date: Wed, 18 Sep 2024 09:42:04 +0200 Subject: [PATCH] change update method of auto_delete field --- .../compute/resource_compute_instance.go.erb | 14 +++- .../resource_compute_instance_test.go.erb | 70 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/services/compute/resource_compute_instance.go.erb b/mmv1/third_party/terraform/services/compute/resource_compute_instance.go.erb index 8d8430aa929c..43c6a3dbfa1c 100644 --- a/mmv1/third_party/terraform/services/compute/resource_compute_instance.go.erb +++ b/mmv1/third_party/terraform/services/compute/resource_compute_instance.go.erb @@ -208,7 +208,6 @@ func ResourceComputeInstance() *schema.Resource { Optional: true, AtLeastOneOf: bootDiskKeys, Default: true, - ForceNew: true, Description: `Whether the disk will be auto-deleted when the instance is deleted.`, }, @@ -2405,6 +2404,19 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err } } + // if any other boot_disk fields will be added here this should be wrapped in if d.HasChange("boot_disk") + if d.HasChange("boot_disk.0.auto_delete") { + op, err := config.NewComputeClient(userAgent).Instances.SetDiskAutoDelete(project, zone, instance.Name, d.Get("boot_disk.0.auto_delete").(bool), d.Get("boot_disk.0.device_name").(string)).Do() + if err != nil { + return errwrap.Wrapf("Error setting auto_delete : {{err}}", err) + } + opErr := ComputeOperationWaitTime(config, op, project, "changing auto_delete", userAgent, d.Timeout(schema.TimeoutUpdate)) + if opErr != nil { + return opErr + } + log.Printf("[DEBUG] Successfully changed auto_delete on disk %s", instance.Disks[0].DeviceName) + } + // d.HasChange("service_account") is oversensitive: see https://github.com/hashicorp/terraform/issues/17411 // Until that's fixed, manually check whether there is a change. o, n := d.GetChange("service_account") diff --git a/mmv1/third_party/terraform/services/compute/resource_compute_instance_test.go.erb b/mmv1/third_party/terraform/services/compute/resource_compute_instance_test.go.erb index 0de1dc905b14..d8d8148ddeb5 100644 --- a/mmv1/third_party/terraform/services/compute/resource_compute_instance_test.go.erb +++ b/mmv1/third_party/terraform/services/compute/resource_compute_instance_test.go.erb @@ -3360,6 +3360,50 @@ func TestAccComputeInstance_proactiveAttributionLabel(t *testing.T) { }) } +func TestAccComputeInstance_autoDeleteUpdate(t *testing.T) { + t.Parallel() + + var instance compute.Instance + context_1 := map[string]interface{}{ + "instance_name": fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10)), + "auto_delete": "true", + } + + context_2 := map[string]interface{}{ + "instance_name": context_1["instance_name"], + "auto_delete": "false", + } + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckComputeInstanceDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccComputeInstance_autoDeleteUpdate(context_1), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeInstanceExists(t, "google_compute_instance.foobar", &instance), + resource.TestCheckResourceAttr("google_compute_instance.foobar", "boot_disk.0.auto_delete", "true"), + ), + }, + { + Config: testAccComputeInstance_autoDeleteUpdate(context_2), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeInstanceExists(t, "google_compute_instance.foobar", &instance), + resource.TestCheckResourceAttr("google_compute_instance.foobar", "boot_disk.0.auto_delete", "false"), + ), + }, + { + Config: testAccComputeInstance_autoDeleteUpdate(context_1), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeInstanceExists(t, "google_compute_instance.foobar", &instance), + resource.TestCheckResourceAttr("google_compute_instance.foobar", "boot_disk.0.auto_delete", "true"), + ), + }, + }, + }) +} + <% unless version == 'ga' -%> const errorDeleteAccessConfigWithSecPolicy = "Cannot delete an access config with a security policy set. Please remove the security policy first" @@ -10569,3 +10613,29 @@ resource "google_compute_instance" "foobar" { } `, diskName, instanceName, machineType, zone, bootDiskInterface, allowStoppingForUpdate) } + +func testAccComputeInstance_autoDeleteUpdate(context map[string]interface{}) string { + return acctest.Nprintf(` +data "google_compute_image" "my_image" { + family = "debian-11" + project = "debian-cloud" +} + +resource "google_compute_instance" "foobar" { + name = "%{instance_name}" + machine_type = "n1-standard-1" + zone = "us-central1-a" + + boot_disk { + auto_delete = %{auto_delete} + initialize_params { + image = data.google_compute_image.my_image.self_link + } + } + + network_interface { + network = "default" + } +} +`, context) +} \ No newline at end of file