/aws/resource_aws_dx_public_virtual_interface_test.go

https://github.com/terraform-providers/terraform-provider-aws · Go · 226 lines · 207 code · 13 blank · 6 comment · 4 complexity · 7f6eaa6c12eb392b65c92e1a8ce36257 MD5 · raw file

  1. package aws
  2. import (
  3. "fmt"
  4. "os"
  5. "regexp"
  6. "strconv"
  7. "testing"
  8. "github.com/aws/aws-sdk-go/aws"
  9. "github.com/aws/aws-sdk-go/service/directconnect"
  10. "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
  11. "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
  12. "github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
  13. "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfawsresource"
  14. )
  15. func TestAccAwsDxPublicVirtualInterface_basic(t *testing.T) {
  16. key := "DX_CONNECTION_ID"
  17. connectionId := os.Getenv(key)
  18. if connectionId == "" {
  19. t.Skipf("Environment variable %s is not set", key)
  20. }
  21. var vif directconnect.VirtualInterface
  22. resourceName := "aws_dx_public_virtual_interface.test"
  23. rName := fmt.Sprintf("tf-testacc-public-vif-%s", acctest.RandString(10))
  24. // DirectConnectClientException: Amazon Address is not allowed to contain a private IP
  25. // DirectConnectClientException: Amazon Address and Customer Address must be in the same CIDR
  26. // DirectConnectClientException: Amazon Address is address 0 on its subnet.
  27. // DirectConnectClientException: Amazon Address is the broadcast address on its subnet.
  28. amazonAddress := "175.45.176.1/28"
  29. customerAddress := "175.45.176.2/28"
  30. bgpAsn := acctest.RandIntRange(64512, 65534)
  31. vlan := acctest.RandIntRange(2049, 4094)
  32. resource.ParallelTest(t, resource.TestCase{
  33. PreCheck: func() { testAccPreCheck(t) },
  34. Providers: testAccProviders,
  35. CheckDestroy: testAccCheckAwsDxPublicVirtualInterfaceDestroy,
  36. Steps: []resource.TestStep{
  37. {
  38. Config: testAccDxPublicVirtualInterfaceConfig_basic(connectionId, rName, amazonAddress, customerAddress, bgpAsn, vlan),
  39. Check: resource.ComposeTestCheckFunc(
  40. testAccCheckAwsDxPublicVirtualInterfaceExists(resourceName, &vif),
  41. resource.TestCheckResourceAttr(resourceName, "address_family", "ipv4"),
  42. resource.TestCheckResourceAttr(resourceName, "amazon_address", amazonAddress),
  43. resource.TestCheckResourceAttrSet(resourceName, "amazon_side_asn"),
  44. testAccMatchResourceAttrRegionalARN(resourceName, "arn", "directconnect", regexp.MustCompile(fmt.Sprintf("dxvif/%s", aws.StringValue(vif.VirtualInterfaceId)))),
  45. resource.TestCheckResourceAttrSet(resourceName, "aws_device"),
  46. resource.TestCheckResourceAttr(resourceName, "bgp_asn", strconv.Itoa(bgpAsn)),
  47. resource.TestCheckResourceAttrSet(resourceName, "bgp_auth_key"),
  48. resource.TestCheckResourceAttr(resourceName, "connection_id", connectionId),
  49. resource.TestCheckResourceAttr(resourceName, "customer_address", customerAddress),
  50. resource.TestCheckResourceAttr(resourceName, "name", rName),
  51. resource.TestCheckResourceAttr(resourceName, "route_filter_prefixes.#", "2"),
  52. tfawsresource.TestCheckTypeSetElemAttr(resourceName, "route_filter_prefixes.*", "210.52.109.0/24"),
  53. tfawsresource.TestCheckTypeSetElemAttr(resourceName, "route_filter_prefixes.*", "175.45.176.0/22"),
  54. resource.TestCheckResourceAttr(resourceName, "tags.%", "0"),
  55. resource.TestCheckResourceAttr(resourceName, "vlan", strconv.Itoa(vlan)),
  56. ),
  57. },
  58. // Test import.
  59. {
  60. ResourceName: resourceName,
  61. ImportState: true,
  62. ImportStateVerify: true,
  63. },
  64. },
  65. })
  66. }
  67. func TestAccAwsDxPublicVirtualInterface_Tags(t *testing.T) {
  68. key := "DX_CONNECTION_ID"
  69. connectionId := os.Getenv(key)
  70. if connectionId == "" {
  71. t.Skipf("Environment variable %s is not set", key)
  72. }
  73. var vif directconnect.VirtualInterface
  74. resourceName := "aws_dx_public_virtual_interface.test"
  75. rName := fmt.Sprintf("tf-testacc-public-vif-%s", acctest.RandString(10))
  76. amazonAddress := "175.45.176.3/28"
  77. customerAddress := "175.45.176.4/28"
  78. bgpAsn := acctest.RandIntRange(64512, 65534)
  79. vlan := acctest.RandIntRange(2049, 4094)
  80. resource.ParallelTest(t, resource.TestCase{
  81. PreCheck: func() { testAccPreCheck(t) },
  82. Providers: testAccProviders,
  83. CheckDestroy: testAccCheckAwsDxPublicVirtualInterfaceDestroy,
  84. Steps: []resource.TestStep{
  85. {
  86. Config: testAccDxPublicVirtualInterfaceConfig_tags(connectionId, rName, amazonAddress, customerAddress, bgpAsn, vlan),
  87. Check: resource.ComposeTestCheckFunc(
  88. testAccCheckAwsDxPublicVirtualInterfaceExists(resourceName, &vif),
  89. resource.TestCheckResourceAttr(resourceName, "address_family", "ipv4"),
  90. resource.TestCheckResourceAttr(resourceName, "amazon_address", amazonAddress),
  91. resource.TestCheckResourceAttrSet(resourceName, "amazon_side_asn"),
  92. testAccMatchResourceAttrRegionalARN(resourceName, "arn", "directconnect", regexp.MustCompile(fmt.Sprintf("dxvif/%s", aws.StringValue(vif.VirtualInterfaceId)))),
  93. resource.TestCheckResourceAttrSet(resourceName, "aws_device"),
  94. resource.TestCheckResourceAttr(resourceName, "bgp_asn", strconv.Itoa(bgpAsn)),
  95. resource.TestCheckResourceAttrSet(resourceName, "bgp_auth_key"),
  96. resource.TestCheckResourceAttr(resourceName, "connection_id", connectionId),
  97. resource.TestCheckResourceAttr(resourceName, "customer_address", customerAddress),
  98. resource.TestCheckResourceAttr(resourceName, "name", rName),
  99. resource.TestCheckResourceAttr(resourceName, "route_filter_prefixes.#", "2"),
  100. tfawsresource.TestCheckTypeSetElemAttr(resourceName, "route_filter_prefixes.*", "210.52.109.0/24"),
  101. tfawsresource.TestCheckTypeSetElemAttr(resourceName, "route_filter_prefixes.*", "175.45.176.0/22"),
  102. resource.TestCheckResourceAttr(resourceName, "tags.%", "3"),
  103. resource.TestCheckResourceAttr(resourceName, "tags.Name", rName),
  104. resource.TestCheckResourceAttr(resourceName, "tags.Key1", "Value1"),
  105. resource.TestCheckResourceAttr(resourceName, "tags.Key2", "Value2a"),
  106. resource.TestCheckResourceAttr(resourceName, "vlan", strconv.Itoa(vlan)),
  107. ),
  108. },
  109. {
  110. Config: testAccDxPublicVirtualInterfaceConfig_tagsUpdated(connectionId, rName, amazonAddress, customerAddress, bgpAsn, vlan),
  111. Check: resource.ComposeTestCheckFunc(
  112. testAccCheckAwsDxPublicVirtualInterfaceExists(resourceName, &vif),
  113. resource.TestCheckResourceAttr(resourceName, "address_family", "ipv4"),
  114. resource.TestCheckResourceAttr(resourceName, "amazon_address", amazonAddress),
  115. resource.TestCheckResourceAttrSet(resourceName, "amazon_side_asn"),
  116. testAccMatchResourceAttrRegionalARN(resourceName, "arn", "directconnect", regexp.MustCompile(fmt.Sprintf("dxvif/%s", aws.StringValue(vif.VirtualInterfaceId)))),
  117. resource.TestCheckResourceAttrSet(resourceName, "aws_device"),
  118. resource.TestCheckResourceAttr(resourceName, "bgp_asn", strconv.Itoa(bgpAsn)),
  119. resource.TestCheckResourceAttrSet(resourceName, "bgp_auth_key"),
  120. resource.TestCheckResourceAttr(resourceName, "connection_id", connectionId),
  121. resource.TestCheckResourceAttr(resourceName, "customer_address", customerAddress),
  122. resource.TestCheckResourceAttr(resourceName, "name", rName),
  123. resource.TestCheckResourceAttr(resourceName, "route_filter_prefixes.#", "2"),
  124. tfawsresource.TestCheckTypeSetElemAttr(resourceName, "route_filter_prefixes.*", "210.52.109.0/24"),
  125. tfawsresource.TestCheckTypeSetElemAttr(resourceName, "route_filter_prefixes.*", "175.45.176.0/22"),
  126. resource.TestCheckResourceAttr(resourceName, "tags.%", "3"),
  127. resource.TestCheckResourceAttr(resourceName, "tags.Name", rName),
  128. resource.TestCheckResourceAttr(resourceName, "tags.Key2", "Value2b"),
  129. resource.TestCheckResourceAttr(resourceName, "tags.Key3", "Value3"),
  130. resource.TestCheckResourceAttr(resourceName, "vlan", strconv.Itoa(vlan)),
  131. ),
  132. },
  133. // Test import.
  134. {
  135. ResourceName: resourceName,
  136. ImportState: true,
  137. ImportStateVerify: true,
  138. },
  139. },
  140. })
  141. }
  142. func testAccCheckAwsDxPublicVirtualInterfaceDestroy(s *terraform.State) error {
  143. return testAccCheckDxVirtualInterfaceDestroy(s, "aws_dx_public_virtual_interface")
  144. }
  145. func testAccCheckAwsDxPublicVirtualInterfaceExists(name string, vif *directconnect.VirtualInterface) resource.TestCheckFunc {
  146. return testAccCheckDxVirtualInterfaceExists(name, vif)
  147. }
  148. func testAccDxPublicVirtualInterfaceConfig_basic(cid, rName, amzAddr, custAddr string, bgpAsn, vlan int) string {
  149. return fmt.Sprintf(`
  150. resource "aws_dx_public_virtual_interface" "test" {
  151. address_family = "ipv4"
  152. amazon_address = %[3]q
  153. bgp_asn = %[5]d
  154. connection_id = %[1]q
  155. customer_address = %[4]q
  156. name = %[2]q
  157. vlan = %[6]d
  158. route_filter_prefixes = [
  159. "175.45.176.0/22",
  160. "210.52.109.0/24",
  161. ]
  162. }
  163. `, cid, rName, amzAddr, custAddr, bgpAsn, vlan)
  164. }
  165. func testAccDxPublicVirtualInterfaceConfig_tags(cid, rName, amzAddr, custAddr string, bgpAsn, vlan int) string {
  166. return fmt.Sprintf(`
  167. resource "aws_dx_public_virtual_interface" "test" {
  168. address_family = "ipv4"
  169. amazon_address = %[3]q
  170. bgp_asn = %[5]d
  171. connection_id = %[1]q
  172. customer_address = %[4]q
  173. name = %[2]q
  174. vlan = %[6]d
  175. route_filter_prefixes = [
  176. "175.45.176.0/22",
  177. "210.52.109.0/24",
  178. ]
  179. tags = {
  180. Name = %[2]q
  181. Key1 = "Value1"
  182. Key2 = "Value2a"
  183. }
  184. }
  185. `, cid, rName, amzAddr, custAddr, bgpAsn, vlan)
  186. }
  187. func testAccDxPublicVirtualInterfaceConfig_tagsUpdated(cid, rName, amzAddr, custAddr string, bgpAsn, vlan int) string {
  188. return fmt.Sprintf(`
  189. resource "aws_dx_public_virtual_interface" "test" {
  190. address_family = "ipv4"
  191. amazon_address = %[3]q
  192. bgp_asn = %[5]d
  193. connection_id = %[1]q
  194. customer_address = %[4]q
  195. name = %[2]q
  196. vlan = %[6]d
  197. route_filter_prefixes = [
  198. "175.45.176.0/22",
  199. "210.52.109.0/24",
  200. ]
  201. tags = {
  202. Name = %[2]q
  203. Key2 = "Value2b"
  204. Key3 = "Value3"
  205. }
  206. }
  207. `, cid, rName, amzAddr, custAddr, bgpAsn, vlan)
  208. }