From 42008b368c532b2f9bb583e91ae8ad06de878bf4 Mon Sep 17 00:00:00 2001 From: Dana Hoffman Date: Tue, 2 Jul 2019 09:14:57 -0700 Subject: [PATCH] properly support timeouts in IGM and RIGM --- ...urce_compute_instance_group_manager.go.erb | 42 +++++++++++++------ ...mpute_region_instance_group_manager.go.erb | 27 ++++++++---- ...mpute_instance_group_manager.html.markdown | 10 +++++ ...egion_instance_group_manager.html.markdown | 10 +++++ 4 files changed, 67 insertions(+), 22 deletions(-) diff --git a/third_party/terraform/resources/resource_compute_instance_group_manager.go.erb b/third_party/terraform/resources/resource_compute_instance_group_manager.go.erb index 5fab1ae96af7..39d887069976 100644 --- a/third_party/terraform/resources/resource_compute_instance_group_manager.go.erb +++ b/third_party/terraform/resources/resource_compute_instance_group_manager.go.erb @@ -25,6 +25,11 @@ func resourceComputeInstanceGroupManager() *schema.Resource { Importer: &schema.ResourceImporter{ State: resourceInstanceGroupManagerStateImporter, }, + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(5 * time.Minute), + Update: schema.DefaultTimeout(5 * time.Minute), + Delete: schema.DefaultTimeout(15 * time.Minute), + }, Schema: map[string]*schema.Schema{ "base_instance_name": &schema.Schema{ @@ -394,7 +399,8 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte d.SetId(id) // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Creating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Creating InstanceGroupManager") if err != nil { return err } @@ -553,7 +559,7 @@ func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interf // Updates an instance group manager by applying the update strategy (REPLACE, RESTART) // and rolling update policy (PROACTIVE, OPPORTUNISTIC). Updates performed by API // are OPPORTUNISTIC by default. -func performZoneUpdate(config *Config, id string, updateStrategy string, project string, zone string) error { +func performZoneUpdate(d *schema.ResourceData, config *Config, id string, updateStrategy string, project string, zone string) error { if updateStrategy == "RESTART" || updateStrategy == "REPLACE" { managedInstances, err := config.clientComputeBeta.InstanceGroupManagers.ListManagedInstances(project, zone, id).Do() if err != nil { @@ -576,7 +582,8 @@ func performZoneUpdate(config *Config, id string, updateStrategy string, project } // Wait for the operation to complete - err = computeSharedOperationWaitTime(config.clientCompute, op, project, managedInstanceCount*4, "Restarting InstanceGroupManagers instances") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Restarting InstanceGroupManagers instances") if err != nil { return err } @@ -620,7 +627,8 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte } // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating InstanceGroupManager") if err != nil { return err } @@ -646,7 +654,8 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte } // Wait for the operation to complete: - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating InstanceGroupManager") if err != nil { return err } @@ -664,7 +673,8 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte } // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating InstanceGroupManager") if err != nil { return err } @@ -686,13 +696,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte } // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating InstanceGroupManager") if err != nil { return err } updateStrategy := d.Get("update_strategy").(string) - err = performZoneUpdate(config, name, updateStrategy, project, zone) + err = performZoneUpdate(d, config, name, updateStrategy, project, zone) if err != nil { return err } @@ -749,7 +760,8 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte return fmt.Errorf("Error updating managed group instances: %s", err) } - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating managed group instances") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating managed group instances") if err != nil { return err } @@ -774,7 +786,8 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte } // Wait for the operation to complete: - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating InstanceGroupManager") if err != nil { return err } @@ -791,7 +804,8 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte } // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating InstanceGroupManager") if err != nil { return err } @@ -830,7 +844,8 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte currentSize := int64(d.Get("target_size").(int)) // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutDelete).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Deleting InstanceGroupManager") for err != nil && currentSize > 0 { if !strings.Contains(err.Error(), "timeout") { @@ -851,7 +866,8 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte log.Printf("[INFO] timeout occurred, but instance group is shrinking (%d < %d)", instanceGroupSize, currentSize) currentSize = instanceGroupSize - err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutDelete).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Deleting InstanceGroupManager") } d.SetId("") diff --git a/third_party/terraform/resources/resource_compute_region_instance_group_manager.go.erb b/third_party/terraform/resources/resource_compute_region_instance_group_manager.go.erb index 75f0427b3016..208a5531d7a9 100644 --- a/third_party/terraform/resources/resource_compute_region_instance_group_manager.go.erb +++ b/third_party/terraform/resources/resource_compute_region_instance_group_manager.go.erb @@ -375,7 +375,8 @@ func resourceComputeRegionInstanceGroupManagerCreate(d *schema.ResourceData, met d.SetId(regionInstanceGroupManagerId{Project: project, Region: region, Name: manager.Name}.terraformId()) // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Creating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutCreate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Creating InstanceGroupManager") if err != nil { return err } @@ -539,7 +540,8 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met } // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating RegionInstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating RegionInstanceGroupManager") if err != nil { return err } @@ -561,7 +563,8 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met } // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating InstanceGroupManager") if err != nil { return err } @@ -585,7 +588,8 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met } // Wait for the operation to complete: - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating RegionInstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating RegionInstanceGroupManager") if err != nil { return err } @@ -603,7 +607,8 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met } // Wait for the operation to complete - err = computeSharedOperationWait(config.clientCompute, op, project, "Resizing RegionInstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Resizing RegionInstanceGroupManager") if err != nil { return err } @@ -661,7 +666,8 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met return fmt.Errorf("Error updating region managed group instances: %s", err) } - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating region managed group instances") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating region managed group instances") if err != nil { return err } @@ -682,7 +688,8 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met return fmt.Errorf("Error updating RegionInstanceGroupManager: %s", err) } - err = computeSharedOperationWait(config.clientCompute, op, project, "Updating RegionInstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Updating RegionInstanceGroupManager") if err != nil { return err } @@ -698,7 +705,8 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met return fmt.Errorf("Error resizing RegionInstanceGroupManager: %s", err) } - err = computeSharedOperationWait(config.clientCompute, op, project, "Resizing RegionInstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutUpdate).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Resizing RegionInstanceGroupManager") if err != nil { return err } @@ -737,7 +745,8 @@ func resourceComputeRegionInstanceGroupManagerDelete(d *schema.ResourceData, met } // Wait for the operation to complete - err = computeSharedOperationWaitTime(config.clientCompute, op, regionalID.Project, int(d.Timeout(schema.TimeoutDelete).Minutes()), "Deleting RegionInstanceGroupManager") + timeoutInMinutes := int(d.Timeout(schema.TimeoutDelete).Minutes()) + err = computeSharedOperationWaitTime(config.clientCompute, op, regionalID.Project, timeoutInMinutes, "Deleting RegionInstanceGroupManager") if err != nil { return fmt.Errorf("Error waiting for delete to complete: %s", err) } diff --git a/third_party/terraform/website/docs/r/compute_instance_group_manager.html.markdown b/third_party/terraform/website/docs/r/compute_instance_group_manager.html.markdown index 4eed505a7147..21b2771b528c 100644 --- a/third_party/terraform/website/docs/r/compute_instance_group_manager.html.markdown +++ b/third_party/terraform/website/docs/r/compute_instance_group_manager.html.markdown @@ -237,6 +237,16 @@ exported: * `self_link` - The URL of the created resource. +## Timeouts + +This resource provides the following +[Timeouts](/docs/configuration/resources.html#timeouts) configuration options: + +- `create` - Default is 5 minutes. +- `update` - Default is 5 minutes. +- `delete` - Default is 15 minutes. + + ## Import Instance group managers can be imported using any of these accepted formats: diff --git a/third_party/terraform/website/docs/r/compute_region_instance_group_manager.html.markdown b/third_party/terraform/website/docs/r/compute_region_instance_group_manager.html.markdown index dcf4dc116a86..d4a373ae46d3 100644 --- a/third_party/terraform/website/docs/r/compute_region_instance_group_manager.html.markdown +++ b/third_party/terraform/website/docs/r/compute_region_instance_group_manager.html.markdown @@ -233,6 +233,16 @@ exported: * `self_link` - The URL of the created resource. +## Timeouts + +This resource provides the following +[Timeouts](/docs/configuration/resources.html#timeouts) configuration options: + +- `create` - Default is 5 minutes. +- `update` - Default is 5 minutes. +- `delete` - Default is 15 minutes. + + ## Import Instance group managers can be imported using the `name`, e.g.