diff --git a/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm.go b/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm.go index eec4ada19..72a1e43c5 100644 --- a/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm.go +++ b/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm.go @@ -129,7 +129,9 @@ func resourceAwsCloudWatchMetricAlarmRead(d *schema.ResourceData, meta interface d.Set("alarm_description", a.AlarmDescription) d.Set("alarm_name", a.AlarmName) d.Set("comparison_operator", a.ComparisonOperator) - d.Set("dimensions", a.Dimensions) + 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 { @@ -282,3 +284,11 @@ func _strArrPtrToList(strArrPtr []*string) []string { } 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 +} diff --git a/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm_test.go b/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm_test.go index 8d9a53c36..fc34b038f 100644 --- a/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm_test.go +++ b/builtin/providers/aws/resource_aws_cloudwatch_metric_alarm_test.go @@ -24,12 +24,32 @@ func TestAccAWSCloudWatchMetricAlarm_basic(t *testing.T) { testAccCheckCloudWatchMetricAlarmExists("aws_cloudwatch_metric_alarm.foobar", &alarm), resource.TestCheckResourceAttr("aws_cloudwatch_metric_alarm.foobar", "metric_name", "CPUUtilization"), resource.TestCheckResourceAttr("aws_cloudwatch_metric_alarm.foobar", "statistic", "Average"), + testAccCheckCloudWatchMetricAlarmDimension( + "aws_cloudwatch_metric_alarm.foobar", "InstanceId", "i-abc123"), ), }, }, }) } +func testAccCheckCloudWatchMetricAlarmDimension(n, k, v string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + key := fmt.Sprintf("dimensions.%s", k) + val, ok := rs.Primary.Attributes[key] + if !ok { + return fmt.Errorf("Could not find dimension: %s", k) + } + if val != v { + return fmt.Errorf("Expected dimension %s => %s; got: %s", k, v, val) + } + return nil + } +} + func testAccCheckCloudWatchMetricAlarmExists(n string, alarm *cloudwatch.MetricAlarm) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -81,15 +101,18 @@ func testAccCheckAWSCloudWatchMetricAlarmDestroy(s *terraform.State) error { var testAccAWSCloudWatchMetricAlarmConfig = fmt.Sprintf(` resource "aws_cloudwatch_metric_alarm" "foobar" { - alarm_name = "terraform-test-foobar5" - comparison_operator = "GreaterThanOrEqualToThreshold" - evaluation_periods = "2" - metric_name = "CPUUtilization" - namespace = "AWS/EC2" - period = "120" - statistic = "Average" - threshold = "80" - alarm_description = "This metric monitor ec2 cpu utilization" - insufficient_data_actions = [] + alarm_name = "terraform-test-foobar5" + comparison_operator = "GreaterThanOrEqualToThreshold" + evaluation_periods = "2" + metric_name = "CPUUtilization" + namespace = "AWS/EC2" + period = "120" + statistic = "Average" + threshold = "80" + alarm_description = "This metric monitors ec2 cpu utilization" + insufficient_data_actions = [] + dimensions { + InstanceId = "i-abc123" + } } `)