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, &notMainRTFilter}
   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  }