github.com/darmach/terratest@v0.34.8-0.20210517103231-80931f95e3ff/modules/aws/vpc_test.go (about) 1 package aws 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 "github.com/stretchr/testify/require" 8 9 "github.com/aws/aws-sdk-go/aws" 10 "github.com/aws/aws-sdk-go/service/ec2" 11 ) 12 13 func TestGetDefaultVpc(t *testing.T) { 14 t.Parallel() 15 16 region := GetRandomStableRegion(t, nil, nil) 17 vpc := GetDefaultVpc(t, region) 18 19 assert.NotEmpty(t, vpc.Name) 20 assert.True(t, len(vpc.Subnets) > 0) 21 assert.Regexp(t, "^vpc-[[:alnum:]]+$", vpc.Id) 22 } 23 24 func TestGetVpcById(t *testing.T) { 25 t.Parallel() 26 27 region := GetRandomStableRegion(t, nil, nil) 28 vpc := createVpc(t, region) 29 defer deleteVpc(t, *vpc.VpcId, region) 30 31 vpcTest := GetVpcById(t, *vpc.VpcId, region) 32 assert.Equal(t, *vpc.VpcId, vpcTest.Id) 33 } 34 35 func TestGetVpcsE(t *testing.T) { 36 t.Parallel() 37 38 region := GetRandomStableRegion(t, nil, nil) 39 azs := GetAvailabilityZones(t, region) 40 41 isDefaultFilterName := "isDefault" 42 isDefaultFilterValue := "true" 43 44 defaultVpcFilter := ec2.Filter{Name: &isDefaultFilterName, Values: []*string{&isDefaultFilterValue}} 45 vpcs, _ := GetVpcsE(t, []*ec2.Filter{&defaultVpcFilter}, region) 46 47 require.Equal(t, len(vpcs), 1) 48 assert.NotEmpty(t, vpcs[0].Name) 49 50 // the default VPC has by default one subnet per availability zone 51 // https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html 52 assert.Equal(t, len(vpcs[0].Subnets), len(azs)) 53 } 54 55 func TestGetFirstTwoOctets(t *testing.T) { 56 t.Parallel() 57 58 firstTwo := GetFirstTwoOctets("10.100.0.0/28") 59 if firstTwo != "10.100" { 60 t.Errorf("Received: %s, Expected: 10.100", firstTwo) 61 } 62 } 63 64 func TestIsPublicSubnet(t *testing.T) { 65 t.Parallel() 66 67 region := GetRandomStableRegion(t, nil, nil) 68 vpc := createVpc(t, region) 69 defer deleteVpc(t, *vpc.VpcId, region) 70 71 routeTable := createRouteTable(t, *vpc.VpcId, region) 72 subnet := createSubnet(t, *vpc.VpcId, *routeTable.RouteTableId, region) 73 assert.False(t, IsPublicSubnet(t, *subnet.SubnetId, region)) 74 75 createPublicRoute(t, *vpc.VpcId, *routeTable.RouteTableId, region) 76 assert.True(t, IsPublicSubnet(t, *subnet.SubnetId, region)) 77 } 78 79 func createPublicRoute(t *testing.T, vpcId string, routeTableId string, region string) { 80 ec2Client := NewEc2Client(t, region) 81 82 createIGWOut, igerr := ec2Client.CreateInternetGateway(&ec2.CreateInternetGatewayInput{}) 83 require.NoError(t, igerr) 84 85 _, aigerr := ec2Client.AttachInternetGateway(&ec2.AttachInternetGatewayInput{ 86 InternetGatewayId: createIGWOut.InternetGateway.InternetGatewayId, 87 VpcId: aws.String(vpcId), 88 }) 89 require.NoError(t, aigerr) 90 91 _, err := ec2Client.CreateRoute(&ec2.CreateRouteInput{ 92 RouteTableId: aws.String(routeTableId), 93 DestinationCidrBlock: aws.String("0.0.0.0/0"), 94 GatewayId: createIGWOut.InternetGateway.InternetGatewayId, 95 }) 96 97 require.NoError(t, err) 98 } 99 100 func createRouteTable(t *testing.T, vpcId string, region string) ec2.RouteTable { 101 ec2Client := NewEc2Client(t, region) 102 103 createRouteTableOutput, err := ec2Client.CreateRouteTable(&ec2.CreateRouteTableInput{ 104 VpcId: aws.String(vpcId), 105 }) 106 107 require.NoError(t, err) 108 return *createRouteTableOutput.RouteTable 109 } 110 111 func createSubnet(t *testing.T, vpcId string, routeTableId string, region string) ec2.Subnet { 112 ec2Client := NewEc2Client(t, region) 113 114 createSubnetOutput, err := ec2Client.CreateSubnet(&ec2.CreateSubnetInput{ 115 CidrBlock: aws.String("10.10.1.0/24"), 116 VpcId: aws.String(vpcId), 117 }) 118 require.NoError(t, err) 119 120 _, err = ec2Client.AssociateRouteTable(&ec2.AssociateRouteTableInput{ 121 RouteTableId: aws.String(routeTableId), 122 SubnetId: aws.String(*createSubnetOutput.Subnet.SubnetId), 123 }) 124 require.NoError(t, err) 125 126 return *createSubnetOutput.Subnet 127 } 128 129 func createVpc(t *testing.T, region string) ec2.Vpc { 130 ec2Client := NewEc2Client(t, region) 131 132 createVpcOutput, err := ec2Client.CreateVpc(&ec2.CreateVpcInput{ 133 CidrBlock: aws.String("10.10.0.0/16"), 134 }) 135 136 require.NoError(t, err) 137 return *createVpcOutput.Vpc 138 } 139 140 func deleteRouteTables(t *testing.T, vpcId string, region string) { 141 ec2Client := NewEc2Client(t, region) 142 143 vpcIDFilterName := "vpc-id" 144 vpcIDFilter := ec2.Filter{Name: &vpcIDFilterName, Values: []*string{&vpcId}} 145 146 // "You can't delete the main route table." 147 mainRTFilterName := "association.main" 148 mainRTFilterValue := "false" 149 notMainRTFilter := ec2.Filter{Name: &mainRTFilterName, Values: []*string{&mainRTFilterValue}} 150 151 filters := []*ec2.Filter{&vpcIDFilter, ¬MainRTFilter} 152 153 rtOutput, err := ec2Client.DescribeRouteTables(&ec2.DescribeRouteTablesInput{Filters: filters}) 154 require.NoError(t, err) 155 156 for _, rt := range rtOutput.RouteTables { 157 158 // "You must disassociate the route table from any subnets before you can delete it." 159 for _, assoc := range rt.Associations { 160 _, disassocErr := ec2Client.DisassociateRouteTable(&ec2.DisassociateRouteTableInput{ 161 AssociationId: assoc.RouteTableAssociationId, 162 }) 163 require.NoError(t, disassocErr) 164 } 165 166 _, err := ec2Client.DeleteRouteTable(&ec2.DeleteRouteTableInput{ 167 RouteTableId: rt.RouteTableId, 168 }) 169 require.NoError(t, err) 170 } 171 } 172 173 func deleteSubnets(t *testing.T, vpcId string, region string) { 174 ec2Client := NewEc2Client(t, region) 175 vpcIDFilterName := "vpc-id" 176 vpcIDFilter := ec2.Filter{Name: &vpcIDFilterName, Values: []*string{&vpcId}} 177 178 subnetsOutput, err := ec2Client.DescribeSubnets(&ec2.DescribeSubnetsInput{Filters: []*ec2.Filter{&vpcIDFilter}}) 179 require.NoError(t, err) 180 181 for _, subnet := range subnetsOutput.Subnets { 182 _, err := ec2Client.DeleteSubnet(&ec2.DeleteSubnetInput{ 183 SubnetId: subnet.SubnetId, 184 }) 185 require.NoError(t, err) 186 } 187 } 188 189 func deleteInternetGateways(t *testing.T, vpcId string, region string) { 190 ec2Client := NewEc2Client(t, region) 191 vpcIDFilterName := "attachment.vpc-id" 192 vpcIDFilter := ec2.Filter{Name: &vpcIDFilterName, Values: []*string{&vpcId}} 193 194 igwOutput, err := ec2Client.DescribeInternetGateways(&ec2.DescribeInternetGatewaysInput{Filters: []*ec2.Filter{&vpcIDFilter}}) 195 require.NoError(t, err) 196 197 for _, igw := range igwOutput.InternetGateways { 198 199 _, detachErr := ec2Client.DetachInternetGateway(&ec2.DetachInternetGatewayInput{ 200 InternetGatewayId: igw.InternetGatewayId, 201 VpcId: aws.String(vpcId), 202 }) 203 require.NoError(t, detachErr) 204 205 _, err := ec2Client.DeleteInternetGateway(&ec2.DeleteInternetGatewayInput{ 206 InternetGatewayId: igw.InternetGatewayId, 207 }) 208 require.NoError(t, err) 209 } 210 } 211 212 func deleteVpc(t *testing.T, vpcId string, region string) { 213 ec2Client := NewEc2Client(t, region) 214 215 deleteRouteTables(t, vpcId, region) 216 deleteSubnets(t, vpcId, region) 217 deleteInternetGateways(t, vpcId, region) 218 219 _, err := ec2Client.DeleteVpc(&ec2.DeleteVpcInput{ 220 VpcId: aws.String(vpcId), 221 }) 222 require.NoError(t, err) 223 }