github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/datadog/resource_datadog_timeboard_test.go (about) 1 package datadog 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 "testing" 8 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 "gopkg.in/zorkian/go-datadog-api.v2" 12 ) 13 14 const config1 = ` 15 resource "datadog_timeboard" "acceptance_test" { 16 title = "Acceptance Test Timeboard" 17 description = "Created using the Datadog provider in Terraform" 18 read_only = true 19 graph { 20 title = "Top System CPU by Docker container" 21 viz = "toplist" 22 request { 23 q = "top(avg:docker.cpu.system{*} by {container_name}, 10, 'mean', 'desc')" 24 } 25 } 26 } 27 ` 28 29 const config2 = ` 30 resource "datadog_timeboard" "acceptance_test" { 31 title = "Acceptance Test Timeboard" 32 description = "Created using the Datadog provider in Terraform" 33 graph { 34 title = "Redis latency (ms)" 35 viz = "timeseries" 36 request { 37 q = "avg:redis.info.latency_ms{$host}" 38 } 39 } 40 graph { 41 title = "Redis memory usage" 42 viz = "timeseries" 43 request { 44 q = "avg:redis.mem.used{$host} - avg:redis.mem.lua{$host}, avg:redis.mem.lua{$host}" 45 aggregator = "sum" 46 stacked = true 47 } 48 request { 49 q = "avg:redis.mem.rss{$host}" 50 } 51 request { 52 q = "avg:redis.mem.rss{$host}" 53 type = "bars" 54 style { 55 palette = "warm" 56 } 57 aggregator = "max" 58 } 59 } 60 template_variable { 61 name = "host" 62 prefix = "host" 63 } 64 } 65 ` 66 67 const config3 = ` 68 resource "datadog_timeboard" "acceptance_test" { 69 title = "Acceptance Test Timeboard" 70 description = "Created using the Datadog provider in Terraform" 71 graph { 72 title = "Redis latency (ms)" 73 viz = "timeseries" 74 request { 75 q = "avg:redis.info.latency_ms{$host}" 76 } 77 events = ["sources:capistrano"] 78 79 marker { 80 label = "High Latency" 81 type = "error solid" 82 value = "y > 100" 83 } 84 yaxis { 85 max = "50" 86 scale = "sqrt" 87 } 88 } 89 graph { 90 title = "ELB Requests" 91 viz = "query_value" 92 request { 93 q = "sum:aws.elb.request_count{*}.as_count()" 94 type = "line" 95 aggregator = "min" 96 conditional_format { 97 comparator = ">" 98 value = "1000" 99 palette = "white_on_red" 100 } 101 conditional_format { 102 comparator = "<=" 103 value = "1000" 104 palette = "white_on_green" 105 } 106 } 107 custom_unit = "hits" 108 precision = "*" 109 text_align = "left" 110 } 111 template_variable { 112 name = "host" 113 prefix = "host" 114 } 115 } 116 ` 117 118 func TestAccDatadogTimeboard_update(t *testing.T) { 119 120 step1 := resource.TestStep{ 121 Config: config1, 122 Check: resource.ComposeTestCheckFunc( 123 checkExists, 124 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "title", "Acceptance Test Timeboard"), 125 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "description", "Created using the Datadog provider in Terraform"), 126 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "read_only", "true"), 127 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.title", "Top System CPU by Docker container"), 128 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.viz", "toplist"), 129 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.request.0.q", "top(avg:docker.cpu.system{*} by {container_name}, 10, 'mean', 'desc')"), 130 ), 131 } 132 133 step2 := resource.TestStep{ 134 Config: config2, 135 Check: resource.ComposeTestCheckFunc( 136 checkExists, 137 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "title", "Acceptance Test Timeboard"), 138 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "description", "Created using the Datadog provider in Terraform"), 139 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.title", "Redis latency (ms)"), 140 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.viz", "timeseries"), 141 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.request.0.q", "avg:redis.info.latency_ms{$host}"), 142 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.title", "Redis memory usage"), 143 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.viz", "timeseries"), 144 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.q", "avg:redis.mem.used{$host} - avg:redis.mem.lua{$host}, avg:redis.mem.lua{$host}"), 145 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.aggregator", "sum"), 146 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.stacked", "true"), 147 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.1.q", "avg:redis.mem.rss{$host}"), 148 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "template_variable.0.name", "host"), 149 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "template_variable.0.prefix", "host"), 150 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.2.type", "bars"), 151 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.2.q", "avg:redis.mem.rss{$host}"), 152 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.2.aggregator", "max"), 153 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.2.style.palette", "warm"), 154 ), 155 } 156 157 step3 := resource.TestStep{ 158 Config: config3, 159 Check: resource.ComposeTestCheckFunc( 160 checkExists, 161 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "title", "Acceptance Test Timeboard"), 162 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "description", "Created using the Datadog provider in Terraform"), 163 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.title", "Redis latency (ms)"), 164 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.viz", "timeseries"), 165 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.request.0.q", "avg:redis.info.latency_ms{$host}"), 166 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.events.#", "1"), 167 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.marker.0.label", "High Latency"), 168 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.marker.0.type", "error solid"), 169 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.marker.0.value", "y > 100"), 170 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.yaxis.max", "50"), 171 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.0.yaxis.scale", "sqrt"), 172 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.title", "ELB Requests"), 173 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.viz", "query_value"), 174 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.q", "sum:aws.elb.request_count{*}.as_count()"), 175 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.aggregator", "min"), 176 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.type", "line"), 177 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.conditional_format.0.comparator", ">"), 178 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.conditional_format.0.value", "1000"), 179 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.conditional_format.0.palette", "white_on_red"), 180 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.conditional_format.1.comparator", "<="), 181 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.conditional_format.1.value", "1000"), 182 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.request.0.conditional_format.1.palette", "white_on_green"), 183 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.custom_unit", "hits"), 184 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.precision", "*"), 185 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "graph.1.text_align", "left"), 186 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "template_variable.0.name", "host"), 187 resource.TestCheckResourceAttr("datadog_timeboard.acceptance_test", "template_variable.0.prefix", "host"), 188 ), 189 } 190 191 resource.Test(t, resource.TestCase{ 192 PreCheck: func() { testAccPreCheck(t) }, 193 Providers: testAccProviders, 194 CheckDestroy: checkDestroy, 195 Steps: []resource.TestStep{step1, step2, step3}, 196 }) 197 } 198 199 func checkExists(s *terraform.State) error { 200 client := testAccProvider.Meta().(*datadog.Client) 201 for _, r := range s.RootModule().Resources { 202 i, _ := strconv.Atoi(r.Primary.ID) 203 if _, err := client.GetDashboard(i); err != nil { 204 return fmt.Errorf("Received an error retrieving monitor %s", err) 205 } 206 } 207 return nil 208 } 209 210 func checkDestroy(s *terraform.State) error { 211 client := testAccProvider.Meta().(*datadog.Client) 212 for _, r := range s.RootModule().Resources { 213 i, _ := strconv.Atoi(r.Primary.ID) 214 if _, err := client.GetDashboard(i); err != nil { 215 if strings.Contains(err.Error(), "404 Not Found") { 216 continue 217 } 218 return fmt.Errorf("Received an error retrieving timeboard %s", err) 219 } 220 return fmt.Errorf("Timeboard still exists") 221 } 222 return nil 223 } 224 225 func TestValidateAggregatorMethod(t *testing.T) { 226 validMethods := []string{ 227 "average", 228 "max", 229 "min", 230 "sum", 231 } 232 for _, v := range validMethods { 233 _, errors := validateAggregatorMethod(v, "request") 234 if len(errors) != 0 { 235 t.Fatalf("%q should be a valid aggregator method: %q", v, errors) 236 } 237 } 238 239 invalidMethods := []string{ 240 "avg", 241 "suM", 242 "m", 243 "foo", 244 } 245 for _, v := range invalidMethods { 246 _, errors := validateAggregatorMethod(v, "request") 247 if len(errors) == 0 { 248 t.Fatalf("%q should be an invalid aggregator method", v) 249 } 250 } 251 252 }