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