github.com/recobe182/terraform@v0.8.5-0.20170117231232-49ab22a935b7/builtin/providers/fastly/resource_fastly_service_v1_test.go (about) 1 package fastly 2 3 import ( 4 "fmt" 5 "reflect" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/acctest" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 gofastly "github.com/sethvargo/go-fastly" 12 ) 13 14 func TestResourceFastlyFlattenDomains(t *testing.T) { 15 cases := []struct { 16 remote []*gofastly.Domain 17 local []map[string]interface{} 18 }{ 19 { 20 remote: []*gofastly.Domain{ 21 &gofastly.Domain{ 22 Name: "test.notexample.com", 23 Comment: "not comment", 24 }, 25 }, 26 local: []map[string]interface{}{ 27 map[string]interface{}{ 28 "name": "test.notexample.com", 29 "comment": "not comment", 30 }, 31 }, 32 }, 33 { 34 remote: []*gofastly.Domain{ 35 &gofastly.Domain{ 36 Name: "test.notexample.com", 37 }, 38 }, 39 local: []map[string]interface{}{ 40 map[string]interface{}{ 41 "name": "test.notexample.com", 42 "comment": "", 43 }, 44 }, 45 }, 46 } 47 48 for _, c := range cases { 49 out := flattenDomains(c.remote) 50 if !reflect.DeepEqual(out, c.local) { 51 t.Fatalf("Error matching:\nexpected: %#v\ngot: %#v", c.local, out) 52 } 53 } 54 } 55 56 func TestResourceFastlyFlattenBackend(t *testing.T) { 57 cases := []struct { 58 remote []*gofastly.Backend 59 local []map[string]interface{} 60 }{ 61 { 62 remote: []*gofastly.Backend{ 63 &gofastly.Backend{ 64 Name: "test.notexample.com", 65 Address: "www.notexample.com", 66 Port: uint(80), 67 AutoLoadbalance: true, 68 BetweenBytesTimeout: uint(10000), 69 ConnectTimeout: uint(1000), 70 ErrorThreshold: uint(0), 71 FirstByteTimeout: uint(15000), 72 MaxConn: uint(200), 73 SSLCheckCert: true, 74 SSLHostname: "", 75 Shield: "New York", 76 Weight: uint(100), 77 }, 78 }, 79 local: []map[string]interface{}{ 80 map[string]interface{}{ 81 "name": "test.notexample.com", 82 "address": "www.notexample.com", 83 "port": 80, 84 "auto_loadbalance": gofastly.CBool(true), 85 "between_bytes_timeout": 10000, 86 "connect_timeout": 1000, 87 "error_threshold": 0, 88 "first_byte_timeout": 15000, 89 "max_conn": 200, 90 "ssl_check_cert": gofastly.CBool(true), 91 "ssl_hostname": "", 92 "shield": "New York", 93 "weight": 100, 94 }, 95 }, 96 }, 97 } 98 99 for _, c := range cases { 100 out := flattenBackends(c.remote) 101 if !reflect.DeepEqual(out, c.local) { 102 t.Fatalf("Error matching:\nexpected: %#v\ngot: %#v", c.local, out) 103 } 104 } 105 } 106 107 func TestAccFastlyServiceV1_updateDomain(t *testing.T) { 108 var service gofastly.ServiceDetail 109 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 110 nameUpdate := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 111 domainName1 := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10)) 112 domainName2 := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10)) 113 114 resource.Test(t, resource.TestCase{ 115 PreCheck: func() { testAccPreCheck(t) }, 116 Providers: testAccProviders, 117 CheckDestroy: testAccCheckServiceV1Destroy, 118 Steps: []resource.TestStep{ 119 resource.TestStep{ 120 Config: testAccServiceV1Config(name, domainName1), 121 Check: resource.ComposeTestCheckFunc( 122 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 123 testAccCheckFastlyServiceV1Attributes(&service, name, []string{domainName1}), 124 resource.TestCheckResourceAttr( 125 "fastly_service_v1.foo", "name", name), 126 resource.TestCheckResourceAttr( 127 "fastly_service_v1.foo", "active_version", "1"), 128 resource.TestCheckResourceAttr( 129 "fastly_service_v1.foo", "domain.#", "1"), 130 ), 131 }, 132 133 resource.TestStep{ 134 Config: testAccServiceV1Config_domainUpdate(nameUpdate, domainName1, domainName2), 135 Check: resource.ComposeTestCheckFunc( 136 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 137 testAccCheckFastlyServiceV1Attributes(&service, nameUpdate, []string{domainName1, domainName2}), 138 resource.TestCheckResourceAttr( 139 "fastly_service_v1.foo", "name", nameUpdate), 140 resource.TestCheckResourceAttr( 141 "fastly_service_v1.foo", "active_version", "2"), 142 resource.TestCheckResourceAttr( 143 "fastly_service_v1.foo", "domain.#", "2"), 144 ), 145 }, 146 }, 147 }) 148 } 149 150 func TestAccFastlyServiceV1_updateBackend(t *testing.T) { 151 var service gofastly.ServiceDetail 152 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 153 backendName := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3)) 154 backendName2 := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3)) 155 156 resource.Test(t, resource.TestCase{ 157 PreCheck: func() { testAccPreCheck(t) }, 158 Providers: testAccProviders, 159 CheckDestroy: testAccCheckServiceV1Destroy, 160 Steps: []resource.TestStep{ 161 resource.TestStep{ 162 Config: testAccServiceV1Config_backend(name, backendName), 163 Check: resource.ComposeTestCheckFunc( 164 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 165 testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName}), 166 ), 167 }, 168 169 resource.TestStep{ 170 Config: testAccServiceV1Config_backend_update(name, backendName, backendName2), 171 Check: resource.ComposeTestCheckFunc( 172 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 173 testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName, backendName2}), 174 resource.TestCheckResourceAttr( 175 "fastly_service_v1.foo", "active_version", "2"), 176 resource.TestCheckResourceAttr( 177 "fastly_service_v1.foo", "backend.#", "2"), 178 ), 179 }, 180 }, 181 }) 182 } 183 184 func TestAccFastlyServiceV1_basic(t *testing.T) { 185 var service gofastly.ServiceDetail 186 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 187 domainName := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10)) 188 189 resource.Test(t, resource.TestCase{ 190 PreCheck: func() { testAccPreCheck(t) }, 191 Providers: testAccProviders, 192 CheckDestroy: testAccCheckServiceV1Destroy, 193 Steps: []resource.TestStep{ 194 resource.TestStep{ 195 Config: testAccServiceV1Config(name, domainName), 196 Check: resource.ComposeTestCheckFunc( 197 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 198 testAccCheckFastlyServiceV1Attributes(&service, name, []string{domainName}), 199 resource.TestCheckResourceAttr( 200 "fastly_service_v1.foo", "name", name), 201 resource.TestCheckResourceAttr( 202 "fastly_service_v1.foo", "active_version", "1"), 203 resource.TestCheckResourceAttr( 204 "fastly_service_v1.foo", "domain.#", "1"), 205 ), 206 }, 207 }, 208 }) 209 } 210 211 // ServiceV1_disappears – test that a non-empty plan is returned when a Fastly 212 // Service is destroyed outside of Terraform, and can no longer be found, 213 // correctly clearing the ID field and generating a new plan 214 func TestAccFastlyServiceV1_disappears(t *testing.T) { 215 var service gofastly.ServiceDetail 216 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 217 domainName := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10)) 218 219 testDestroy := func(*terraform.State) error { 220 // reach out and DELETE the service 221 conn := testAccProvider.Meta().(*FastlyClient).conn 222 // deactivate active version to destoy 223 _, err := conn.DeactivateVersion(&gofastly.DeactivateVersionInput{ 224 Service: service.ID, 225 Version: service.ActiveVersion.Number, 226 }) 227 if err != nil { 228 return err 229 } 230 231 // delete service 232 err = conn.DeleteService(&gofastly.DeleteServiceInput{ 233 ID: service.ID, 234 }) 235 236 if err != nil { 237 return err 238 } 239 240 return nil 241 } 242 243 resource.Test(t, resource.TestCase{ 244 PreCheck: func() { testAccPreCheck(t) }, 245 Providers: testAccProviders, 246 CheckDestroy: testAccCheckServiceV1Destroy, 247 Steps: []resource.TestStep{ 248 resource.TestStep{ 249 Config: testAccServiceV1Config(name, domainName), 250 Check: resource.ComposeTestCheckFunc( 251 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 252 testDestroy, 253 ), 254 ExpectNonEmptyPlan: true, 255 }, 256 }, 257 }) 258 } 259 260 func testAccCheckServiceV1Exists(n string, service *gofastly.ServiceDetail) resource.TestCheckFunc { 261 return func(s *terraform.State) error { 262 rs, ok := s.RootModule().Resources[n] 263 if !ok { 264 return fmt.Errorf("Not found: %s", n) 265 } 266 267 if rs.Primary.ID == "" { 268 return fmt.Errorf("No Service ID is set") 269 } 270 271 conn := testAccProvider.Meta().(*FastlyClient).conn 272 latest, err := conn.GetServiceDetails(&gofastly.GetServiceInput{ 273 ID: rs.Primary.ID, 274 }) 275 276 if err != nil { 277 return err 278 } 279 280 *service = *latest 281 282 return nil 283 } 284 } 285 286 func testAccCheckFastlyServiceV1Attributes(service *gofastly.ServiceDetail, name string, domains []string) resource.TestCheckFunc { 287 return func(s *terraform.State) error { 288 289 if service.Name != name { 290 return fmt.Errorf("Bad name, expected (%s), got (%s)", name, service.Name) 291 } 292 293 conn := testAccProvider.Meta().(*FastlyClient).conn 294 domainList, err := conn.ListDomains(&gofastly.ListDomainsInput{ 295 Service: service.ID, 296 Version: service.ActiveVersion.Number, 297 }) 298 299 if err != nil { 300 return fmt.Errorf("[ERR] Error looking up Domains for (%s), version (%s): %s", service.Name, service.ActiveVersion.Number, err) 301 } 302 303 expected := len(domains) 304 for _, d := range domainList { 305 for _, e := range domains { 306 if d.Name == e { 307 expected-- 308 } 309 } 310 } 311 312 if expected > 0 { 313 return fmt.Errorf("Domain count mismatch, expected: %#v, got: %#v", domains, domainList) 314 } 315 316 return nil 317 } 318 } 319 320 func testAccCheckFastlyServiceV1Attributes_backends(service *gofastly.ServiceDetail, name string, backends []string) resource.TestCheckFunc { 321 return func(s *terraform.State) error { 322 323 if service.Name != name { 324 return fmt.Errorf("Bad name, expected (%s), got (%s)", name, service.Name) 325 } 326 327 conn := testAccProvider.Meta().(*FastlyClient).conn 328 backendList, err := conn.ListBackends(&gofastly.ListBackendsInput{ 329 Service: service.ID, 330 Version: service.ActiveVersion.Number, 331 }) 332 333 if err != nil { 334 return fmt.Errorf("[ERR] Error looking up Backends for (%s), version (%s): %s", service.Name, service.ActiveVersion.Number, err) 335 } 336 337 expected := len(backendList) 338 for _, b := range backendList { 339 for _, e := range backends { 340 if b.Address == e { 341 expected-- 342 } 343 } 344 } 345 346 if expected > 0 { 347 return fmt.Errorf("Backend count mismatch, expected: %#v, got: %#v", backends, backendList) 348 } 349 350 return nil 351 } 352 } 353 354 func testAccCheckServiceV1Destroy(s *terraform.State) error { 355 for _, rs := range s.RootModule().Resources { 356 if rs.Type != "fastly_service_v1" { 357 continue 358 } 359 360 conn := testAccProvider.Meta().(*FastlyClient).conn 361 l, err := conn.ListServices(&gofastly.ListServicesInput{}) 362 if err != nil { 363 return fmt.Errorf("[WARN] Error listing servcies when deleting Fastly Service (%s): %s", rs.Primary.ID, err) 364 } 365 366 for _, s := range l { 367 if s.ID == rs.Primary.ID { 368 // service still found 369 return fmt.Errorf("[WARN] Tried deleting Service (%s), but was still found", rs.Primary.ID) 370 } 371 } 372 } 373 return nil 374 } 375 376 func testAccServiceV1Config(name, domain string) string { 377 return fmt.Sprintf(` 378 resource "fastly_service_v1" "foo" { 379 name = "%s" 380 381 domain { 382 name = "%s" 383 comment = "tf-testing-domain" 384 } 385 386 backend { 387 address = "aws.amazon.com" 388 name = "amazon docs" 389 } 390 391 force_destroy = true 392 }`, name, domain) 393 } 394 395 func testAccServiceV1Config_domainUpdate(name, domain1, domain2 string) string { 396 return fmt.Sprintf(` 397 resource "fastly_service_v1" "foo" { 398 name = "%s" 399 400 domain { 401 name = "%s" 402 comment = "tf-testing-domain" 403 } 404 405 domain { 406 name = "%s" 407 comment = "tf-testing-other-domain" 408 } 409 410 backend { 411 address = "aws.amazon.com" 412 name = "amazon docs" 413 } 414 415 force_destroy = true 416 }`, name, domain1, domain2) 417 } 418 419 func testAccServiceV1Config_backend(name, backend string) string { 420 return fmt.Sprintf(` 421 resource "fastly_service_v1" "foo" { 422 name = "%s" 423 424 domain { 425 name = "test.notadomain.com" 426 comment = "tf-testing-domain" 427 } 428 429 backend { 430 address = "%s" 431 name = "tf -test backend" 432 } 433 434 force_destroy = true 435 }`, name, backend) 436 } 437 438 func testAccServiceV1Config_backend_update(name, backend, backend2 string) string { 439 return fmt.Sprintf(` 440 resource "fastly_service_v1" "foo" { 441 name = "%s" 442 443 default_ttl = 3400 444 445 domain { 446 name = "test.notadomain.com" 447 comment = "tf-testing-domain" 448 } 449 450 backend { 451 address = "%s" 452 name = "tf-test-backend" 453 } 454 455 backend { 456 address = "%s" 457 name = "tf-test-backend-other" 458 } 459 460 force_destroy = true 461 }`, name, backend, backend2) 462 }