package datadog import ( "fmt" "strconv" "strings" "testing" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" "gopkg.in/zorkian/go-datadog-api.v2" ) func TestAccDatadogMonitor_Basic(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckDatadogMonitorDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDatadogMonitorConfig, Check: resource.ComposeTestCheckFunc( testAccCheckDatadogMonitorExists("datadog_monitor.foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "name", "name for monitor foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "message", "some message Notify: @hipchat-channel"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "type", "metric alert"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "query", "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 2"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "notify_no_data", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "new_host_delay", "600"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "renotify_interval", "60"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.warning", "1.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.critical", "2.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "require_full_window", "true"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "locked", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.0", "foo:bar"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.1", "baz"), ), }, }, }) } func TestAccDatadogMonitor_BasicNoTreshold(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckDatadogMonitorDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDatadogMonitorConfigNoThresholds, Check: resource.ComposeTestCheckFunc( testAccCheckDatadogMonitorExists("datadog_monitor.foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "name", "name for monitor foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "message", "some message Notify: @hipchat-channel"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "type", "metric alert"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "query", "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 2"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "notify_no_data", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "renotify_interval", "60"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "require_full_window", "true"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "locked", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.0", "foo:bar"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.1", "bar:baz"), ), }, }, }) } func TestAccDatadogMonitor_Updated(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckDatadogMonitorDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDatadogMonitorConfig, Check: resource.ComposeTestCheckFunc( testAccCheckDatadogMonitorExists("datadog_monitor.foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "name", "name for monitor foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "message", "some message Notify: @hipchat-channel"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "escalation_message", "the situation has escalated @pagerduty"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "query", "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 2"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "type", "metric alert"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "notify_no_data", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "new_host_delay", "600"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "renotify_interval", "60"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.warning", "1.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.critical", "2.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "notify_audit", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "timeout_h", "60"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "include_tags", "true"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "require_full_window", "true"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "locked", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.0", "foo:bar"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.1", "baz"), ), }, { Config: testAccCheckDatadogMonitorConfigUpdated, Check: resource.ComposeTestCheckFunc( testAccCheckDatadogMonitorExists("datadog_monitor.foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "name", "name for monitor bar"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "message", "a different message Notify: @hipchat-channel"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "query", "avg(last_1h):avg:aws.ec2.cpu{environment:bar,host:bar} by {host} > 3"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "escalation_message", "the situation has escalated! @pagerduty"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "type", "metric alert"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "notify_no_data", "true"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "new_host_delay", "900"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "no_data_timeframe", "20"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "renotify_interval", "40"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.ok", "0.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.warning", "1.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.critical", "3.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "notify_audit", "true"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "timeout_h", "70"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "include_tags", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "silenced.*", "0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "require_full_window", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "locked", "true"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.0", "baz:qux"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "tags.1", "quux"), ), }, }, }) } func TestAccDatadogMonitor_TrimWhitespace(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckDatadogMonitorDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDatadogMonitorConfigWhitespace, Check: resource.ComposeTestCheckFunc( testAccCheckDatadogMonitorExists("datadog_monitor.foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "name", "name for monitor foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "message", "some message Notify: @hipchat-channel"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "type", "metric alert"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "query", "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 2"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "notify_no_data", "false"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "renotify_interval", "60"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.ok", "0.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.warning", "1.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.critical", "2.0"), ), }, }, }) } func TestAccDatadogMonitor_Basic_float_int(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckDatadogMonitorDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDatadogMonitorConfig_ints, Check: resource.ComposeTestCheckFunc( testAccCheckDatadogMonitorExists("datadog_monitor.foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.warning", "1"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.critical", "2"), ), }, { Config: testAccCheckDatadogMonitorConfig_ints_mixed, Check: resource.ComposeTestCheckFunc( testAccCheckDatadogMonitorExists("datadog_monitor.foo"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.warning", "1.0"), resource.TestCheckResourceAttr( "datadog_monitor.foo", "thresholds.critical", "3.0"), ), }, }, }) } func testAccCheckDatadogMonitorDestroy(s *terraform.State) error { client := testAccProvider.Meta().(*datadog.Client) if err := destroyHelper(s, client); err != nil { return err } return nil } func testAccCheckDatadogMonitorExists(n string) resource.TestCheckFunc { return func(s *terraform.State) error { client := testAccProvider.Meta().(*datadog.Client) if err := existsHelper(s, client); err != nil { return err } return nil } } const testAccCheckDatadogMonitorConfig = ` resource "datadog_monitor" "foo" { name = "name for monitor foo" type = "metric alert" message = "some message Notify: @hipchat-channel" escalation_message = "the situation has escalated @pagerduty" query = "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 2" thresholds { warning = "1.0" critical = "2.0" } renotify_interval = 60 notify_audit = false timeout_h = 60 new_host_delay = 600 include_tags = true require_full_window = true locked = false tags = ["foo:bar", "baz"] } ` const testAccCheckDatadogMonitorConfigNoThresholds = ` resource "datadog_monitor" "foo" { name = "name for monitor foo" type = "metric alert" message = "some message Notify: @hipchat-channel" escalation_message = "the situation has escalated @pagerduty" query = "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 2" notify_no_data = false renotify_interval = 60 notify_audit = false timeout_h = 60 include_tags = true require_full_window = true locked = false tags = ["foo:bar", "bar:baz"] } ` const testAccCheckDatadogMonitorConfig_ints = ` resource "datadog_monitor" "foo" { name = "name for monitor foo" type = "metric alert" message = "some message Notify: @hipchat-channel" escalation_message = "the situation has escalated @pagerduty" query = "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 2" thresholds { warning = 1 critical = 2 } notify_no_data = false renotify_interval = 60 notify_audit = false timeout_h = 60 include_tags = true require_full_window = true locked = false tags = ["foo:bar", "baz"] } ` const testAccCheckDatadogMonitorConfig_ints_mixed = ` resource "datadog_monitor" "foo" { name = "name for monitor foo" type = "metric alert" message = "some message Notify: @hipchat-channel" escalation_message = "the situation has escalated @pagerduty" query = "avg(last_1h):avg:aws.ec2.cpu{environment:foo,host:foo} by {host} > 3" thresholds { warning = 1 critical = 3.0 } notify_no_data = false renotify_interval = 60 notify_audit = false timeout_h = 60 include_tags = true require_full_window = true locked = false tags = ["foo:bar", "baz"] } ` const testAccCheckDatadogMonitorConfigUpdated = ` resource "datadog_monitor" "foo" { name = "name for monitor bar" type = "metric alert" message = "a different message Notify: @hipchat-channel" escalation_message = "the situation has escalated @pagerduty" query = "avg(last_1h):avg:aws.ec2.cpu{environment:bar,host:bar} by {host} > 3" thresholds { ok = "0.0" warning = "1.0" critical = "3.0" } notify_no_data = true new_host_delay = 900 no_data_timeframe = 20 renotify_interval = 40 escalation_message = "the situation has escalated! @pagerduty" notify_audit = true timeout_h = 70 include_tags = false require_full_window = false locked = true silenced { "*" = 0 } tags = ["baz:qux", "quux"] } ` const testAccCheckDatadogMonitorConfigWhitespace = ` resource "datadog_monitor" "foo" { name = "name for monitor foo" type = "metric alert" message = < 2 EOF thresholds { ok = "0.0" warning = "1.0" critical = "2.0" } notify_no_data = false renotify_interval = 60 notify_audit = false timeout_h = 60 include_tags = true } ` func destroyHelper(s *terraform.State, client *datadog.Client) error { for _, r := range s.RootModule().Resources { i, _ := strconv.Atoi(r.Primary.ID) if _, err := client.GetMonitor(i); err != nil { if strings.Contains(err.Error(), "404 Not Found") { continue } return fmt.Errorf("Received an error retrieving monitor %s", err) } return fmt.Errorf("Monitor still exists") } return nil } func existsHelper(s *terraform.State, client *datadog.Client) error { for _, r := range s.RootModule().Resources { i, _ := strconv.Atoi(r.Primary.ID) if _, err := client.GetMonitor(i); err != nil { return fmt.Errorf("Received an error retrieving monitor %s", err) } } return nil }