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  }