Skip to content

Commit

Permalink
Add Beta support for auto_healing_policies to instance group manager. (
Browse files Browse the repository at this point in the history
…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
  • Loading branch information
rileykarson authored and Dmitry Vlasov committed Aug 15, 2017
1 parent 325fcfe commit 1b51b7e
Show file tree
Hide file tree
Showing 3 changed files with 333 additions and 4 deletions.
86 changes: 82 additions & 4 deletions google/resource_compute_instance_group_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ import (
"time"

"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/helper/validation"

computeBeta "google.golang.org/api/compute/v0.beta"
"google.golang.org/api/compute/v1"
)

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

func resourceComputeInstanceGroupManager() *schema.Resource {
return &schema.Resource{
Expand Down Expand Up @@ -116,6 +118,27 @@ func resourceComputeInstanceGroupManager() *schema.Resource {
Computed: true,
Optional: true,
},

"auto_healing_policies": &schema.Schema{
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"health_check": &schema.Schema{
Type: schema.TypeString,
Required: true,
DiffSuppressFunc: compareSelfLinkRelativePaths,
},

"initial_delay_sec": &schema.Schema{
Type: schema.TypeInt,
Required: true,
ValidateFunc: validation.IntBetween(0, 3600),
},
},
},
},
},
}
}
Expand Down Expand Up @@ -147,7 +170,7 @@ func getNamedPortsBeta(nps []interface{}) []*computeBeta.NamedPort {
}

func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta interface{}) error {
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, []Feature{})
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures)
config := meta.(*Config)

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

if v, ok := d.GetOk("auto_healing_policies"); ok {
manager.AutoHealingPolicies = expandAutoHealingPolicies(v.([]interface{}))
}

log.Printf("[DEBUG] InstanceGroupManager insert request: %#v", manager)
var op interface{}
switch computeApiVersion {
Expand Down Expand Up @@ -246,7 +273,7 @@ func flattenNamedPortsBeta(namedPorts []*computeBeta.NamedPort) []map[string]int
}

func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interface{}) error {
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, []Feature{})
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures)
config := meta.(*Config)

project, err := getProject(d, config)
Expand Down Expand Up @@ -354,12 +381,13 @@ func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interf
update_strategy = "RESTART"
}
d.Set("update_strategy", update_strategy.(string))
d.Set("auto_healing_policies", flattenAutoHealingPolicies(manager.AutoHealingPolicies))

return nil
}

func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta interface{}) error {
computeApiVersion := getComputeApiVersionUpdate(d, InstanceGroupManagerBaseApiVersion, []Feature{}, []Feature{})
computeApiVersion := getComputeApiVersionUpdate(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures, []Feature{})
config := meta.(*Config)

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

// We will always be in v0beta inside this conditional
if d.HasChange("auto_healing_policies") {
setAutoHealingPoliciesRequest := &computeBeta.InstanceGroupManagersSetAutoHealingRequest{}
if v, ok := d.GetOk("auto_healing_policies"); ok {
setAutoHealingPoliciesRequest.AutoHealingPolicies = expandAutoHealingPolicies(v.([]interface{}))
}

op, err := config.clientComputeBeta.InstanceGroupManagers.SetAutoHealingPolicies(
project, d.Get("zone").(string), d.Id(), setAutoHealingPoliciesRequest).Do()

if err != nil {
return fmt.Errorf("Error updating AutoHealingPolicies: %s", err)
}

// Wait for the operation to complete
err = computeSharedOperationWaitZone(config, op, project, d.Get("zone").(string), "Updating AutoHealingPolicies")
if err != nil {
return err
}

d.SetPartial("auto_healing_policies")
}

d.Partial(false)

return resourceComputeInstanceGroupManagerRead(d, meta)
}

func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta interface{}) error {
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, []Feature{})
computeApiVersion := getComputeApiVersion(d, InstanceGroupManagerBaseApiVersion, InstanceGroupManagerVersionedFeatures)
config := meta.(*Config)

project, err := getProject(d, config)
Expand Down Expand Up @@ -686,3 +737,30 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
d.SetId("")
return nil
}

func expandAutoHealingPolicies(configured []interface{}) []*computeBeta.InstanceGroupManagerAutoHealingPolicy {
autoHealingPolicies := make([]*computeBeta.InstanceGroupManagerAutoHealingPolicy, 0, len(configured))
for _, raw := range configured {
data := raw.(map[string]interface{})
autoHealingPolicy := computeBeta.InstanceGroupManagerAutoHealingPolicy{
HealthCheck: data["health_check"].(string),
InitialDelaySec: int64(data["initial_delay_sec"].(int)),
}

autoHealingPolicies = append(autoHealingPolicies, &autoHealingPolicy)
}
return autoHealingPolicies
}

func flattenAutoHealingPolicies(autoHealingPolicies []*computeBeta.InstanceGroupManagerAutoHealingPolicy) []map[string]interface{} {
autoHealingPoliciesSchema := make([]map[string]interface{}, 0, len(autoHealingPolicies))
for _, autoHealingPolicy := range autoHealingPolicies {
data := map[string]interface{}{
"health_check": autoHealingPolicy.HealthCheck,
"initial_delay_sec": autoHealingPolicy.InitialDelaySec,
}

autoHealingPoliciesSchema = append(autoHealingPoliciesSchema, data)
}
return autoHealingPoliciesSchema
}
Loading

0 comments on commit 1b51b7e

Please sign in to comment.