github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/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 RequestCondition: "", 74 HealthCheck: "", 75 SSLCheckCert: true, 76 SSLHostname: "", 77 SSLCertHostname: "", 78 SSLSNIHostname: "", 79 Shield: "New York", 80 Weight: uint(100), 81 }, 82 }, 83 local: []map[string]interface{}{ 84 map[string]interface{}{ 85 "name": "test.notexample.com", 86 "address": "www.notexample.com", 87 "port": 80, 88 "auto_loadbalance": true, 89 "between_bytes_timeout": 10000, 90 "connect_timeout": 1000, 91 "error_threshold": 0, 92 "first_byte_timeout": 15000, 93 "max_conn": 200, 94 "request_condition": "", 95 "healthcheck": "", 96 "ssl_check_cert": true, 97 "ssl_hostname": "", 98 "ssl_cert_hostname": "", 99 "ssl_sni_hostname": "", 100 "shield": "New York", 101 "weight": 100, 102 }, 103 }, 104 }, 105 } 106 107 for _, c := range cases { 108 out := flattenBackends(c.remote) 109 if !reflect.DeepEqual(out, c.local) { 110 t.Fatalf("Error matching:\nexpected: %#v\ngot: %#v", c.local, out) 111 } 112 } 113 } 114 115 func TestAccFastlyServiceV1_updateDomain(t *testing.T) { 116 var service gofastly.ServiceDetail 117 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 118 nameUpdate := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 119 domainName1 := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10)) 120 domainName2 := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10)) 121 122 resource.Test(t, resource.TestCase{ 123 PreCheck: func() { testAccPreCheck(t) }, 124 Providers: testAccProviders, 125 CheckDestroy: testAccCheckServiceV1Destroy, 126 Steps: []resource.TestStep{ 127 resource.TestStep{ 128 Config: testAccServiceV1Config(name, domainName1), 129 Check: resource.ComposeTestCheckFunc( 130 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 131 testAccCheckFastlyServiceV1Attributes(&service, name, []string{domainName1}), 132 resource.TestCheckResourceAttr( 133 "fastly_service_v1.foo", "name", name), 134 resource.TestCheckResourceAttr( 135 "fastly_service_v1.foo", "active_version", "1"), 136 resource.TestCheckResourceAttr( 137 "fastly_service_v1.foo", "domain.#", "1"), 138 ), 139 }, 140 141 resource.TestStep{ 142 Config: testAccServiceV1Config_domainUpdate(nameUpdate, domainName1, domainName2), 143 Check: resource.ComposeTestCheckFunc( 144 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 145 testAccCheckFastlyServiceV1Attributes(&service, nameUpdate, []string{domainName1, domainName2}), 146 resource.TestCheckResourceAttr( 147 "fastly_service_v1.foo", "name", nameUpdate), 148 resource.TestCheckResourceAttr( 149 "fastly_service_v1.foo", "active_version", "2"), 150 resource.TestCheckResourceAttr( 151 "fastly_service_v1.foo", "domain.#", "2"), 152 ), 153 }, 154 }, 155 }) 156 } 157 158 func TestAccFastlyServiceV1_updateBackend(t *testing.T) { 159 var service gofastly.ServiceDetail 160 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 161 domain := fmt.Sprintf("tf-acc-test-%s.com", acctest.RandString(10)) 162 backendName := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3)) 163 backendName2 := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3)) 164 165 resource.Test(t, resource.TestCase{ 166 PreCheck: func() { testAccPreCheck(t) }, 167 Providers: testAccProviders, 168 CheckDestroy: testAccCheckServiceV1Destroy, 169 Steps: []resource.TestStep{ 170 resource.TestStep{ 171 Config: testAccServiceV1Config_backend(name, domain, backendName), 172 Check: resource.ComposeTestCheckFunc( 173 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 174 testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName}), 175 ), 176 }, 177 178 resource.TestStep{ 179 Config: testAccServiceV1Config_backend_update(name, domain, backendName, backendName2, 3400), 180 Check: resource.ComposeTestCheckFunc( 181 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 182 testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName, backendName2}), 183 resource.TestCheckResourceAttr( 184 "fastly_service_v1.foo", "active_version", "2"), 185 resource.TestCheckResourceAttr( 186 "fastly_service_v1.foo", "backend.#", "2"), 187 ), 188 }, 189 }, 190 }) 191 } 192 193 func TestAccFastlyServiceV1_basic(t *testing.T) { 194 var service gofastly.ServiceDetail 195 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 196 domainName := fmt.Sprintf("tf-acc-test-%s.com", acctest.RandString(10)) 197 198 resource.Test(t, resource.TestCase{ 199 PreCheck: func() { testAccPreCheck(t) }, 200 Providers: testAccProviders, 201 CheckDestroy: testAccCheckServiceV1Destroy, 202 Steps: []resource.TestStep{ 203 resource.TestStep{ 204 Config: testAccServiceV1Config(name, domainName), 205 Check: resource.ComposeTestCheckFunc( 206 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 207 testAccCheckFastlyServiceV1Attributes(&service, name, []string{domainName}), 208 resource.TestCheckResourceAttr( 209 "fastly_service_v1.foo", "name", name), 210 resource.TestCheckResourceAttr( 211 "fastly_service_v1.foo", "active_version", "1"), 212 resource.TestCheckResourceAttr( 213 "fastly_service_v1.foo", "domain.#", "1"), 214 ), 215 }, 216 }, 217 }) 218 } 219 220 // ServiceV1_disappears – test that a non-empty plan is returned when a Fastly 221 // Service is destroyed outside of Terraform, and can no longer be found, 222 // correctly clearing the ID field and generating a new plan 223 func TestAccFastlyServiceV1_disappears(t *testing.T) { 224 var service gofastly.ServiceDetail 225 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 226 domainName := fmt.Sprintf("tf-acc-test-%s.com", acctest.RandString(10)) 227 228 testDestroy := func(*terraform.State) error { 229 // reach out and DELETE the service 230 conn := testAccProvider.Meta().(*FastlyClient).conn 231 // deactivate active version to destoy 232 _, err := conn.DeactivateVersion(&gofastly.DeactivateVersionInput{ 233 Service: service.ID, 234 Version: service.ActiveVersion.Number, 235 }) 236 if err != nil { 237 return err 238 } 239 240 // delete service 241 err = conn.DeleteService(&gofastly.DeleteServiceInput{ 242 ID: service.ID, 243 }) 244 245 if err != nil { 246 return err 247 } 248 249 return nil 250 } 251 252 resource.Test(t, resource.TestCase{ 253 PreCheck: func() { testAccPreCheck(t) }, 254 Providers: testAccProviders, 255 CheckDestroy: testAccCheckServiceV1Destroy, 256 Steps: []resource.TestStep{ 257 resource.TestStep{ 258 Config: testAccServiceV1Config(name, domainName), 259 Check: resource.ComposeTestCheckFunc( 260 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 261 testDestroy, 262 ), 263 ExpectNonEmptyPlan: true, 264 }, 265 }, 266 }) 267 } 268 269 func testAccCheckServiceV1Exists(n string, service *gofastly.ServiceDetail) resource.TestCheckFunc { 270 return func(s *terraform.State) error { 271 rs, ok := s.RootModule().Resources[n] 272 if !ok { 273 return fmt.Errorf("Not found: %s", n) 274 } 275 276 if rs.Primary.ID == "" { 277 return fmt.Errorf("No Service ID is set") 278 } 279 280 conn := testAccProvider.Meta().(*FastlyClient).conn 281 latest, err := conn.GetServiceDetails(&gofastly.GetServiceInput{ 282 ID: rs.Primary.ID, 283 }) 284 285 if err != nil { 286 return err 287 } 288 289 *service = *latest 290 291 return nil 292 } 293 } 294 295 func testAccCheckFastlyServiceV1Attributes(service *gofastly.ServiceDetail, name string, domains []string) resource.TestCheckFunc { 296 return func(s *terraform.State) error { 297 298 if service.Name != name { 299 return fmt.Errorf("Bad name, expected (%s), got (%s)", name, service.Name) 300 } 301 302 conn := testAccProvider.Meta().(*FastlyClient).conn 303 domainList, err := conn.ListDomains(&gofastly.ListDomainsInput{ 304 Service: service.ID, 305 Version: service.ActiveVersion.Number, 306 }) 307 308 if err != nil { 309 return fmt.Errorf("[ERR] Error looking up Domains for (%s), version (%v): %s", service.Name, service.ActiveVersion.Number, err) 310 } 311 312 expected := len(domains) 313 for _, d := range domainList { 314 for _, e := range domains { 315 if d.Name == e { 316 expected-- 317 } 318 } 319 } 320 321 if expected > 0 { 322 return fmt.Errorf("Domain count mismatch, expected: %#v, got: %#v", domains, domainList) 323 } 324 325 return nil 326 } 327 } 328 329 func testAccCheckFastlyServiceV1Attributes_backends(service *gofastly.ServiceDetail, name string, backends []string) resource.TestCheckFunc { 330 return func(s *terraform.State) error { 331 332 if service.Name != name { 333 return fmt.Errorf("Bad name, expected (%s), got (%s)", name, service.Name) 334 } 335 336 conn := testAccProvider.Meta().(*FastlyClient).conn 337 backendList, err := conn.ListBackends(&gofastly.ListBackendsInput{ 338 Service: service.ID, 339 Version: service.ActiveVersion.Number, 340 }) 341 342 if err != nil { 343 return fmt.Errorf("[ERR] Error looking up Backends for (%s), version (%v): %s", service.Name, service.ActiveVersion.Number, err) 344 } 345 346 expected := len(backendList) 347 for _, b := range backendList { 348 for _, e := range backends { 349 if b.Address == e { 350 expected-- 351 } 352 } 353 } 354 355 if expected > 0 { 356 return fmt.Errorf("Backend count mismatch, expected: %#v, got: %#v", backends, backendList) 357 } 358 359 return nil 360 } 361 } 362 363 func TestAccFastlyServiceV1_defaultTTL(t *testing.T) { 364 var service gofastly.ServiceDetail 365 name := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) 366 domain := fmt.Sprintf("terraform-acc-test-%s.com", acctest.RandString(10)) 367 backendName := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3)) 368 backendName2 := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3)) 369 370 resource.Test(t, resource.TestCase{ 371 PreCheck: func() { testAccPreCheck(t) }, 372 Providers: testAccProviders, 373 CheckDestroy: testAccCheckServiceV1Destroy, 374 Steps: []resource.TestStep{ 375 resource.TestStep{ 376 Config: testAccServiceV1Config_backend(name, domain, backendName), 377 Check: resource.ComposeTestCheckFunc( 378 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 379 testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName}), 380 ), 381 }, 382 383 resource.TestStep{ 384 Config: testAccServiceV1Config_backend_update(name, domain, backendName, backendName2, 3400), 385 Check: resource.ComposeTestCheckFunc( 386 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 387 testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName, backendName2}), 388 resource.TestCheckResourceAttr( 389 "fastly_service_v1.foo", "default_ttl", "3400"), 390 resource.TestCheckResourceAttr( 391 "fastly_service_v1.foo", "active_version", "2"), 392 ), 393 }, 394 // Now update the default_ttl to 0 and encounter the issue https://github.com/hashicorp/terraform/issues/12910 395 resource.TestStep{ 396 Config: testAccServiceV1Config_backend_update(name, domain, backendName, backendName2, 0), 397 Check: resource.ComposeTestCheckFunc( 398 testAccCheckServiceV1Exists("fastly_service_v1.foo", &service), 399 testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName, backendName2}), 400 resource.TestCheckResourceAttr( 401 "fastly_service_v1.foo", "default_ttl", "0"), 402 resource.TestCheckResourceAttr( 403 "fastly_service_v1.foo", "active_version", "3"), 404 ), 405 }, 406 }, 407 }) 408 } 409 410 func testAccCheckServiceV1Destroy(s *terraform.State) error { 411 for _, rs := range s.RootModule().Resources { 412 if rs.Type != "fastly_service_v1" { 413 continue 414 } 415 416 conn := testAccProvider.Meta().(*FastlyClient).conn 417 l, err := conn.ListServices(&gofastly.ListServicesInput{}) 418 if err != nil { 419 return fmt.Errorf("[WARN] Error listing servcies when deleting Fastly Service (%s): %s", rs.Primary.ID, err) 420 } 421 422 for _, s := range l { 423 if s.ID == rs.Primary.ID { 424 // service still found 425 return fmt.Errorf("[WARN] Tried deleting Service (%s), but was still found", rs.Primary.ID) 426 } 427 } 428 } 429 return nil 430 } 431 432 func testAccServiceV1Config(name, domain string) string { 433 return fmt.Sprintf(` 434 resource "fastly_service_v1" "foo" { 435 name = "%s" 436 437 domain { 438 name = "%s" 439 comment = "tf-testing-domain" 440 } 441 442 backend { 443 address = "aws.amazon.com" 444 name = "amazon docs" 445 } 446 447 force_destroy = true 448 }`, name, domain) 449 } 450 451 func testAccServiceV1Config_domainUpdate(name, domain1, domain2 string) string { 452 return fmt.Sprintf(` 453 resource "fastly_service_v1" "foo" { 454 name = "%s" 455 456 domain { 457 name = "%s" 458 comment = "tf-testing-domain" 459 } 460 461 domain { 462 name = "%s" 463 comment = "tf-testing-other-domain" 464 } 465 466 backend { 467 address = "aws.amazon.com" 468 name = "amazon docs" 469 } 470 471 force_destroy = true 472 }`, name, domain1, domain2) 473 } 474 475 func testAccServiceV1Config_backend(name, domain, backend string) string { 476 return fmt.Sprintf(` 477 resource "fastly_service_v1" "foo" { 478 name = "%s" 479 480 domain { 481 name = "%s" 482 comment = "tf-testing-domain" 483 } 484 485 backend { 486 address = "%s" 487 name = "tf -test backend" 488 } 489 490 force_destroy = true 491 }`, name, domain, backend) 492 } 493 494 func testAccServiceV1Config_backend_update(name, domain, backend, backend2 string, ttl uint) string { 495 return fmt.Sprintf(` 496 resource "fastly_service_v1" "foo" { 497 name = "%s" 498 499 default_ttl = %d 500 501 domain { 502 name = "%s" 503 comment = "tf-testing-domain" 504 } 505 506 backend { 507 address = "%s" 508 name = "tf-test-backend" 509 } 510 511 backend { 512 address = "%s" 513 name = "tf-test-backend-other" 514 } 515 516 force_destroy = true 517 }`, name, ttl, domain, backend, backend2) 518 }