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 `)