mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-24 23:46:26 -06:00
2449b45087
They're structs that need to be unrolled and d.Set was silently failing on them before. This enhances the basic test to cover the change.
295 lines
8.0 KiB
Go
295 lines
8.0 KiB
Go
package aws
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
"github.com/aws/aws-sdk-go/service/cloudwatch"
|
|
)
|
|
|
|
func resourceAwsCloudWatchMetricAlarm() *schema.Resource {
|
|
return &schema.Resource{
|
|
Create: resourceAwsCloudWatchMetricAlarmCreate,
|
|
Read: resourceAwsCloudWatchMetricAlarmRead,
|
|
Update: resourceAwsCloudWatchMetricAlarmUpdate,
|
|
Delete: resourceAwsCloudWatchMetricAlarmDelete,
|
|
Importer: &schema.ResourceImporter{
|
|
State: schema.ImportStatePassthrough,
|
|
},
|
|
|
|
Schema: map[string]*schema.Schema{
|
|
"alarm_name": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
ForceNew: true,
|
|
},
|
|
"comparison_operator": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"evaluation_periods": &schema.Schema{
|
|
Type: schema.TypeInt,
|
|
Required: true,
|
|
},
|
|
"metric_name": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"namespace": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"period": &schema.Schema{
|
|
Type: schema.TypeInt,
|
|
Required: true,
|
|
},
|
|
"statistic": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Required: true,
|
|
},
|
|
"threshold": &schema.Schema{
|
|
Type: schema.TypeFloat,
|
|
Required: true,
|
|
},
|
|
"actions_enabled": &schema.Schema{
|
|
Type: schema.TypeBool,
|
|
Optional: true,
|
|
Default: true,
|
|
},
|
|
"alarm_actions": &schema.Schema{
|
|
Type: schema.TypeSet,
|
|
Optional: true,
|
|
Elem: &schema.Schema{Type: schema.TypeString},
|
|
Set: schema.HashString,
|
|
},
|
|
"alarm_description": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Optional: true,
|
|
},
|
|
"dimensions": &schema.Schema{
|
|
Type: schema.TypeMap,
|
|
Optional: true,
|
|
},
|
|
"insufficient_data_actions": &schema.Schema{
|
|
Type: schema.TypeSet,
|
|
Optional: true,
|
|
Elem: &schema.Schema{Type: schema.TypeString},
|
|
Set: schema.HashString,
|
|
},
|
|
"ok_actions": &schema.Schema{
|
|
Type: schema.TypeSet,
|
|
Optional: true,
|
|
Elem: &schema.Schema{Type: schema.TypeString},
|
|
Set: schema.HashString,
|
|
},
|
|
"unit": &schema.Schema{
|
|
Type: schema.TypeString,
|
|
Optional: true,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func resourceAwsCloudWatchMetricAlarmCreate(d *schema.ResourceData, meta interface{}) error {
|
|
conn := meta.(*AWSClient).cloudwatchconn
|
|
|
|
params := getAwsCloudWatchPutMetricAlarmInput(d)
|
|
|
|
log.Printf("[DEBUG] Creating CloudWatch Metric Alarm: %#v", params)
|
|
_, err := conn.PutMetricAlarm(¶ms)
|
|
if err != nil {
|
|
return fmt.Errorf("Creating metric alarm failed: %s", err)
|
|
}
|
|
d.SetId(d.Get("alarm_name").(string))
|
|
log.Println("[INFO] CloudWatch Metric Alarm created")
|
|
|
|
return resourceAwsCloudWatchMetricAlarmRead(d, meta)
|
|
}
|
|
|
|
func resourceAwsCloudWatchMetricAlarmRead(d *schema.ResourceData, meta interface{}) error {
|
|
a, err := getAwsCloudWatchMetricAlarm(d, meta)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if a == nil {
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
|
|
log.Printf("[DEBUG] Reading CloudWatch Metric Alarm: %s", d.Get("alarm_name"))
|
|
|
|
d.Set("actions_enabled", a.ActionsEnabled)
|
|
|
|
if err := d.Set("alarm_actions", _strArrPtrToList(a.AlarmActions)); err != nil {
|
|
log.Printf("[WARN] Error setting Alarm Actions: %s", err)
|
|
}
|
|
d.Set("alarm_description", a.AlarmDescription)
|
|
d.Set("alarm_name", a.AlarmName)
|
|
d.Set("comparison_operator", a.ComparisonOperator)
|
|
if err := d.Set("dimensions", flattenDimensions(a.Dimensions)); err != nil {
|
|
return err
|
|
}
|
|
d.Set("evaluation_periods", a.EvaluationPeriods)
|
|
|
|
if err := d.Set("insufficient_data_actions", _strArrPtrToList(a.InsufficientDataActions)); err != nil {
|
|
log.Printf("[WARN] Error setting Insufficient Data Actions: %s", err)
|
|
}
|
|
d.Set("metric_name", a.MetricName)
|
|
d.Set("namespace", a.Namespace)
|
|
|
|
if err := d.Set("ok_actions", _strArrPtrToList(a.OKActions)); err != nil {
|
|
log.Printf("[WARN] Error setting OK Actions: %s", err)
|
|
}
|
|
d.Set("period", a.Period)
|
|
d.Set("statistic", a.Statistic)
|
|
d.Set("threshold", a.Threshold)
|
|
d.Set("unit", a.Unit)
|
|
|
|
return nil
|
|
}
|
|
|
|
func resourceAwsCloudWatchMetricAlarmUpdate(d *schema.ResourceData, meta interface{}) error {
|
|
conn := meta.(*AWSClient).cloudwatchconn
|
|
params := getAwsCloudWatchPutMetricAlarmInput(d)
|
|
|
|
log.Printf("[DEBUG] Updating CloudWatch Metric Alarm: %#v", params)
|
|
_, err := conn.PutMetricAlarm(¶ms)
|
|
if err != nil {
|
|
return fmt.Errorf("Updating metric alarm failed: %s", err)
|
|
}
|
|
log.Println("[INFO] CloudWatch Metric Alarm updated")
|
|
|
|
return resourceAwsCloudWatchMetricAlarmRead(d, meta)
|
|
}
|
|
|
|
func resourceAwsCloudWatchMetricAlarmDelete(d *schema.ResourceData, meta interface{}) error {
|
|
p, err := getAwsCloudWatchMetricAlarm(d, meta)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if p == nil {
|
|
log.Printf("[DEBUG] CloudWatch Metric Alarm %s is already gone", d.Id())
|
|
return nil
|
|
}
|
|
|
|
log.Printf("[INFO] Deleting CloudWatch Metric Alarm: %s", d.Id())
|
|
|
|
conn := meta.(*AWSClient).cloudwatchconn
|
|
params := cloudwatch.DeleteAlarmsInput{
|
|
AlarmNames: []*string{aws.String(d.Id())},
|
|
}
|
|
|
|
if _, err := conn.DeleteAlarms(¶ms); err != nil {
|
|
return fmt.Errorf("Error deleting CloudWatch Metric Alarm: %s", err)
|
|
}
|
|
log.Println("[INFO] CloudWatch Metric Alarm deleted")
|
|
|
|
d.SetId("")
|
|
return nil
|
|
}
|
|
|
|
func getAwsCloudWatchPutMetricAlarmInput(d *schema.ResourceData) cloudwatch.PutMetricAlarmInput {
|
|
params := cloudwatch.PutMetricAlarmInput{
|
|
AlarmName: aws.String(d.Get("alarm_name").(string)),
|
|
ComparisonOperator: aws.String(d.Get("comparison_operator").(string)),
|
|
EvaluationPeriods: aws.Int64(int64(d.Get("evaluation_periods").(int))),
|
|
MetricName: aws.String(d.Get("metric_name").(string)),
|
|
Namespace: aws.String(d.Get("namespace").(string)),
|
|
Period: aws.Int64(int64(d.Get("period").(int))),
|
|
Statistic: aws.String(d.Get("statistic").(string)),
|
|
Threshold: aws.Float64(d.Get("threshold").(float64)),
|
|
}
|
|
|
|
if v := d.Get("actions_enabled"); v != nil {
|
|
params.ActionsEnabled = aws.Bool(v.(bool))
|
|
}
|
|
|
|
if v, ok := d.GetOk("alarm_description"); ok {
|
|
params.AlarmDescription = aws.String(v.(string))
|
|
}
|
|
|
|
if v, ok := d.GetOk("unit"); ok {
|
|
params.Unit = aws.String(v.(string))
|
|
}
|
|
|
|
var alarmActions []*string
|
|
if v := d.Get("alarm_actions"); v != nil {
|
|
for _, v := range v.(*schema.Set).List() {
|
|
str := v.(string)
|
|
alarmActions = append(alarmActions, aws.String(str))
|
|
}
|
|
params.AlarmActions = alarmActions
|
|
}
|
|
|
|
var insufficientDataActions []*string
|
|
if v := d.Get("insufficient_data_actions"); v != nil {
|
|
for _, v := range v.(*schema.Set).List() {
|
|
str := v.(string)
|
|
insufficientDataActions = append(insufficientDataActions, aws.String(str))
|
|
}
|
|
params.InsufficientDataActions = insufficientDataActions
|
|
}
|
|
|
|
var okActions []*string
|
|
if v := d.Get("ok_actions"); v != nil {
|
|
for _, v := range v.(*schema.Set).List() {
|
|
str := v.(string)
|
|
okActions = append(okActions, aws.String(str))
|
|
}
|
|
params.OKActions = okActions
|
|
}
|
|
|
|
a := d.Get("dimensions").(map[string]interface{})
|
|
dimensions := make([]*cloudwatch.Dimension, 0, len(a))
|
|
for k, v := range a {
|
|
dimensions = append(dimensions, &cloudwatch.Dimension{
|
|
Name: aws.String(k),
|
|
Value: aws.String(v.(string)),
|
|
})
|
|
}
|
|
params.Dimensions = dimensions
|
|
|
|
return params
|
|
}
|
|
|
|
func getAwsCloudWatchMetricAlarm(d *schema.ResourceData, meta interface{}) (*cloudwatch.MetricAlarm, error) {
|
|
conn := meta.(*AWSClient).cloudwatchconn
|
|
|
|
params := cloudwatch.DescribeAlarmsInput{
|
|
AlarmNames: []*string{aws.String(d.Id())},
|
|
}
|
|
|
|
resp, err := conn.DescribeAlarms(¶ms)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Find it and return it
|
|
for idx, ma := range resp.MetricAlarms {
|
|
if *ma.AlarmName == d.Id() {
|
|
return resp.MetricAlarms[idx], nil
|
|
}
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func _strArrPtrToList(strArrPtr []*string) []string {
|
|
var result []string
|
|
for _, elem := range strArrPtr {
|
|
result = append(result, *elem)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func flattenDimensions(dims []*cloudwatch.Dimension) map[string]interface{} {
|
|
flatDims := make(map[string]interface{})
|
|
for _, d := range dims {
|
|
flatDims[*d.Name] = *d.Value
|
|
}
|
|
return flatDims
|
|
}
|