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