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  }