/digitalocean/datasource_digitalocean_loadbalancer_test.go

https://github.com/terraform-providers/terraform-provider-digitalocean · Go · 185 lines · 167 code · 18 blank · 0 comment · 7 complexity · c0cca376dfcf5f5a6c42db355bf7028f MD5 · raw file

  1. package digitalocean
  2. import (
  3. "context"
  4. "fmt"
  5. "regexp"
  6. "testing"
  7. "github.com/digitalocean/godo"
  8. "github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
  9. "github.com/hashicorp/terraform-plugin-sdk/helper/resource"
  10. "github.com/hashicorp/terraform-plugin-sdk/terraform"
  11. )
  12. func TestAccDataSourceDigitalOceanLoadBalancer_Basic(t *testing.T) {
  13. t.Parallel()
  14. var loadbalancer godo.LoadBalancer
  15. rInt := acctest.RandInt()
  16. expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`)
  17. resource.Test(t, resource.TestCase{
  18. PreCheck: func() { testAccPreCheck(t) },
  19. Providers: testAccProviders,
  20. Steps: []resource.TestStep{
  21. {
  22. Config: testAccCheckDataSourceDigitalOceanLoadBalancerConfig_basic(rInt),
  23. Check: resource.ComposeTestCheckFunc(
  24. testAccCheckDataSourceDigitalOceanLoadBalancerExists("data.digitalocean_loadbalancer.foobar", &loadbalancer),
  25. resource.TestCheckResourceAttr(
  26. "data.digitalocean_loadbalancer.foobar", "name", fmt.Sprintf("loadbalancer-%d", rInt)),
  27. resource.TestCheckResourceAttr(
  28. "data.digitalocean_loadbalancer.foobar", "region", "nyc3"),
  29. resource.TestCheckResourceAttr(
  30. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.#", "1"),
  31. resource.TestCheckResourceAttr(
  32. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.entry_port", "80"),
  33. resource.TestCheckResourceAttr(
  34. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.entry_protocol", "http"),
  35. resource.TestCheckResourceAttr(
  36. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.target_port", "80"),
  37. resource.TestCheckResourceAttr(
  38. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.target_protocol", "http"),
  39. resource.TestCheckResourceAttr(
  40. "data.digitalocean_loadbalancer.foobar", "healthcheck.#", "1"),
  41. resource.TestCheckResourceAttr(
  42. "data.digitalocean_loadbalancer.foobar", "healthcheck.0.port", "22"),
  43. resource.TestCheckResourceAttr(
  44. "data.digitalocean_loadbalancer.foobar", "healthcheck.0.protocol", "tcp"),
  45. resource.TestCheckResourceAttr(
  46. "data.digitalocean_loadbalancer.foobar", "droplet_ids.#", "2"),
  47. resource.TestMatchResourceAttr(
  48. "data.digitalocean_loadbalancer.foobar", "urn", expectedURNRegEx),
  49. resource.TestCheckResourceAttrSet(
  50. "data.digitalocean_loadbalancer.foobar", "vpc_uuid"),
  51. resource.TestCheckResourceAttr(
  52. "data.digitalocean_loadbalancer.foobar", "enable_proxy_protocol", "false"),
  53. resource.TestCheckResourceAttr(
  54. "data.digitalocean_loadbalancer.foobar", "enable_backend_keepalive", "false"),
  55. ),
  56. },
  57. },
  58. })
  59. }
  60. func TestAccDataSourceDigitalOceanLoadBalancer_multipleRules(t *testing.T) {
  61. t.Parallel()
  62. var loadbalancer godo.LoadBalancer
  63. rName := randomTestName()
  64. resource.Test(t, resource.TestCase{
  65. PreCheck: func() { testAccPreCheck(t) },
  66. Providers: testAccProviders,
  67. CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy,
  68. Steps: []resource.TestStep{
  69. {
  70. Config: testAccCheckDigitalOceanLoadbalancerConfig_multipleRules(rName) + testAccCheckDataSourceDigitalOceanLoadBalancerConfig_multipleRules,
  71. Check: resource.ComposeAggregateTestCheckFunc(
  72. testAccCheckDigitalOceanLoadbalancerExists("digitalocean_loadbalancer.foobar", &loadbalancer),
  73. resource.TestCheckResourceAttr(
  74. "data.digitalocean_loadbalancer.foobar", "name", rName),
  75. resource.TestCheckResourceAttr(
  76. "data.digitalocean_loadbalancer.foobar", "region", "nyc3"),
  77. resource.TestCheckResourceAttr(
  78. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.#", "2"),
  79. resource.TestCheckResourceAttr(
  80. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.236988772.entry_port", "443"),
  81. resource.TestCheckResourceAttr(
  82. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.236988772.entry_protocol", "https"),
  83. resource.TestCheckResourceAttr(
  84. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.236988772.target_port", "443"),
  85. resource.TestCheckResourceAttr(
  86. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.236988772.target_protocol", "https"),
  87. resource.TestCheckResourceAttr(
  88. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.entry_port", "80"),
  89. resource.TestCheckResourceAttr(
  90. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.entry_protocol", "http"),
  91. resource.TestCheckResourceAttr(
  92. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.target_port", "80"),
  93. resource.TestCheckResourceAttr(
  94. "data.digitalocean_loadbalancer.foobar", "forwarding_rule.192790336.target_protocol", "http"),
  95. ),
  96. },
  97. },
  98. })
  99. }
  100. func testAccCheckDataSourceDigitalOceanLoadBalancerExists(n string, loadbalancer *godo.LoadBalancer) resource.TestCheckFunc {
  101. return func(s *terraform.State) error {
  102. rs, ok := s.RootModule().Resources[n]
  103. if !ok {
  104. return fmt.Errorf("Not found: %s", n)
  105. }
  106. if rs.Primary.ID == "" {
  107. return fmt.Errorf("No Load Balancer ID is set")
  108. }
  109. client := testAccProvider.Meta().(*CombinedConfig).godoClient()
  110. foundLoadbalancer, _, err := client.LoadBalancers.Get(context.Background(), rs.Primary.ID)
  111. if err != nil {
  112. return err
  113. }
  114. if foundLoadbalancer.ID != rs.Primary.ID {
  115. return fmt.Errorf("Load Balancer not found")
  116. }
  117. *loadbalancer = *foundLoadbalancer
  118. return nil
  119. }
  120. }
  121. func testAccCheckDataSourceDigitalOceanLoadBalancerConfig_basic(rInt int) string {
  122. return fmt.Sprintf(`
  123. resource "digitalocean_tag" "foo" {
  124. name = "web"
  125. }
  126. resource "digitalocean_droplet" "foo" {
  127. count = 2
  128. image = "ubuntu-18-04-x64"
  129. name = "foo-%d-${count.index}"
  130. region = "nyc3"
  131. size = "512mb"
  132. private_networking = true
  133. tags = [digitalocean_tag.foo.id]
  134. }
  135. resource "digitalocean_loadbalancer" "foo" {
  136. name = "loadbalancer-%d"
  137. region = "nyc3"
  138. forwarding_rule {
  139. entry_port = 80
  140. entry_protocol = "http"
  141. target_port = 80
  142. target_protocol = "http"
  143. }
  144. healthcheck {
  145. port = 22
  146. protocol = "tcp"
  147. }
  148. droplet_tag = digitalocean_tag.foo.id
  149. depends_on = ["digitalocean_droplet.foo"]
  150. }
  151. data "digitalocean_loadbalancer" "foobar" {
  152. name = digitalocean_loadbalancer.foo.name
  153. }`, rInt, rInt)
  154. }
  155. const (
  156. testAccCheckDataSourceDigitalOceanLoadBalancerConfig_multipleRules = `
  157. data "digitalocean_loadbalancer" "foobar" {
  158. name = digitalocean_loadbalancer.foobar.name
  159. }`
  160. )