143 lines
3.7 KiB
Go
143 lines
3.7 KiB
Go
|
package aws
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"log"
|
||
|
|
||
|
"github.com/aws/aws-sdk-go/aws"
|
||
|
"github.com/aws/aws-sdk-go/service/autoscaling"
|
||
|
"github.com/hashicorp/terraform/helper/schema"
|
||
|
)
|
||
|
|
||
|
func resourceAwsAutoscalingMetric() *schema.Resource {
|
||
|
return &schema.Resource{
|
||
|
Create: resourceAwsAutoscalingMetricCreate,
|
||
|
Read: resourceAwsAutoscalingMetricRead,
|
||
|
Update: resourceAwsAutoscalingMetricUpdate,
|
||
|
Delete: resourceAwsAutoscalingMetricDelete,
|
||
|
|
||
|
Schema: map[string]*schema.Schema{
|
||
|
"autoscaling_group_name": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Required: true,
|
||
|
ForceNew: true,
|
||
|
},
|
||
|
|
||
|
"metrics": &schema.Schema{
|
||
|
Type: schema.TypeSet,
|
||
|
Required: true,
|
||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||
|
Set: schema.HashString,
|
||
|
},
|
||
|
|
||
|
"granularity": &schema.Schema{
|
||
|
Type: schema.TypeString,
|
||
|
Required: true,
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func resourceAwsAutoscalingMetricCreate(d *schema.ResourceData, meta interface{}) error {
|
||
|
conn := meta.(*AWSClient).autoscalingconn
|
||
|
|
||
|
asgName := d.Get("autoscaling_group_name").(string)
|
||
|
props := &autoscaling.EnableMetricsCollectionInput{
|
||
|
AutoScalingGroupName: aws.String(asgName),
|
||
|
Granularity: aws.String(d.Get("granularity").(string)),
|
||
|
Metrics: expandStringList(d.Get("metrics").(*schema.Set).List()),
|
||
|
}
|
||
|
|
||
|
log.Printf("[INFO] Enabling metrics collection for the ASG: %s", asgName)
|
||
|
_, err := conn.EnableMetricsCollection(props)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
d.SetId(d.Get("autoscaling_group_name").(string))
|
||
|
|
||
|
return resourceAwsAutoscalingMetricRead(d, meta)
|
||
|
}
|
||
|
|
||
|
func resourceAwsAutoscalingMetricRead(d *schema.ResourceData, meta interface{}) error {
|
||
|
conn := meta.(*AWSClient).autoscalingconn
|
||
|
|
||
|
g, err := getAwsAutoscalingGroup(d.Get("autoscaling_group_name").(string), conn)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if g == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
if g.EnabledMetrics != nil && len(g.EnabledMetrics) > 0 {
|
||
|
if err := d.Set("metrics", flattenAsgEnabledMetrics(g.EnabledMetrics)); err != nil {
|
||
|
log.Printf("[WARN] Error setting metrics for (%s): %s", d.Id(), err)
|
||
|
}
|
||
|
d.Set("granularity", g.EnabledMetrics[0].Granularity)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func resourceAwsAutoscalingMetricUpdate(d *schema.ResourceData, meta interface{}) error {
|
||
|
conn := meta.(*AWSClient).autoscalingconn
|
||
|
|
||
|
if d.HasChange("metrics") {
|
||
|
o, n := d.GetChange("metrics")
|
||
|
if o == nil {
|
||
|
o = new(schema.Set)
|
||
|
}
|
||
|
if n == nil {
|
||
|
n = new(schema.Set)
|
||
|
}
|
||
|
|
||
|
os := o.(*schema.Set)
|
||
|
ns := n.(*schema.Set)
|
||
|
|
||
|
disableMetrics := os.Difference(ns)
|
||
|
if disableMetrics.Len() != 0 {
|
||
|
props := &autoscaling.DisableMetricsCollectionInput{
|
||
|
AutoScalingGroupName: aws.String(d.Id()),
|
||
|
Metrics: expandStringList(disableMetrics.List()),
|
||
|
}
|
||
|
|
||
|
_, err := conn.DisableMetricsCollection(props)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Failure to Disable metrics collection types for ASG %s: %s", d.Id(), err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
enabledMetrics := ns.Difference(os)
|
||
|
if enabledMetrics.Len() != 0 {
|
||
|
props := &autoscaling.EnableMetricsCollectionInput{
|
||
|
AutoScalingGroupName: aws.String(d.Id()),
|
||
|
Metrics: expandStringList(enabledMetrics.List()),
|
||
|
}
|
||
|
|
||
|
_, err := conn.EnableMetricsCollection(props)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("Failure to Enable metrics collection types for ASG %s: %s", d.Id(), err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return resourceAwsAutoscalingMetricRead(d, meta)
|
||
|
}
|
||
|
|
||
|
func resourceAwsAutoscalingMetricDelete(d *schema.ResourceData, meta interface{}) error {
|
||
|
conn := meta.(*AWSClient).autoscalingconn
|
||
|
|
||
|
props := &autoscaling.DisableMetricsCollectionInput{
|
||
|
AutoScalingGroupName: aws.String(d.Id()),
|
||
|
}
|
||
|
|
||
|
log.Printf("[INFO] Disabling ALL metrics collection for the ASG: %s", d.Id())
|
||
|
_, err := conn.DisableMetricsCollection(props)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|