github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_route_table_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/aws/awserr" 9 "github.com/aws/aws-sdk-go/service/ec2" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 func TestAccAWSRouteTable_basic(t *testing.T) { 15 var v ec2.RouteTable 16 17 testCheck := func(*terraform.State) error { 18 if len(v.Routes) != 2 { 19 return fmt.Errorf("bad routes: %#v", v.Routes) 20 } 21 22 routes := make(map[string]*ec2.Route) 23 for _, r := range v.Routes { 24 routes[*r.DestinationCidrBlock] = r 25 } 26 27 if _, ok := routes["10.1.0.0/16"]; !ok { 28 return fmt.Errorf("bad routes: %#v", v.Routes) 29 } 30 if _, ok := routes["10.2.0.0/16"]; !ok { 31 return fmt.Errorf("bad routes: %#v", v.Routes) 32 } 33 34 return nil 35 } 36 37 testCheckChange := func(*terraform.State) error { 38 if len(v.Routes) != 3 { 39 return fmt.Errorf("bad routes: %#v", v.Routes) 40 } 41 42 routes := make(map[string]*ec2.Route) 43 for _, r := range v.Routes { 44 routes[*r.DestinationCidrBlock] = r 45 } 46 47 if _, ok := routes["10.1.0.0/16"]; !ok { 48 return fmt.Errorf("bad routes: %#v", v.Routes) 49 } 50 if _, ok := routes["10.3.0.0/16"]; !ok { 51 return fmt.Errorf("bad routes: %#v", v.Routes) 52 } 53 if _, ok := routes["10.4.0.0/16"]; !ok { 54 return fmt.Errorf("bad routes: %#v", v.Routes) 55 } 56 57 return nil 58 } 59 60 resource.Test(t, resource.TestCase{ 61 PreCheck: func() { testAccPreCheck(t) }, 62 IDRefreshName: "aws_route_table.foo", 63 Providers: testAccProviders, 64 CheckDestroy: testAccCheckRouteTableDestroy, 65 Steps: []resource.TestStep{ 66 resource.TestStep{ 67 Config: testAccRouteTableConfig, 68 Check: resource.ComposeTestCheckFunc( 69 testAccCheckRouteTableExists( 70 "aws_route_table.foo", &v), 71 testCheck, 72 ), 73 }, 74 75 resource.TestStep{ 76 Config: testAccRouteTableConfigChange, 77 Check: resource.ComposeTestCheckFunc( 78 testAccCheckRouteTableExists( 79 "aws_route_table.foo", &v), 80 testCheckChange, 81 ), 82 }, 83 }, 84 }) 85 } 86 87 func TestAccAWSRouteTable_instance(t *testing.T) { 88 var v ec2.RouteTable 89 90 testCheck := func(*terraform.State) error { 91 if len(v.Routes) != 2 { 92 return fmt.Errorf("bad routes: %#v", v.Routes) 93 } 94 95 routes := make(map[string]*ec2.Route) 96 for _, r := range v.Routes { 97 routes[*r.DestinationCidrBlock] = r 98 } 99 100 if _, ok := routes["10.1.0.0/16"]; !ok { 101 return fmt.Errorf("bad routes: %#v", v.Routes) 102 } 103 if _, ok := routes["10.2.0.0/16"]; !ok { 104 return fmt.Errorf("bad routes: %#v", v.Routes) 105 } 106 107 return nil 108 } 109 110 resource.Test(t, resource.TestCase{ 111 PreCheck: func() { testAccPreCheck(t) }, 112 IDRefreshName: "aws_route_table.foo", 113 Providers: testAccProviders, 114 CheckDestroy: testAccCheckRouteTableDestroy, 115 Steps: []resource.TestStep{ 116 resource.TestStep{ 117 Config: testAccRouteTableConfigInstance, 118 Check: resource.ComposeTestCheckFunc( 119 testAccCheckRouteTableExists( 120 "aws_route_table.foo", &v), 121 testCheck, 122 ), 123 }, 124 }, 125 }) 126 } 127 128 func TestAccAWSRouteTable_tags(t *testing.T) { 129 var route_table ec2.RouteTable 130 131 resource.Test(t, resource.TestCase{ 132 PreCheck: func() { testAccPreCheck(t) }, 133 IDRefreshName: "aws_route_table.foo", 134 Providers: testAccProviders, 135 CheckDestroy: testAccCheckRouteTableDestroy, 136 Steps: []resource.TestStep{ 137 resource.TestStep{ 138 Config: testAccRouteTableConfigTags, 139 Check: resource.ComposeTestCheckFunc( 140 testAccCheckRouteTableExists("aws_route_table.foo", &route_table), 141 testAccCheckTags(&route_table.Tags, "foo", "bar"), 142 ), 143 }, 144 145 resource.TestStep{ 146 Config: testAccRouteTableConfigTagsUpdate, 147 Check: resource.ComposeTestCheckFunc( 148 testAccCheckRouteTableExists("aws_route_table.foo", &route_table), 149 testAccCheckTags(&route_table.Tags, "foo", ""), 150 testAccCheckTags(&route_table.Tags, "bar", "baz"), 151 ), 152 }, 153 }, 154 }) 155 } 156 157 func testAccCheckRouteTableDestroy(s *terraform.State) error { 158 conn := testAccProvider.Meta().(*AWSClient).ec2conn 159 160 for _, rs := range s.RootModule().Resources { 161 if rs.Type != "aws_route_table" { 162 continue 163 } 164 165 // Try to find the resource 166 resp, err := conn.DescribeRouteTables(&ec2.DescribeRouteTablesInput{ 167 RouteTableIds: []*string{aws.String(rs.Primary.ID)}, 168 }) 169 if err == nil { 170 if len(resp.RouteTables) > 0 { 171 return fmt.Errorf("still exist.") 172 } 173 174 return nil 175 } 176 177 // Verify the error is what we want 178 ec2err, ok := err.(awserr.Error) 179 if !ok { 180 return err 181 } 182 if ec2err.Code() != "InvalidRouteTableID.NotFound" { 183 return err 184 } 185 } 186 187 return nil 188 } 189 190 func testAccCheckRouteTableExists(n string, v *ec2.RouteTable) resource.TestCheckFunc { 191 return func(s *terraform.State) error { 192 rs, ok := s.RootModule().Resources[n] 193 if !ok { 194 return fmt.Errorf("Not found: %s", n) 195 } 196 197 if rs.Primary.ID == "" { 198 return fmt.Errorf("No ID is set") 199 } 200 201 conn := testAccProvider.Meta().(*AWSClient).ec2conn 202 resp, err := conn.DescribeRouteTables(&ec2.DescribeRouteTablesInput{ 203 RouteTableIds: []*string{aws.String(rs.Primary.ID)}, 204 }) 205 if err != nil { 206 return err 207 } 208 if len(resp.RouteTables) == 0 { 209 return fmt.Errorf("RouteTable not found") 210 } 211 212 *v = *resp.RouteTables[0] 213 214 return nil 215 } 216 } 217 218 // VPC Peering connections are prefixed with pcx 219 // Right now there is no VPC Peering resource 220 func TestAccAWSRouteTable_vpcPeering(t *testing.T) { 221 var v ec2.RouteTable 222 223 testCheck := func(*terraform.State) error { 224 if len(v.Routes) != 2 { 225 return fmt.Errorf("bad routes: %#v", v.Routes) 226 } 227 228 routes := make(map[string]*ec2.Route) 229 for _, r := range v.Routes { 230 routes[*r.DestinationCidrBlock] = r 231 } 232 233 if _, ok := routes["10.1.0.0/16"]; !ok { 234 return fmt.Errorf("bad routes: %#v", v.Routes) 235 } 236 if _, ok := routes["10.2.0.0/16"]; !ok { 237 return fmt.Errorf("bad routes: %#v", v.Routes) 238 } 239 240 return nil 241 } 242 resource.Test(t, resource.TestCase{ 243 PreCheck: func() { testAccPreCheck(t) }, 244 Providers: testAccProviders, 245 CheckDestroy: testAccCheckRouteTableDestroy, 246 Steps: []resource.TestStep{ 247 resource.TestStep{ 248 Config: testAccRouteTableVpcPeeringConfig, 249 Check: resource.ComposeTestCheckFunc( 250 testAccCheckRouteTableExists( 251 "aws_route_table.foo", &v), 252 testCheck, 253 ), 254 }, 255 }, 256 }) 257 } 258 259 func TestAccAWSRouteTable_vgwRoutePropagation(t *testing.T) { 260 var v ec2.RouteTable 261 var vgw ec2.VpnGateway 262 263 testCheck := func(*terraform.State) error { 264 if len(v.PropagatingVgws) != 1 { 265 return fmt.Errorf("bad propagating vgws: %#v", v.PropagatingVgws) 266 } 267 268 propagatingVGWs := make(map[string]*ec2.PropagatingVgw) 269 for _, gw := range v.PropagatingVgws { 270 propagatingVGWs[*gw.GatewayId] = gw 271 } 272 273 if _, ok := propagatingVGWs[*vgw.VpnGatewayId]; !ok { 274 return fmt.Errorf("bad propagating vgws: %#v", v.PropagatingVgws) 275 } 276 277 return nil 278 279 } 280 resource.Test(t, resource.TestCase{ 281 PreCheck: func() { testAccPreCheck(t) }, 282 Providers: testAccProviders, 283 CheckDestroy: resource.ComposeTestCheckFunc( 284 testAccCheckVpnGatewayDestroy, 285 testAccCheckRouteTableDestroy, 286 ), 287 Steps: []resource.TestStep{ 288 resource.TestStep{ 289 Config: testAccRouteTableVgwRoutePropagationConfig, 290 Check: resource.ComposeTestCheckFunc( 291 testAccCheckRouteTableExists( 292 "aws_route_table.foo", &v), 293 testAccCheckVpnGatewayExists( 294 "aws_vpn_gateway.foo", &vgw), 295 testCheck, 296 ), 297 }, 298 }, 299 }) 300 } 301 302 const testAccRouteTableConfig = ` 303 resource "aws_vpc" "foo" { 304 cidr_block = "10.1.0.0/16" 305 } 306 307 resource "aws_internet_gateway" "foo" { 308 vpc_id = "${aws_vpc.foo.id}" 309 } 310 311 resource "aws_route_table" "foo" { 312 vpc_id = "${aws_vpc.foo.id}" 313 314 route { 315 cidr_block = "10.2.0.0/16" 316 gateway_id = "${aws_internet_gateway.foo.id}" 317 } 318 } 319 ` 320 321 const testAccRouteTableConfigChange = ` 322 resource "aws_vpc" "foo" { 323 cidr_block = "10.1.0.0/16" 324 } 325 326 resource "aws_internet_gateway" "foo" { 327 vpc_id = "${aws_vpc.foo.id}" 328 } 329 330 resource "aws_route_table" "foo" { 331 vpc_id = "${aws_vpc.foo.id}" 332 333 route { 334 cidr_block = "10.3.0.0/16" 335 gateway_id = "${aws_internet_gateway.foo.id}" 336 } 337 338 route { 339 cidr_block = "10.4.0.0/16" 340 gateway_id = "${aws_internet_gateway.foo.id}" 341 } 342 } 343 ` 344 345 const testAccRouteTableConfigInstance = ` 346 resource "aws_vpc" "foo" { 347 cidr_block = "10.1.0.0/16" 348 } 349 350 resource "aws_subnet" "foo" { 351 cidr_block = "10.1.1.0/24" 352 vpc_id = "${aws_vpc.foo.id}" 353 } 354 355 resource "aws_instance" "foo" { 356 # us-west-2 357 ami = "ami-4fccb37f" 358 instance_type = "m1.small" 359 subnet_id = "${aws_subnet.foo.id}" 360 } 361 362 resource "aws_route_table" "foo" { 363 vpc_id = "${aws_vpc.foo.id}" 364 365 route { 366 cidr_block = "10.2.0.0/16" 367 instance_id = "${aws_instance.foo.id}" 368 } 369 } 370 ` 371 372 const testAccRouteTableConfigTags = ` 373 resource "aws_vpc" "foo" { 374 cidr_block = "10.1.0.0/16" 375 } 376 377 resource "aws_route_table" "foo" { 378 vpc_id = "${aws_vpc.foo.id}" 379 380 tags { 381 foo = "bar" 382 } 383 } 384 ` 385 386 const testAccRouteTableConfigTagsUpdate = ` 387 resource "aws_vpc" "foo" { 388 cidr_block = "10.1.0.0/16" 389 } 390 391 resource "aws_route_table" "foo" { 392 vpc_id = "${aws_vpc.foo.id}" 393 394 tags { 395 bar = "baz" 396 } 397 } 398 ` 399 400 // VPC Peering connections are prefixed with pcx 401 const testAccRouteTableVpcPeeringConfig = ` 402 resource "aws_vpc" "foo" { 403 cidr_block = "10.1.0.0/16" 404 } 405 406 resource "aws_internet_gateway" "foo" { 407 vpc_id = "${aws_vpc.foo.id}" 408 } 409 410 resource "aws_vpc" "bar" { 411 cidr_block = "10.3.0.0/16" 412 } 413 414 resource "aws_internet_gateway" "bar" { 415 vpc_id = "${aws_vpc.bar.id}" 416 } 417 418 resource "aws_vpc_peering_connection" "foo" { 419 vpc_id = "${aws_vpc.foo.id}" 420 peer_vpc_id = "${aws_vpc.bar.id}" 421 tags { 422 foo = "bar" 423 } 424 } 425 426 resource "aws_route_table" "foo" { 427 vpc_id = "${aws_vpc.foo.id}" 428 429 route { 430 cidr_block = "10.2.0.0/16" 431 vpc_peering_connection_id = "${aws_vpc_peering_connection.foo.id}" 432 } 433 } 434 ` 435 436 const testAccRouteTableVgwRoutePropagationConfig = ` 437 resource "aws_vpc" "foo" { 438 cidr_block = "10.1.0.0/16" 439 } 440 441 resource "aws_vpn_gateway" "foo" { 442 vpc_id = "${aws_vpc.foo.id}" 443 } 444 445 resource "aws_route_table" "foo" { 446 vpc_id = "${aws_vpc.foo.id}" 447 448 propagating_vgws = ["${aws_vpn_gateway.foo.id}"] 449 } 450 `