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(¶ms) 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(¶ms) 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(¶ms); 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(¶ms) 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 }