github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  	"github.com/aws/aws-sdk-go/service/cloudwatch"
    11  )
    12  
    13  func resourceAwsCloudWatchMetricAlarm() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceAwsCloudWatchMetricAlarmCreate,
    16  		Read:   resourceAwsCloudWatchMetricAlarmRead,
    17  		Update: resourceAwsCloudWatchMetricAlarmUpdate,
    18  		Delete: resourceAwsCloudWatchMetricAlarmDelete,
    19  
    20  		Schema: map[string]*schema.Schema{
    21  			"alarm_name": &schema.Schema{
    22  				Type:     schema.TypeString,
    23  				Required: true,
    24  				ForceNew: true,
    25  			},
    26  			"comparison_operator": &schema.Schema{
    27  				Type:     schema.TypeString,
    28  				Required: true,
    29  			},
    30  			"evaluation_periods": &schema.Schema{
    31  				Type:     schema.TypeInt,
    32  				Required: true,
    33  			},
    34  			"metric_name": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  			},
    38  			"namespace": &schema.Schema{
    39  				Type:     schema.TypeString,
    40  				Required: true,
    41  			},
    42  			"period": &schema.Schema{
    43  				Type:     schema.TypeInt,
    44  				Required: true,
    45  			},
    46  			"statistic": &schema.Schema{
    47  				Type:     schema.TypeString,
    48  				Required: true,
    49  			},
    50  			"threshold": &schema.Schema{
    51  				Type:     schema.TypeFloat,
    52  				Required: true,
    53  			},
    54  			"actions_enabled": &schema.Schema{
    55  				Type:     schema.TypeBool,
    56  				Optional: true,
    57  				Default:  true,
    58  			},
    59  			"alarm_actions": &schema.Schema{
    60  				Type:     schema.TypeSet,
    61  				Optional: true,
    62  				Elem:     &schema.Schema{Type: schema.TypeString},
    63  				Set:      schema.HashString,
    64  			},
    65  			"alarm_description": &schema.Schema{
    66  				Type:     schema.TypeString,
    67  				Optional: true,
    68  			},
    69  			"dimensions": &schema.Schema{
    70  				Type:     schema.TypeMap,
    71  				Optional: true,
    72  			},
    73  			"insufficient_data_actions": &schema.Schema{
    74  				Type:     schema.TypeSet,
    75  				Optional: true,
    76  				Elem:     &schema.Schema{Type: schema.TypeString},
    77  				Set:      schema.HashString,
    78  			},
    79  			"ok_actions": &schema.Schema{
    80  				Type:     schema.TypeSet,
    81  				Optional: true,
    82  				Elem:     &schema.Schema{Type: schema.TypeString},
    83  				Set:      schema.HashString,
    84  			},
    85  			"unit": &schema.Schema{
    86  				Type:     schema.TypeString,
    87  				Optional: true,
    88  			},
    89  		},
    90  	}
    91  }
    92  
    93  func resourceAwsCloudWatchMetricAlarmCreate(d *schema.ResourceData, meta interface{}) error {
    94  	conn := meta.(*AWSClient).cloudwatchconn
    95  
    96  	params := getAwsCloudWatchPutMetricAlarmInput(d)
    97  
    98  	log.Printf("[DEBUG] Creating CloudWatch Metric Alarm: %#v", params)
    99  	_, err := conn.PutMetricAlarm(&params)
   100  	if err != nil {
   101  		return fmt.Errorf("Creating metric alarm failed: %s", err)
   102  	}
   103  	d.SetId(d.Get("alarm_name").(string))
   104  	log.Println("[INFO] CloudWatch Metric Alarm created")
   105  
   106  	return resourceAwsCloudWatchMetricAlarmRead(d, meta)
   107  }
   108  
   109  func resourceAwsCloudWatchMetricAlarmRead(d *schema.ResourceData, meta interface{}) error {
   110  	a, err := getAwsCloudWatchMetricAlarm(d, meta)
   111  	if err != nil {
   112  		return err
   113  	}
   114  	if a == nil {
   115  		d.SetId("")
   116  		return nil
   117  	}
   118  
   119  	log.Printf("[DEBUG] Reading CloudWatch Metric Alarm: %s", d.Get("alarm_name"))
   120  
   121  	d.Set("actions_enabled", a.ActionsEnabled)
   122  
   123  	if err := d.Set("alarm_actions", _strArrPtrToList(a.AlarmActions)); err != nil {
   124  		log.Printf("[WARN] Error setting Alarm Actions: %s", err)
   125  	}
   126  	d.Set("alarm_description", a.AlarmDescription)
   127  	d.Set("alarm_name", a.AlarmName)
   128  	d.Set("comparison_operator", a.ComparisonOperator)
   129  	d.Set("dimensions", a.Dimensions)
   130  	d.Set("evaluation_periods", a.EvaluationPeriods)
   131  
   132  	if err := d.Set("insufficient_data_actions", _strArrPtrToList(a.InsufficientDataActions)); err != nil {
   133  		log.Printf("[WARN] Error setting Insufficient Data Actions: %s", err)
   134  	}
   135  	d.Set("metric_name", a.MetricName)
   136  	d.Set("namespace", a.Namespace)
   137  
   138  	if err := d.Set("ok_actions", _strArrPtrToList(a.OKActions)); err != nil {
   139  		log.Printf("[WARN] Error setting OK Actions: %s", err)
   140  	}
   141  	d.Set("period", a.Period)
   142  	d.Set("statistic", a.Statistic)
   143  	d.Set("threshold", a.Threshold)
   144  	d.Set("unit", a.Unit)
   145  
   146  	return nil
   147  }
   148  
   149  func resourceAwsCloudWatchMetricAlarmUpdate(d *schema.ResourceData, meta interface{}) error {
   150  	conn := meta.(*AWSClient).cloudwatchconn
   151  	params := getAwsCloudWatchPutMetricAlarmInput(d)
   152  
   153  	log.Printf("[DEBUG] Updating CloudWatch Metric Alarm: %#v", params)
   154  	_, err := conn.PutMetricAlarm(&params)
   155  	if err != nil {
   156  		return fmt.Errorf("Updating metric alarm failed: %s", err)
   157  	}
   158  	log.Println("[INFO] CloudWatch Metric Alarm updated")
   159  
   160  	return resourceAwsCloudWatchMetricAlarmRead(d, meta)
   161  }
   162  
   163  func resourceAwsCloudWatchMetricAlarmDelete(d *schema.ResourceData, meta interface{}) error {
   164  	p, err := getAwsCloudWatchMetricAlarm(d, meta)
   165  	if err != nil {
   166  		return err
   167  	}
   168  	if p == nil {
   169  		log.Printf("[DEBUG] CloudWatch Metric Alarm %s is already gone", d.Id())
   170  		return nil
   171  	}
   172  
   173  	log.Printf("[INFO] Deleting CloudWatch Metric Alarm: %s", d.Id())
   174  
   175  	conn := meta.(*AWSClient).cloudwatchconn
   176  	params := cloudwatch.DeleteAlarmsInput{
   177  		AlarmNames: []*string{aws.String(d.Id())},
   178  	}
   179  
   180  	if _, err := conn.DeleteAlarms(&params); err != nil {
   181  		return fmt.Errorf("Error deleting CloudWatch Metric Alarm: %s", err)
   182  	}
   183  	log.Println("[INFO] CloudWatch Metric Alarm deleted")
   184  
   185  	d.SetId("")
   186  	return nil
   187  }
   188  
   189  func getAwsCloudWatchPutMetricAlarmInput(d *schema.ResourceData) cloudwatch.PutMetricAlarmInput {
   190  	params := cloudwatch.PutMetricAlarmInput{
   191  		AlarmName:          aws.String(d.Get("alarm_name").(string)),
   192  		ComparisonOperator: aws.String(d.Get("comparison_operator").(string)),
   193  		EvaluationPeriods:  aws.Int64(int64(d.Get("evaluation_periods").(int))),
   194  		MetricName:         aws.String(d.Get("metric_name").(string)),
   195  		Namespace:          aws.String(d.Get("namespace").(string)),
   196  		Period:             aws.Int64(int64(d.Get("period").(int))),
   197  		Statistic:          aws.String(d.Get("statistic").(string)),
   198  		Threshold:          aws.Float64(d.Get("threshold").(float64)),
   199  	}
   200  
   201  	if v := d.Get("actions_enabled"); v != nil {
   202  		params.ActionsEnabled = aws.Bool(v.(bool))
   203  	}
   204  
   205  	if v, ok := d.GetOk("alarm_description"); ok {
   206  		params.AlarmDescription = aws.String(v.(string))
   207  	}
   208  
   209  	if v, ok := d.GetOk("unit"); ok {
   210  		params.Unit = aws.String(v.(string))
   211  	}
   212  
   213  	var alarmActions []*string
   214  	if v := d.Get("alarm_actions"); v != nil {
   215  		for _, v := range v.(*schema.Set).List() {
   216  			str := v.(string)
   217  			alarmActions = append(alarmActions, aws.String(str))
   218  		}
   219  		params.AlarmActions = alarmActions
   220  	}
   221  
   222  	var insufficientDataActions []*string
   223  	if v := d.Get("insufficient_data_actions"); v != nil {
   224  		for _, v := range v.(*schema.Set).List() {
   225  			str := v.(string)
   226  			insufficientDataActions = append(insufficientDataActions, aws.String(str))
   227  		}
   228  		params.InsufficientDataActions = insufficientDataActions
   229  	}
   230  
   231  	var okActions []*string
   232  	if v := d.Get("ok_actions"); v != nil {
   233  		for _, v := range v.(*schema.Set).List() {
   234  			str := v.(string)
   235  			okActions = append(okActions, aws.String(str))
   236  		}
   237  		params.OKActions = okActions
   238  	}
   239  
   240  	a := d.Get("dimensions").(map[string]interface{})
   241  	dimensions := make([]*cloudwatch.Dimension, 0, len(a))
   242  	for k, v := range a {
   243  		dimensions = append(dimensions, &cloudwatch.Dimension{
   244  			Name:  aws.String(k),
   245  			Value: aws.String(v.(string)),
   246  		})
   247  	}
   248  	params.Dimensions = dimensions
   249  
   250  	return params
   251  }
   252  
   253  func getAwsCloudWatchMetricAlarm(d *schema.ResourceData, meta interface{}) (*cloudwatch.MetricAlarm, error) {
   254  	conn := meta.(*AWSClient).cloudwatchconn
   255  
   256  	params := cloudwatch.DescribeAlarmsInput{
   257  		AlarmNames: []*string{aws.String(d.Id())},
   258  	}
   259  
   260  	resp, err := conn.DescribeAlarms(&params)
   261  	if err != nil {
   262  		return nil, nil
   263  	}
   264  
   265  	// Find it and return it
   266  	for idx, ma := range resp.MetricAlarms {
   267  		if *ma.AlarmName == d.Id() {
   268  			return resp.MetricAlarms[idx], nil
   269  		}
   270  	}
   271  
   272  	return nil, nil
   273  }
   274  
   275  func _strArrPtrToList(strArrPtr []*string) []string {
   276  	var result []string
   277  	for _, elem := range strArrPtr {
   278  		result = append(result, *elem)
   279  	}
   280  	return result
   281  }