github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/builtin/providers/aws/resource_aws_route_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/aws/aws-sdk-go/service/ec2"
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"github.com/hashicorp/terraform/terraform"
    10  )
    11  
    12  func TestAccAWSRoute_basic(t *testing.T) {
    13  	var route ec2.Route
    14  
    15  	//aws creates a default route
    16  	testCheck := func(s *terraform.State) error {
    17  		if *route.DestinationCidrBlock != "10.3.0.0/16" {
    18  			return fmt.Errorf("Destination Cidr (Expected=%s, Actual=%s)\n", "10.3.0.0/16", *route.DestinationCidrBlock)
    19  		}
    20  
    21  		name := "aws_internet_gateway.foo"
    22  		gwres, ok := s.RootModule().Resources[name]
    23  		if !ok {
    24  			return fmt.Errorf("Not found: %s\n", name)
    25  		}
    26  
    27  		if *route.GatewayId != gwres.Primary.ID {
    28  			return fmt.Errorf("Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.GatewayId)
    29  		}
    30  
    31  		return nil
    32  	}
    33  
    34  	resource.Test(t, resource.TestCase{
    35  		PreCheck: func() {
    36  			testAccPreCheck(t)
    37  		},
    38  		Providers:    testAccProviders,
    39  		CheckDestroy: testAccCheckAWSRouteDestroy,
    40  		Steps: []resource.TestStep{
    41  			{
    42  				Config: testAccAWSRouteBasicConfig,
    43  				Check: resource.ComposeTestCheckFunc(
    44  					testAccCheckAWSRouteExists("aws_route.bar", &route),
    45  					testCheck,
    46  				),
    47  			},
    48  		},
    49  	})
    50  }
    51  
    52  func TestAccAWSRoute_ipv6Support(t *testing.T) {
    53  	var route ec2.Route
    54  
    55  	//aws creates a default route
    56  	testCheck := func(s *terraform.State) error {
    57  
    58  		name := "aws_egress_only_internet_gateway.foo"
    59  		gwres, ok := s.RootModule().Resources[name]
    60  		if !ok {
    61  			return fmt.Errorf("Not found: %s\n", name)
    62  		}
    63  
    64  		if *route.EgressOnlyInternetGatewayId != gwres.Primary.ID {
    65  			return fmt.Errorf("Egress Only Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.EgressOnlyInternetGatewayId)
    66  		}
    67  
    68  		return nil
    69  	}
    70  
    71  	resource.Test(t, resource.TestCase{
    72  		PreCheck: func() {
    73  			testAccPreCheck(t)
    74  		},
    75  		Providers:    testAccProviders,
    76  		CheckDestroy: testAccCheckAWSRouteDestroy,
    77  		Steps: []resource.TestStep{
    78  			{
    79  				Config: testAccAWSRouteConfigIpv6,
    80  				Check: resource.ComposeTestCheckFunc(
    81  					testAccCheckAWSRouteExists("aws_route.bar", &route),
    82  					testCheck,
    83  				),
    84  			},
    85  		},
    86  	})
    87  }
    88  
    89  func TestAccAWSRoute_ipv6ToInternetGateway(t *testing.T) {
    90  	var route ec2.Route
    91  
    92  	resource.Test(t, resource.TestCase{
    93  		PreCheck: func() {
    94  			testAccPreCheck(t)
    95  		},
    96  		Providers:    testAccProviders,
    97  		CheckDestroy: testAccCheckAWSRouteDestroy,
    98  		Steps: []resource.TestStep{
    99  			{
   100  				Config: testAccAWSRouteConfigIpv6InternetGateway,
   101  				Check: resource.ComposeTestCheckFunc(
   102  					testAccCheckAWSRouteExists("aws_route.igw", &route),
   103  				),
   104  			},
   105  		},
   106  	})
   107  }
   108  
   109  func TestAccAWSRoute_changeCidr(t *testing.T) {
   110  	var route ec2.Route
   111  	var routeTable ec2.RouteTable
   112  
   113  	//aws creates a default route
   114  	testCheck := func(s *terraform.State) error {
   115  		if *route.DestinationCidrBlock != "10.3.0.0/16" {
   116  			return fmt.Errorf("Destination Cidr (Expected=%s, Actual=%s)\n", "10.3.0.0/16", *route.DestinationCidrBlock)
   117  		}
   118  
   119  		name := "aws_internet_gateway.foo"
   120  		gwres, ok := s.RootModule().Resources[name]
   121  		if !ok {
   122  			return fmt.Errorf("Not found: %s\n", name)
   123  		}
   124  
   125  		if *route.GatewayId != gwres.Primary.ID {
   126  			return fmt.Errorf("Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.GatewayId)
   127  		}
   128  
   129  		return nil
   130  	}
   131  
   132  	testCheckChange := func(s *terraform.State) error {
   133  		if *route.DestinationCidrBlock != "10.2.0.0/16" {
   134  			return fmt.Errorf("Destination Cidr (Expected=%s, Actual=%s)\n", "10.2.0.0/16", *route.DestinationCidrBlock)
   135  		}
   136  
   137  		name := "aws_internet_gateway.foo"
   138  		gwres, ok := s.RootModule().Resources[name]
   139  		if !ok {
   140  			return fmt.Errorf("Not found: %s\n", name)
   141  		}
   142  
   143  		if *route.GatewayId != gwres.Primary.ID {
   144  			return fmt.Errorf("Internet Gateway Id (Expected=%s, Actual=%s)\n", gwres.Primary.ID, *route.GatewayId)
   145  		}
   146  
   147  		if rtlen := len(routeTable.Routes); rtlen != 2 {
   148  			return fmt.Errorf("Route Table has too many routes (Expected=%d, Actual=%d)\n", rtlen, 2)
   149  		}
   150  
   151  		return nil
   152  	}
   153  
   154  	resource.Test(t, resource.TestCase{
   155  		PreCheck: func() {
   156  			testAccPreCheck(t)
   157  		},
   158  		Providers:    testAccProviders,
   159  		CheckDestroy: testAccCheckAWSRouteDestroy,
   160  		Steps: []resource.TestStep{
   161  			{
   162  				Config: testAccAWSRouteBasicConfig,
   163  				Check: resource.ComposeTestCheckFunc(
   164  					testAccCheckAWSRouteExists("aws_route.bar", &route),
   165  					testCheck,
   166  				),
   167  			},
   168  			{
   169  				Config: testAccAWSRouteBasicConfigChangeCidr,
   170  				Check: resource.ComposeTestCheckFunc(
   171  					testAccCheckAWSRouteExists("aws_route.bar", &route),
   172  					testAccCheckRouteTableExists("aws_route_table.foo", &routeTable),
   173  					testCheckChange,
   174  				),
   175  			},
   176  		},
   177  	})
   178  }
   179  
   180  func TestAccAWSRoute_noopdiff(t *testing.T) {
   181  	var route ec2.Route
   182  	var routeTable ec2.RouteTable
   183  
   184  	testCheck := func(s *terraform.State) error {
   185  		return nil
   186  	}
   187  
   188  	testCheckChange := func(s *terraform.State) error {
   189  		return nil
   190  	}
   191  
   192  	resource.Test(t, resource.TestCase{
   193  		PreCheck: func() {
   194  			testAccPreCheck(t)
   195  		},
   196  		Providers:    testAccProviders,
   197  		CheckDestroy: testAccCheckAWSRouteDestroy,
   198  		Steps: []resource.TestStep{
   199  			{
   200  				Config: testAccAWSRouteNoopChange,
   201  				Check: resource.ComposeTestCheckFunc(
   202  					testAccCheckAWSRouteExists("aws_route.test", &route),
   203  					testCheck,
   204  				),
   205  			},
   206  			{
   207  				Config: testAccAWSRouteNoopChange,
   208  				Check: resource.ComposeTestCheckFunc(
   209  					testAccCheckAWSRouteExists("aws_route.test", &route),
   210  					testAccCheckRouteTableExists("aws_route_table.test", &routeTable),
   211  					testCheckChange,
   212  				),
   213  			},
   214  		},
   215  	})
   216  }
   217  
   218  func TestAccAWSRoute_doesNotCrashWithVPCEndpoint(t *testing.T) {
   219  	var route ec2.Route
   220  
   221  	resource.Test(t, resource.TestCase{
   222  		PreCheck:     func() { testAccPreCheck(t) },
   223  		Providers:    testAccProviders,
   224  		CheckDestroy: testAccCheckAWSRouteDestroy,
   225  		Steps: []resource.TestStep{
   226  			{
   227  				Config: testAccAWSRouteWithVPCEndpoint,
   228  				Check: resource.ComposeTestCheckFunc(
   229  					testAccCheckAWSRouteExists("aws_route.bar", &route),
   230  				),
   231  			},
   232  		},
   233  	})
   234  }
   235  
   236  func testAccCheckAWSRouteExists(n string, res *ec2.Route) resource.TestCheckFunc {
   237  	return func(s *terraform.State) error {
   238  		rs, ok := s.RootModule().Resources[n]
   239  		if !ok {
   240  			return fmt.Errorf("Not found: %s\n", n)
   241  		}
   242  
   243  		if rs.Primary.ID == "" {
   244  			return fmt.Errorf("No ID is set")
   245  		}
   246  
   247  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
   248  		r, err := findResourceRoute(
   249  			conn,
   250  			rs.Primary.Attributes["route_table_id"],
   251  			rs.Primary.Attributes["destination_cidr_block"],
   252  			rs.Primary.Attributes["destination_ipv6_cidr_block"],
   253  		)
   254  
   255  		if err != nil {
   256  			return err
   257  		}
   258  
   259  		if r == nil {
   260  			return fmt.Errorf("Route not found")
   261  		}
   262  
   263  		*res = *r
   264  
   265  		return nil
   266  	}
   267  }
   268  
   269  func testAccCheckAWSRouteDestroy(s *terraform.State) error {
   270  	for _, rs := range s.RootModule().Resources {
   271  		if rs.Type != "aws_route" {
   272  			continue
   273  		}
   274  
   275  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
   276  		route, err := findResourceRoute(
   277  			conn,
   278  			rs.Primary.Attributes["route_table_id"],
   279  			rs.Primary.Attributes["destination_cidr_block"],
   280  			rs.Primary.Attributes["destination_ipv6_cidr_block"],
   281  		)
   282  
   283  		if route == nil && err == nil {
   284  			return nil
   285  		}
   286  	}
   287  
   288  	return nil
   289  }
   290  
   291  var testAccAWSRouteBasicConfig = fmt.Sprint(`
   292  resource "aws_vpc" "foo" {
   293  	cidr_block = "10.1.0.0/16"
   294  }
   295  
   296  resource "aws_internet_gateway" "foo" {
   297  	vpc_id = "${aws_vpc.foo.id}"
   298  }
   299  
   300  resource "aws_route_table" "foo" {
   301  	vpc_id = "${aws_vpc.foo.id}"
   302  }
   303  
   304  resource "aws_route" "bar" {
   305  	route_table_id = "${aws_route_table.foo.id}"
   306  	destination_cidr_block = "10.3.0.0/16"
   307  	gateway_id = "${aws_internet_gateway.foo.id}"
   308  }
   309  `)
   310  
   311  var testAccAWSRouteConfigIpv6InternetGateway = fmt.Sprintf(`
   312  resource "aws_vpc" "foo" {
   313    cidr_block = "10.1.0.0/16"
   314    assign_generated_ipv6_cidr_block = true
   315  }
   316  
   317  resource "aws_egress_only_internet_gateway" "foo" {
   318  	vpc_id = "${aws_vpc.foo.id}"
   319  }
   320  
   321  resource "aws_internet_gateway" "foo" {
   322    vpc_id = "${aws_vpc.foo.id}"
   323  }
   324  
   325  resource "aws_route_table" "external" {
   326  	vpc_id = "${aws_vpc.foo.id}"
   327  }
   328  
   329  resource "aws_route" "igw" {
   330    route_table_id = "${aws_route_table.external.id}"
   331    destination_ipv6_cidr_block = "::/0"
   332    gateway_id = "${aws_internet_gateway.foo.id}"
   333  }
   334  
   335  `)
   336  
   337  var testAccAWSRouteConfigIpv6 = fmt.Sprintf(`
   338  resource "aws_vpc" "foo" {
   339    cidr_block = "10.1.0.0/16"
   340    assign_generated_ipv6_cidr_block = true
   341  }
   342  
   343  resource "aws_egress_only_internet_gateway" "foo" {
   344  	vpc_id = "${aws_vpc.foo.id}"
   345  }
   346  
   347  resource "aws_route_table" "foo" {
   348  	vpc_id = "${aws_vpc.foo.id}"
   349  }
   350  
   351  resource "aws_route" "bar" {
   352  	route_table_id = "${aws_route_table.foo.id}"
   353  	destination_ipv6_cidr_block = "::/0"
   354  	egress_only_gateway_id = "${aws_egress_only_internet_gateway.foo.id}"
   355  }
   356  
   357  
   358  `)
   359  
   360  var testAccAWSRouteBasicConfigChangeCidr = fmt.Sprint(`
   361  resource "aws_vpc" "foo" {
   362  	cidr_block = "10.1.0.0/16"
   363  }
   364  
   365  resource "aws_internet_gateway" "foo" {
   366  	vpc_id = "${aws_vpc.foo.id}"
   367  }
   368  
   369  resource "aws_route_table" "foo" {
   370  	vpc_id = "${aws_vpc.foo.id}"
   371  }
   372  
   373  resource "aws_route" "bar" {
   374  	route_table_id = "${aws_route_table.foo.id}"
   375  	destination_cidr_block = "10.2.0.0/16"
   376  	gateway_id = "${aws_internet_gateway.foo.id}"
   377  }
   378  `)
   379  
   380  // Acceptance test if mixed inline and external routes are implemented
   381  var testAccAWSRouteMixConfig = fmt.Sprint(`
   382  resource "aws_vpc" "foo" {
   383  	cidr_block = "10.1.0.0/16"
   384  }
   385  
   386  resource "aws_internet_gateway" "foo" {
   387  	vpc_id = "${aws_vpc.foo.id}"
   388  }
   389  
   390  resource "aws_route_table" "foo" {
   391  	vpc_id = "${aws_vpc.foo.id}"
   392  
   393  	route {
   394  		cidr_block = "10.2.0.0/16"
   395  		gateway_id = "${aws_internet_gateway.foo.id}"
   396  	}
   397  }
   398  
   399  resource "aws_route" "bar" {
   400  	route_table_id = "${aws_route_table.foo.id}"
   401  	destination_cidr_block = "0.0.0.0/0"
   402  	gateway_id = "${aws_internet_gateway.foo.id}"
   403  }
   404  `)
   405  
   406  var testAccAWSRouteNoopChange = fmt.Sprint(`
   407  resource "aws_vpc" "test" {
   408    cidr_block = "10.10.0.0/16"
   409  }
   410  
   411  resource "aws_route_table" "test" {
   412    vpc_id = "${aws_vpc.test.id}"
   413  }
   414  
   415  resource "aws_subnet" "test" {
   416    vpc_id = "${aws_vpc.test.id}"
   417    cidr_block = "10.10.10.0/24"
   418  }
   419  
   420  resource "aws_route" "test" {
   421    route_table_id = "${aws_route_table.test.id}"
   422    destination_cidr_block = "0.0.0.0/0"
   423    instance_id = "${aws_instance.nat.id}"
   424  }
   425  
   426  resource "aws_instance" "nat" {
   427    ami = "ami-9abea4fb"
   428    instance_type = "t2.nano"
   429    subnet_id = "${aws_subnet.test.id}"
   430  }
   431  `)
   432  
   433  var testAccAWSRouteWithVPCEndpoint = fmt.Sprint(`
   434  resource "aws_vpc" "foo" {
   435    cidr_block = "10.1.0.0/16"
   436  }
   437  
   438  resource "aws_internet_gateway" "foo" {
   439    vpc_id = "${aws_vpc.foo.id}"
   440  }
   441  
   442  resource "aws_route_table" "foo" {
   443    vpc_id = "${aws_vpc.foo.id}"
   444  }
   445  
   446  resource "aws_route" "bar" {
   447    route_table_id         = "${aws_route_table.foo.id}"
   448    destination_cidr_block = "10.3.0.0/16"
   449    gateway_id             = "${aws_internet_gateway.foo.id}"
   450  
   451    # Forcing endpoint to create before route - without this the crash is a race.
   452    depends_on = ["aws_vpc_endpoint.baz"]
   453  }
   454  
   455  resource "aws_vpc_endpoint" "baz" {
   456    vpc_id          = "${aws_vpc.foo.id}"
   457    service_name    = "com.amazonaws.us-west-2.s3"
   458    route_table_ids = ["${aws_route_table.foo.id}"]
   459  }
   460  `)