Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New resources: aws_dx_hosted_transit_virtual_interface and aws_dx_hosted_transit_virtual_interface_accepter #8523

Merged
Merged
Prev Previous commit
Next Next commit
Run acceptance tests serially: 'Only one Transit Virtual Interface is…
… allowed on a Connection'.
  • Loading branch information
Kit Ewbank authored and ewbankkit committed Oct 4, 2019
commit 570cc624d2ac9c8713697db5ee9f3883e23cfd05
205 changes: 161 additions & 44 deletions aws/resource_aws_dx_hosted_transit_virtual_interface_test.go
Original file line number Diff line number Diff line change
@@ -3,6 +3,8 @@ package aws
import (
"fmt"
"os"
"regexp"
"strconv"
"testing"

"github.com/aws/aws-sdk-go/aws"
@@ -13,22 +15,38 @@ import (
"github.com/hashicorp/terraform/terraform"
)

func TestAccAwsDxHostedTransitVirtualInterface_basic(t *testing.T) {
func TestAccAwsDxHostedTransitVirtualInterface(t *testing.T) {
testCases := map[string]func(t *testing.T){
"basic": testAccAwsDxHostedTransitVirtualInterface_basic,
"accepterTags": testAccAwsDxHostedTransitVirtualInterface_accepterTags,
}

for name, tc := range testCases {
tc := tc
t.Run(name, func(t *testing.T) {
tc(t)
})
}
}

func testAccAwsDxHostedTransitVirtualInterface_basic(t *testing.T) {
key := "DX_CONNECTION_ID"
connectionId := os.Getenv(key)
if connectionId == "" {
t.Skipf("Environment variable %s is not set", key)
}

var providers []*schema.Provider
resourceNameHostedVif := "aws_dx_hosted_transit_virtual_interface.test"
resourceNameHostedVifAccepter := "aws_dx_hosted_transit_virtual_interface_accepter.test"
var vif directconnect.VirtualInterface
resourceName := "aws_dx_hosted_transit_virtual_interface.test"
accepterResourceName := "aws_dx_hosted_transit_virtual_interface_accepter.test"
dxGatewayResourceName := "aws_dx_gateway.test"
rName := fmt.Sprintf("tf-testacc-transit-vif-%s", acctest.RandString(9))
amzAsn := randIntRange(64512, 65534)
bgpAsn := randIntRange(64512, 65534)
vlan := randIntRange(2049, 4094)

resource.ParallelTest(t, resource.TestCase{
resource.Test(t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
testAccAlternateAccountPreCheck(t)
@@ -39,30 +57,116 @@ func TestAccAwsDxHostedTransitVirtualInterface_basic(t *testing.T) {
{
Config: testAccDxHostedTransitVirtualInterfaceConfig_basic(connectionId, rName, amzAsn, bgpAsn, vlan),
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsDxHostedTransitVirtualInterfaceExists(resourceNameHostedVif),
testAccCheckAwsDxHostedTransitVirtualInterfaceAccepterExists(resourceNameHostedVifAccepter),
resource.TestCheckResourceAttr(resourceNameHostedVif, "name", rName),
resource.TestCheckResourceAttr(resourceNameHostedVif, "mtu", "1500"),
resource.TestCheckResourceAttr(resourceNameHostedVif, "jumbo_frame_capable", "true"),
resource.TestCheckResourceAttr(resourceNameHostedVifAccepter, "tags.%", "0"),
testAccCheckAwsDxHostedTransitVirtualInterfaceExists(resourceName, &vif),
resource.TestCheckResourceAttr(resourceName, "address_family", "ipv4"),
resource.TestCheckResourceAttrSet(resourceName, "amazon_address"),
testAccMatchResourceAttrRegionalARN(resourceName, "arn", "directconnect", regexp.MustCompile(fmt.Sprintf("dxvif/%s", aws.StringValue(vif.VirtualInterfaceId)))),
resource.TestCheckResourceAttrSet(resourceName, "aws_device"),
resource.TestCheckResourceAttr(resourceName, "bgp_asn", strconv.Itoa(bgpAsn)),
resource.TestCheckResourceAttrSet(resourceName, "bgp_auth_key"),
resource.TestCheckResourceAttr(resourceName, "connection_id", connectionId),
resource.TestCheckResourceAttrSet(resourceName, "customer_address"),
resource.TestCheckResourceAttr(resourceName, "jumbo_frame_capable", "true"),
resource.TestCheckResourceAttr(resourceName, "mtu", "1500"),
resource.TestCheckResourceAttr(resourceName, "name", rName),
resource.TestCheckResourceAttrSet(resourceName, "owner_account_id"),
resource.TestCheckResourceAttr(resourceName, "vlan", strconv.Itoa(vlan)),
// Accepter's attributes:
resource.TestCheckResourceAttrSet(accepterResourceName, "arn"),
resource.TestCheckResourceAttrPair(accepterResourceName, "dx_gateway_id", dxGatewayResourceName, "id"),
resource.TestCheckResourceAttr(accepterResourceName, "tags.%", "0"),
resource.TestCheckResourceAttrPair(accepterResourceName, "virtual_interface_id", resourceName, "id"),
),
},
// Test import.
{
Config: testAccDxHostedTransitVirtualInterfaceConfig_updated(connectionId, rName, amzAsn, bgpAsn, vlan),
Config: testAccDxHostedTransitVirtualInterfaceConfig_basic(connectionId, rName, amzAsn, bgpAsn, vlan),
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func testAccAwsDxHostedTransitVirtualInterface_accepterTags(t *testing.T) {
key := "DX_CONNECTION_ID"
connectionId := os.Getenv(key)
if connectionId == "" {
t.Skipf("Environment variable %s is not set", key)
}

var providers []*schema.Provider
var vif directconnect.VirtualInterface
resourceName := "aws_dx_hosted_transit_virtual_interface.test"
accepterResourceName := "aws_dx_hosted_transit_virtual_interface_accepter.test"
dxGatewayResourceName := "aws_dx_gateway.test"
rName := fmt.Sprintf("tf-testacc-transit-vif-%s", acctest.RandString(9))
amzAsn := randIntRange(64512, 65534)
bgpAsn := randIntRange(64512, 65534)
vlan := randIntRange(2049, 4094)

resource.Test(t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
testAccAlternateAccountPreCheck(t)
},
ProviderFactories: testAccProviderFactories(&providers),
CheckDestroy: testAccCheckAwsDxHostedTransitVirtualInterfaceDestroy,
Steps: []resource.TestStep{
{
Config: testAccDxHostedTransitVirtualInterfaceConfig_accepterTags(connectionId, rName, amzAsn, bgpAsn, vlan),
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsDxHostedTransitVirtualInterfaceExists(resourceNameHostedVif),
testAccCheckAwsDxHostedTransitVirtualInterfaceAccepterExists(resourceNameHostedVifAccepter),
resource.TestCheckResourceAttr(resourceNameHostedVif, "name", rName),
resource.TestCheckResourceAttr(resourceNameHostedVifAccepter, "tags.%", "1"),
resource.TestCheckResourceAttr(resourceNameHostedVifAccepter, "tags.Environment", "test"),
testAccCheckAwsDxHostedTransitVirtualInterfaceExists(resourceName, &vif),
resource.TestCheckResourceAttr(resourceName, "address_family", "ipv4"),
resource.TestCheckResourceAttrSet(resourceName, "amazon_address"),
testAccMatchResourceAttrRegionalARN(resourceName, "arn", "directconnect", regexp.MustCompile(fmt.Sprintf("dxvif/%s", aws.StringValue(vif.VirtualInterfaceId)))),
resource.TestCheckResourceAttrSet(resourceName, "aws_device"),
resource.TestCheckResourceAttr(resourceName, "bgp_asn", strconv.Itoa(bgpAsn)),
resource.TestCheckResourceAttrSet(resourceName, "bgp_auth_key"),
resource.TestCheckResourceAttr(resourceName, "connection_id", connectionId),
resource.TestCheckResourceAttrSet(resourceName, "customer_address"),
resource.TestCheckResourceAttr(resourceName, "jumbo_frame_capable", "true"),
resource.TestCheckResourceAttr(resourceName, "mtu", "1500"),
resource.TestCheckResourceAttr(resourceName, "name", rName),
resource.TestCheckResourceAttrSet(resourceName, "owner_account_id"),
resource.TestCheckResourceAttr(resourceName, "vlan", strconv.Itoa(vlan)),
// Accepter's attributes:
resource.TestCheckResourceAttrSet(accepterResourceName, "arn"),
resource.TestCheckResourceAttrPair(accepterResourceName, "dx_gateway_id", dxGatewayResourceName, "id"),
resource.TestCheckResourceAttr(accepterResourceName, "tags.%", "3"),
resource.TestCheckResourceAttr(accepterResourceName, "tags.Name", rName),
resource.TestCheckResourceAttr(accepterResourceName, "tags.Key1", "Value1"),
resource.TestCheckResourceAttr(accepterResourceName, "tags.Key2", "Value2a"),
resource.TestCheckResourceAttrPair(accepterResourceName, "virtual_interface_id", resourceName, "id"),
),
},
// Test import.
{
Config: testAccDxHostedTransitVirtualInterfaceConfig_updated(connectionId, rName, amzAsn, bgpAsn, vlan),
ResourceName: resourceNameHostedVif,
ImportState: true,
ImportStateVerify: true,
Config: testAccDxHostedTransitVirtualInterfaceConfig_accepterTagsUpdated(connectionId, rName, amzAsn, bgpAsn, vlan),
Check: resource.ComposeTestCheckFunc(
testAccCheckAwsDxHostedTransitVirtualInterfaceExists(resourceName, &vif),
resource.TestCheckResourceAttr(resourceName, "address_family", "ipv4"),
resource.TestCheckResourceAttrSet(resourceName, "amazon_address"),
testAccMatchResourceAttrRegionalARN(resourceName, "arn", "directconnect", regexp.MustCompile(fmt.Sprintf("dxvif/%s", aws.StringValue(vif.VirtualInterfaceId)))),
resource.TestCheckResourceAttrSet(resourceName, "aws_device"),
resource.TestCheckResourceAttr(resourceName, "bgp_asn", strconv.Itoa(bgpAsn)),
resource.TestCheckResourceAttrSet(resourceName, "bgp_auth_key"),
resource.TestCheckResourceAttr(resourceName, "connection_id", connectionId),
resource.TestCheckResourceAttrSet(resourceName, "customer_address"),
resource.TestCheckResourceAttr(resourceName, "jumbo_frame_capable", "true"),
resource.TestCheckResourceAttr(resourceName, "mtu", "1500"),
resource.TestCheckResourceAttr(resourceName, "name", rName),
resource.TestCheckResourceAttrSet(resourceName, "owner_account_id"),
resource.TestCheckResourceAttr(resourceName, "vlan", strconv.Itoa(vlan)),
// Accepter's attributes:
resource.TestCheckResourceAttrSet(accepterResourceName, "arn"),
resource.TestCheckResourceAttrPair(accepterResourceName, "dx_gateway_id", dxGatewayResourceName, "id"),
resource.TestCheckResourceAttr(accepterResourceName, "tags.%", "3"),
resource.TestCheckResourceAttr(accepterResourceName, "tags.Name", rName),
resource.TestCheckResourceAttr(accepterResourceName, "tags.Key2", "Value2b"),
resource.TestCheckResourceAttr(accepterResourceName, "tags.Key3", "Value3"),
resource.TestCheckResourceAttrPair(accepterResourceName, "virtual_interface_id", resourceName, "id"),
),
},
},
})
@@ -106,7 +210,7 @@ func testAccCheckAwsDxHostedTransitVirtualInterfaceDestroy(s *terraform.State) e
return nil
}

func testAccCheckAwsDxHostedTransitVirtualInterfaceExists(name string) resource.TestCheckFunc {
func testAccCheckAwsDxHostedTransitVirtualInterfaceExists(name string, vif *directconnect.VirtualInterface) resource.TestCheckFunc {
return func(s *terraform.State) error {
conn := testAccProvider.Meta().(*AWSClient).dxconn

@@ -118,24 +222,19 @@ func testAccCheckAwsDxHostedTransitVirtualInterfaceExists(name string) resource.
return fmt.Errorf("No ID is set")
}

_, err := conn.DescribeVirtualInterfaces(&directconnect.DescribeVirtualInterfacesInput{
resp, err := conn.DescribeVirtualInterfaces(&directconnect.DescribeVirtualInterfacesInput{
VirtualInterfaceId: aws.String(rs.Primary.ID),
})
if err != nil {
return err
}

return nil
}
}

func testAccCheckAwsDxHostedTransitVirtualInterfaceAccepterExists(name string) resource.TestCheckFunc {
return func(s *terraform.State) error {
_, ok := s.RootModule().Resources[name]
if !ok {
return fmt.Errorf("Not found: %s", name)
if n := len(resp.VirtualInterfaces); n != 1 {
return fmt.Errorf("Found %d Direct Connect virtual interfaces for %s, expected 1", n, rs.Primary.ID)
}

*vif = *resp.VirtualInterfaces[0]

return nil
}
}
@@ -144,13 +243,12 @@ func testAccDxHostedTransitVirtualInterfaceConfig_base(cid, rName string, amzAsn
return testAccAlternateAccountProviderConfig() + fmt.Sprintf(`
# Creator
resource "aws_dx_hosted_transit_virtual_interface" "test" {
address_family = "ipv4"
bgp_asn = %[4]d
connection_id = %[1]q
name = %[2]q
owner_account_id = "${data.aws_caller_identity.accepter.account_id}"

name = %[2]q
vlan = %[5]d
address_family = "ipv4"
bgp_asn = %[4]d
vlan = %[5]d

# The aws_dx_hosted_transit_virtual_interface
# must be destroyed before the aws_dx_gateway.
@@ -165,34 +263,53 @@ data "aws_caller_identity" "accepter" {
resource "aws_dx_gateway" "test" {
provider = "aws.alternate"

name = %[2]q
amazon_side_asn = %[3]d
name = %[2]q
}
`, cid, rName, amzAsn, bgpAsn, vlan)
}

func testAccDxHostedTransitVirtualInterfaceConfig_basic(cid, rName string, amzAsn, bgpAsn, vlan int) string {
return testAccDxHostedTransitVirtualInterfaceConfig_base(cid, rName, amzAsn, bgpAsn, vlan) + fmt.Sprintf(`
resource "aws_dx_hosted_transit_virtual_interface_accepter" "test" {
provider = "aws.alternate"
provider = "aws.alternate"

virtual_interface_id = "${aws_dx_hosted_transit_virtual_interface.test.id}"
dx_gateway_id = "${aws_dx_gateway.test.id}"
virtual_interface_id = "${aws_dx_hosted_transit_virtual_interface.test.id}"
}
`)
}

func testAccDxHostedTransitVirtualInterfaceConfig_updated(cid, rName string, amzAsn, bgpAsn, vlan int) string {
func testAccDxHostedTransitVirtualInterfaceConfig_accepterTags(cid, rName string, amzAsn, bgpAsn, vlan int) string {
return testAccDxHostedTransitVirtualInterfaceConfig_base(cid, rName, amzAsn, bgpAsn, vlan) + fmt.Sprintf(`
resource "aws_dx_hosted_transit_virtual_interface_accepter" "test" {
provider = "aws.alternate"
provider = "aws.alternate"

dx_gateway_id = "${aws_dx_gateway.test.id}"
virtual_interface_id = "${aws_dx_hosted_transit_virtual_interface.test.id}"

tags = {
Name = %[1]q
Key1 = "Value1"
Key2 = "Value2a"
}
}
`, rName)
}

func testAccDxHostedTransitVirtualInterfaceConfig_accepterTagsUpdated(cid, rName string, amzAsn, bgpAsn, vlan int) string {
return testAccDxHostedTransitVirtualInterfaceConfig_base(cid, rName, amzAsn, bgpAsn, vlan) + fmt.Sprintf(`
resource "aws_dx_hosted_transit_virtual_interface_accepter" "test" {
provider = "aws.alternate"

dx_gateway_id = "${aws_dx_gateway.test.id}"
virtual_interface_id = "${aws_dx_hosted_transit_virtual_interface.test.id}"

tags = {
Environment = "test"
Name = %[1]q
Key2 = "Value2b"
Key3 = "Value3"
}
}
`)
`, rName)
}