terraform/builtin/providers/fastly/resource_fastly_service_v1_...

519 lines
15 KiB
Go
Raw Normal View History

package fastly
import (
"fmt"
"reflect"
"testing"
"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
gofastly "github.com/sethvargo/go-fastly"
)
func TestResourceFastlyFlattenDomains(t *testing.T) {
cases := []struct {
remote []*gofastly.Domain
local []map[string]interface{}
}{
{
remote: []*gofastly.Domain{
&gofastly.Domain{
Name: "test.notexample.com",
Comment: "not comment",
},
},
local: []map[string]interface{}{
map[string]interface{}{
"name": "test.notexample.com",
"comment": "not comment",
},
},
},
{
remote: []*gofastly.Domain{
&gofastly.Domain{
Name: "test.notexample.com",
},
},
local: []map[string]interface{}{
map[string]interface{}{
"name": "test.notexample.com",
"comment": "",
},
},
},
}
for _, c := range cases {
out := flattenDomains(c.remote)
if !reflect.DeepEqual(out, c.local) {
t.Fatalf("Error matching:\nexpected: %#v\ngot: %#v", c.local, out)
}
}
}
func TestResourceFastlyFlattenBackend(t *testing.T) {
cases := []struct {
remote []*gofastly.Backend
local []map[string]interface{}
}{
{
remote: []*gofastly.Backend{
&gofastly.Backend{
Name: "test.notexample.com",
Address: "www.notexample.com",
Port: uint(80),
AutoLoadbalance: true,
BetweenBytesTimeout: uint(10000),
ConnectTimeout: uint(1000),
ErrorThreshold: uint(0),
FirstByteTimeout: uint(15000),
MaxConn: uint(200),
RequestCondition: "",
HealthCheck: "",
SSLCheckCert: true,
SSLHostname: "",
SSLCertHostname: "",
SSLSNIHostname: "",
Shield: "New York",
Weight: uint(100),
},
},
local: []map[string]interface{}{
map[string]interface{}{
"name": "test.notexample.com",
"address": "www.notexample.com",
"port": 80,
"auto_loadbalance": true,
"between_bytes_timeout": 10000,
"connect_timeout": 1000,
"error_threshold": 0,
"first_byte_timeout": 15000,
"max_conn": 200,
"request_condition": "",
"healthcheck": "",
"ssl_check_cert": true,
"ssl_hostname": "",
"ssl_cert_hostname": "",
"ssl_sni_hostname": "",
"shield": "New York",
"weight": 100,
},
},
},
}
for _, c := range cases {
out := flattenBackends(c.remote)
if !reflect.DeepEqual(out, c.local) {
t.Fatalf("Error matching:\nexpected: %#v\ngot: %#v", c.local, out)
}
}
}
func TestAccFastlyServiceV1_updateDomain(t *testing.T) {
var service gofastly.ServiceDetail
name := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
nameUpdate := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
domainName1 := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10))
domainName2 := fmt.Sprintf("%s.notadomain.com", acctest.RandString(10))
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckServiceV1Destroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccServiceV1Config(name, domainName1),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes(&service, name, []string{domainName1}),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "name", name),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "active_version", "1"),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "domain.#", "1"),
),
},
resource.TestStep{
Config: testAccServiceV1Config_domainUpdate(nameUpdate, domainName1, domainName2),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes(&service, nameUpdate, []string{domainName1, domainName2}),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "name", nameUpdate),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "active_version", "2"),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "domain.#", "2"),
),
},
},
})
}
func TestAccFastlyServiceV1_updateBackend(t *testing.T) {
var service gofastly.ServiceDetail
name := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
domain := fmt.Sprintf("tf-acc-test-%s.com", acctest.RandString(10))
backendName := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3))
backendName2 := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3))
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckServiceV1Destroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccServiceV1Config_backend(name, domain, backendName),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName}),
),
},
resource.TestStep{
Config: testAccServiceV1Config_backend_update(name, domain, backendName, backendName2, 3400),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName, backendName2}),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "active_version", "2"),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "backend.#", "2"),
),
},
},
})
}
func TestAccFastlyServiceV1_basic(t *testing.T) {
var service gofastly.ServiceDetail
name := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
domainName := fmt.Sprintf("tf-acc-test-%s.com", acctest.RandString(10))
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckServiceV1Destroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccServiceV1Config(name, domainName),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes(&service, name, []string{domainName}),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "name", name),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "active_version", "1"),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "domain.#", "1"),
),
},
},
})
}
// ServiceV1_disappears  test that a non-empty plan is returned when a Fastly
// Service is destroyed outside of Terraform, and can no longer be found,
// correctly clearing the ID field and generating a new plan
func TestAccFastlyServiceV1_disappears(t *testing.T) {
var service gofastly.ServiceDetail
name := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
domainName := fmt.Sprintf("tf-acc-test-%s.com", acctest.RandString(10))
testDestroy := func(*terraform.State) error {
// reach out and DELETE the service
conn := testAccProvider.Meta().(*FastlyClient).conn
// deactivate active version to destoy
_, err := conn.DeactivateVersion(&gofastly.DeactivateVersionInput{
Service: service.ID,
Version: service.ActiveVersion.Number,
})
if err != nil {
return err
}
// delete service
err = conn.DeleteService(&gofastly.DeleteServiceInput{
ID: service.ID,
})
if err != nil {
return err
}
return nil
}
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckServiceV1Destroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccServiceV1Config(name, domainName),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testDestroy,
),
ExpectNonEmptyPlan: true,
},
},
})
}
func testAccCheckServiceV1Exists(n string, service *gofastly.ServiceDetail) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", n)
}
if rs.Primary.ID == "" {
return fmt.Errorf("No Service ID is set")
}
conn := testAccProvider.Meta().(*FastlyClient).conn
latest, err := conn.GetServiceDetails(&gofastly.GetServiceInput{
ID: rs.Primary.ID,
})
if err != nil {
return err
}
*service = *latest
return nil
}
}
func testAccCheckFastlyServiceV1Attributes(service *gofastly.ServiceDetail, name string, domains []string) resource.TestCheckFunc {
return func(s *terraform.State) error {
if service.Name != name {
return fmt.Errorf("Bad name, expected (%s), got (%s)", name, service.Name)
}
conn := testAccProvider.Meta().(*FastlyClient).conn
domainList, err := conn.ListDomains(&gofastly.ListDomainsInput{
Service: service.ID,
Version: service.ActiveVersion.Number,
})
if err != nil {
return fmt.Errorf("[ERR] Error looking up Domains for (%s), version (%v): %s", service.Name, service.ActiveVersion.Number, err)
}
expected := len(domains)
for _, d := range domainList {
for _, e := range domains {
if d.Name == e {
expected--
}
}
}
if expected > 0 {
return fmt.Errorf("Domain count mismatch, expected: %#v, got: %#v", domains, domainList)
}
return nil
}
}
func testAccCheckFastlyServiceV1Attributes_backends(service *gofastly.ServiceDetail, name string, backends []string) resource.TestCheckFunc {
return func(s *terraform.State) error {
if service.Name != name {
return fmt.Errorf("Bad name, expected (%s), got (%s)", name, service.Name)
}
conn := testAccProvider.Meta().(*FastlyClient).conn
backendList, err := conn.ListBackends(&gofastly.ListBackendsInput{
Service: service.ID,
Version: service.ActiveVersion.Number,
})
if err != nil {
return fmt.Errorf("[ERR] Error looking up Backends for (%s), version (%v): %s", service.Name, service.ActiveVersion.Number, err)
}
expected := len(backendList)
for _, b := range backendList {
for _, e := range backends {
if b.Address == e {
expected--
}
}
}
if expected > 0 {
return fmt.Errorf("Backend count mismatch, expected: %#v, got: %#v", backends, backendList)
}
return nil
}
}
func TestAccFastlyServiceV1_defaultTTL(t *testing.T) {
var service gofastly.ServiceDetail
name := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
domain := fmt.Sprintf("terraform-acc-test-%s.com", acctest.RandString(10))
backendName := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3))
backendName2 := fmt.Sprintf("%s.aws.amazon.com", acctest.RandString(3))
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckServiceV1Destroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccServiceV1Config_backend(name, domain, backendName),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName}),
),
},
resource.TestStep{
Config: testAccServiceV1Config_backend_update(name, domain, backendName, backendName2, 3400),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName, backendName2}),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "default_ttl", "3400"),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "active_version", "2"),
),
},
// Now update the default_ttl to 0 and encounter the issue https://github.com/hashicorp/terraform/issues/12910
resource.TestStep{
Config: testAccServiceV1Config_backend_update(name, domain, backendName, backendName2, 0),
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceV1Exists("fastly_service_v1.foo", &service),
testAccCheckFastlyServiceV1Attributes_backends(&service, name, []string{backendName, backendName2}),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "default_ttl", "0"),
resource.TestCheckResourceAttr(
"fastly_service_v1.foo", "active_version", "3"),
),
},
},
})
}
func testAccCheckServiceV1Destroy(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != "fastly_service_v1" {
continue
}
conn := testAccProvider.Meta().(*FastlyClient).conn
l, err := conn.ListServices(&gofastly.ListServicesInput{})
if err != nil {
return fmt.Errorf("[WARN] Error listing servcies when deleting Fastly Service (%s): %s", rs.Primary.ID, err)
}
for _, s := range l {
if s.ID == rs.Primary.ID {
// service still found
return fmt.Errorf("[WARN] Tried deleting Service (%s), but was still found", rs.Primary.ID)
}
}
}
return nil
}
func testAccServiceV1Config(name, domain string) string {
return fmt.Sprintf(`
resource "fastly_service_v1" "foo" {
name = "%s"
domain {
name = "%s"
comment = "tf-testing-domain"
}
backend {
address = "aws.amazon.com"
name = "amazon docs"
}
force_destroy = true
}`, name, domain)
}
func testAccServiceV1Config_domainUpdate(name, domain1, domain2 string) string {
return fmt.Sprintf(`
resource "fastly_service_v1" "foo" {
name = "%s"
domain {
name = "%s"
comment = "tf-testing-domain"
}
domain {
name = "%s"
comment = "tf-testing-other-domain"
}
backend {
address = "aws.amazon.com"
name = "amazon docs"
}
force_destroy = true
}`, name, domain1, domain2)
}
func testAccServiceV1Config_backend(name, domain, backend string) string {
return fmt.Sprintf(`
resource "fastly_service_v1" "foo" {
name = "%s"
domain {
name = "%s"
comment = "tf-testing-domain"
}
backend {
address = "%s"
name = "tf -test backend"
}
force_destroy = true
}`, name, domain, backend)
}
func testAccServiceV1Config_backend_update(name, domain, backend, backend2 string, ttl uint) string {
return fmt.Sprintf(`
resource "fastly_service_v1" "foo" {
name = "%s"
default_ttl = %d
domain {
name = "%s"
comment = "tf-testing-domain"
}
backend {
address = "%s"
name = "tf-test-backend"
}
backend {
address = "%s"
name = "tf-test-backend-other"
}
force_destroy = true
}`, name, ttl, domain, backend, backend2)
}