provider/google: Fix instance group manager instance restart policy

This commit is contained in:
Lars Wander 2015-11-12 15:44:31 -05:00
parent e07e2b583d
commit 0d6c40a454
2 changed files with 45 additions and 1 deletions

View File

@ -134,6 +134,10 @@ func computeOperationWaitRegion(config *Config, op *compute.Operation, region, a
} }
func computeOperationWaitZone(config *Config, op *compute.Operation, zone, activity string) error { func computeOperationWaitZone(config *Config, op *compute.Operation, zone, activity string) error {
return computeOperationWaitZoneTime(config, op, zone, 4, activity)
}
func computeOperationWaitZoneTime(config *Config, op *compute.Operation, zone string, minutes int, activity string) error {
w := &ComputeOperationWaiter{ w := &ComputeOperationWaiter{
Service: config.clientCompute, Service: config.clientCompute,
Op: op, Op: op,
@ -143,7 +147,7 @@ func computeOperationWaitZone(config *Config, op *compute.Operation, zone, activ
} }
state := w.Conf() state := w.Conf()
state.Delay = 10 * time.Second state.Delay = 10 * time.Second
state.Timeout = 4 * time.Minute state.Timeout = time.Duration(minutes) * time.Minute
state.MinTimeout = 2 * time.Second state.MinTimeout = 2 * time.Second
opRaw, err := state.WaitForState() opRaw, err := state.WaitForState()
if err != nil { if err != nil {

View File

@ -53,6 +53,12 @@ func resourceComputeInstanceGroupManager() *schema.Resource {
Required: true, Required: true,
}, },
"update_strategy": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Default: "RESTART",
},
"target_pools": &schema.Schema{ "target_pools": &schema.Schema{
Type: schema.TypeSet, Type: schema.TypeSet,
Optional: true, Optional: true,
@ -112,6 +118,11 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte
manager.TargetPools = s manager.TargetPools = s
} }
updateStrategy := d.Get("update_strategy").(string)
if !(updateStrategy == "NONE" || updateStrategy == "RESTART") {
return fmt.Errorf("Update strategy must be \"NONE\" or \"RESTART\"")
}
log.Printf("[DEBUG] InstanceGroupManager insert request: %#v", manager) log.Printf("[DEBUG] InstanceGroupManager insert request: %#v", manager)
op, err := config.clientCompute.InstanceGroupManagers.Insert( op, err := config.clientCompute.InstanceGroupManagers.Insert(
config.Project, d.Get("zone").(string), manager).Do() config.Project, d.Get("zone").(string), manager).Do()
@ -209,6 +220,35 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
return err return err
} }
if d.Get("update_strategy").(string) == "RESTART" {
managedInstances, err := config.clientCompute.InstanceGroupManagers.ListManagedInstances(
config.Project, d.Get("zone").(string), d.Id()).Do()
managedInstanceCount := len(managedInstances.ManagedInstances)
instances := make([]string, managedInstanceCount)
for i, v := range managedInstances.ManagedInstances {
instances[i] = v.Instance
}
recreateInstances := &compute.InstanceGroupManagersRecreateInstancesRequest{
Instances: instances,
}
op, err = config.clientCompute.InstanceGroupManagers.RecreateInstances(
config.Project, d.Get("zone").(string), d.Id(), recreateInstances).Do()
if err != nil {
return fmt.Errorf("Error restarting instance group managers instances: %s", err)
}
// Wait for the operation to complete
err = computeOperationWaitZoneTime(config, op, d.Get("zone").(string),
managedInstanceCount * 4, "Restarting InstanceGroupManagers instances")
if err != nil {
return err
}
}
d.SetPartial("instance_template") d.SetPartial("instance_template")
} }