Skip to content

Commit 1b51b7e

Browse files
rileykarsonDmitry Vlasov
authored and
Dmitry Vlasov
committed
Add Beta support for auto_healing_policies to instance group manager. (hashicorp#249)
* Add support for auto_healing_policies to google_compute_instance_group_manager. * Add a test for self link stability when a v1 resource uses a versioned resource. * Add a comment about what the stable self link test does. * make fmt * Fixed formatting on new tests. * Address review comments. * Fix make vet
1 parent 325fcfe commit 1b51b7e

3 files changed

+333
-4
lines changed

google/resource_compute_instance_group_manager.go

+82-4
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import (
77
"time"
88

99
"github.com/hashicorp/terraform/helper/schema"
10+
"github.com/hashicorp/terraform/helper/validation"
1011

1112
computeBeta "google.golang.org/api/compute/v0.beta"
1213
"google.golang.org/api/compute/v1"
1314
)
1415

1516
var InstanceGroupManagerBaseApiVersion = v1
17+
var InstanceGroupManagerVersionedFeatures = []Feature{Feature{Version: v0beta, Item: "auto_healing_policies"}}
1618

1719
func resourceComputeInstanceGroupManager() *schema.Resource {
1820
return &schema.Resource{
@@ -116,6 +118,27 @@ func resourceComputeInstanceGroupManager() *schema.Resource {
116118
Computed: true,
117119
Optional: true,
118120
},
121+
122+
"auto_healing_policies": &schema.Schema{
123+
Type: schema.TypeList,
124+
Optional: true,
125+
MaxItems: 1,
126+
Elem: &schema.Resource{
127+
Schema: map[string]*schema.Schema{
128+
"health_check": &schema.Schema{
129+
Type: schema.TypeString,
130+
Required: true,
131+
DiffSuppressFunc: compareSelfLinkRelativePaths,
132+
},
133+
134+
"initial_delay_sec": &schema.Schema{
135+
Type: schema.TypeInt,
136+
Required: true,
137+
ValidateFunc: validation.IntBetween(0, 3600),
138+
},
139+
},
140+
},
141+
},
119142
},
120143
}
121144
}
@@ -147,7 +170,7 @@ func getNamedPortsBeta(nps []interface{}) []*computeBeta.NamedPort {
147170
}
148171

149172
func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta interface{}) error {
150-
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, []Feature{})
173+
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures)
151174
config := meta.(*Config)
152175

153176
project, err := getProject(d, config)
@@ -192,6 +215,10 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte
192215
return fmt.Errorf("Update strategy must be \"NONE\" or \"RESTART\"")
193216
}
194217

218+
if v, ok := d.GetOk("auto_healing_policies"); ok {
219+
manager.AutoHealingPolicies = expandAutoHealingPolicies(v.([]interface{}))
220+
}
221+
195222
log.Printf("[DEBUG] InstanceGroupManager insert request: %#v", manager)
196223
var op interface{}
197224
switch computeApiVersion {
@@ -246,7 +273,7 @@ func flattenNamedPortsBeta(namedPorts []*computeBeta.NamedPort) []map[string]int
246273
}
247274

248275
func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interface{}) error {
249-
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, []Feature{})
276+
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures)
250277
config := meta.(*Config)
251278

252279
project, err := getProject(d, config)
@@ -354,12 +381,13 @@ func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interf
354381
update_strategy = "RESTART"
355382
}
356383
d.Set("update_strategy", update_strategy.(string))
384+
d.Set("auto_healing_policies", flattenAutoHealingPolicies(manager.AutoHealingPolicies))
357385

358386
return nil
359387
}
360388

361389
func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta interface{}) error {
362-
computeApiVersion := getComputeApiVersionUpdate(d, InstanceGroupManagerBaseApiVersion, []Feature{}, []Feature{})
390+
computeApiVersion := getComputeApiVersionUpdate(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures, []Feature{})
363391
config := meta.(*Config)
364392

365393
project, err := getProject(d, config)
@@ -604,13 +632,36 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
604632
d.SetPartial("target_size")
605633
}
606634

635+
// We will always be in v0beta inside this conditional
636+
if d.HasChange("auto_healing_policies") {
637+
setAutoHealingPoliciesRequest := &computeBeta.InstanceGroupManagersSetAutoHealingRequest{}
638+
if v, ok := d.GetOk("auto_healing_policies"); ok {
639+
setAutoHealingPoliciesRequest.AutoHealingPolicies = expandAutoHealingPolicies(v.([]interface{}))
640+
}
641+
642+
op, err := config.clientComputeBeta.InstanceGroupManagers.SetAutoHealingPolicies(
643+
project, d.Get("zone").(string), d.Id(), setAutoHealingPoliciesRequest).Do()
644+
645+
if err != nil {
646+
return fmt.Errorf("Error updating AutoHealingPolicies: %s", err)
647+
}
648+
649+
// Wait for the operation to complete
650+
err = computeSharedOperationWaitZone(config, op, project, d.Get("zone").(string), "Updating AutoHealingPolicies")
651+
if err != nil {
652+
return err
653+
}
654+
655+
d.SetPartial("auto_healing_policies")
656+
}
657+
607658
d.Partial(false)
608659

609660
return resourceComputeInstanceGroupManagerRead(d, meta)
610661
}
611662

612663
func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta interface{}) error {
613-
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, []Feature{})
664+
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures)
614665
config := meta.(*Config)
615666

616667
project, err := getProject(d, config)
@@ -686,3 +737,30 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
686737
d.SetId("")
687738
return nil
688739
}
740+
741+
func expandAutoHealingPolicies(configured []interface{}) []*computeBeta.InstanceGroupManagerAutoHealingPolicy {
742+
autoHealingPolicies := make([]*computeBeta.InstanceGroupManagerAutoHealingPolicy, 0, len(configured))
743+
for _, raw := range configured {
744+
data := raw.(map[string]interface{})
745+
autoHealingPolicy := computeBeta.InstanceGroupManagerAutoHealingPolicy{
746+
HealthCheck: data["health_check"].(string),
747+
InitialDelaySec: int64(data["initial_delay_sec"].(int)),
748+
}
749+
750+
autoHealingPolicies = append(autoHealingPolicies, &autoHealingPolicy)
751+
}
752+
return autoHealingPolicies
753+
}
754+
755+
func flattenAutoHealingPolicies(autoHealingPolicies []*computeBeta.InstanceGroupManagerAutoHealingPolicy) []map[string]interface{} {
756+
autoHealingPoliciesSchema := make([]map[string]interface{}, 0, len(autoHealingPolicies))
757+
for _, autoHealingPolicy := range autoHealingPolicies {
758+
data := map[string]interface{}{
759+
"health_check": autoHealingPolicy.HealthCheck,
760+
"initial_delay_sec": autoHealingPolicy.InitialDelaySec,
761+
}
762+
763+
autoHealingPoliciesSchema = append(autoHealingPoliciesSchema, data)
764+
}
765+
return autoHealingPoliciesSchema
766+
}

0 commit comments

Comments
 (0)