github.com/arvindram03/terraform@v0.3.7-0.20150212015210-408f838db36d/builtin/providers/aws/resource_aws_elb_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "os" 6 "reflect" 7 "sort" 8 "testing" 9 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 "github.com/mitchellh/goamz/elb" 13 ) 14 15 func TestAccAWSELB_basic(t *testing.T) { 16 var conf elb.LoadBalancer 17 ssl_certificate_id := os.Getenv("AWS_SSL_CERTIFICATE_ID") 18 19 resource.Test(t, resource.TestCase{ 20 PreCheck: func() { testAccPreCheck(t) }, 21 Providers: testAccProviders, 22 CheckDestroy: testAccCheckAWSELBDestroy, 23 Steps: []resource.TestStep{ 24 resource.TestStep{ 25 Config: testAccAWSELBConfig, 26 Check: resource.ComposeTestCheckFunc( 27 testAccCheckAWSELBExists("aws_elb.bar", &conf), 28 testAccCheckAWSELBAttributes(&conf), 29 resource.TestCheckResourceAttr( 30 "aws_elb.bar", "name", "foobar-terraform-test"), 31 resource.TestCheckResourceAttr( 32 "aws_elb.bar", "availability_zones.2487133097", "us-west-2a"), 33 resource.TestCheckResourceAttr( 34 "aws_elb.bar", "availability_zones.221770259", "us-west-2b"), 35 resource.TestCheckResourceAttr( 36 "aws_elb.bar", "availability_zones.2050015877", "us-west-2c"), 37 resource.TestCheckResourceAttr( 38 "aws_elb.bar", "listener.206423021.instance_port", "8000"), 39 resource.TestCheckResourceAttr( 40 "aws_elb.bar", "listener.206423021.instance_protocol", "http"), 41 resource.TestCheckResourceAttr( 42 "aws_elb.bar", "listener.206423021.ssl_certificate_id", ssl_certificate_id), 43 resource.TestCheckResourceAttr( 44 "aws_elb.bar", "listener.206423021.lb_port", "80"), 45 resource.TestCheckResourceAttr( 46 "aws_elb.bar", "listener.206423021.lb_protocol", "http"), 47 resource.TestCheckResourceAttr( 48 "aws_elb.bar", "cross_zone_load_balancing", "true"), 49 ), 50 }, 51 }, 52 }) 53 } 54 55 func TestAccAWSELB_InstanceAttaching(t *testing.T) { 56 var conf elb.LoadBalancer 57 58 testCheckInstanceAttached := func(count int) resource.TestCheckFunc { 59 return func(*terraform.State) error { 60 if len(conf.Instances) != count { 61 return fmt.Errorf("instance count does not match") 62 } 63 return nil 64 } 65 } 66 67 resource.Test(t, resource.TestCase{ 68 PreCheck: func() { testAccPreCheck(t) }, 69 Providers: testAccProviders, 70 CheckDestroy: testAccCheckAWSELBDestroy, 71 Steps: []resource.TestStep{ 72 resource.TestStep{ 73 Config: testAccAWSELBConfig, 74 Check: resource.ComposeTestCheckFunc( 75 testAccCheckAWSELBExists("aws_elb.bar", &conf), 76 testAccCheckAWSELBAttributes(&conf), 77 ), 78 }, 79 80 resource.TestStep{ 81 Config: testAccAWSELBConfigNewInstance, 82 Check: resource.ComposeTestCheckFunc( 83 testAccCheckAWSELBExists("aws_elb.bar", &conf), 84 testCheckInstanceAttached(1), 85 ), 86 }, 87 }, 88 }) 89 } 90 91 func TestAccAWSELB_AddSubnet(t *testing.T) { 92 var conf elb.LoadBalancer 93 94 testCheckSubnetsAdded := func(count int) resource.TestCheckFunc { 95 return func(*terraform.State) error { 96 if len(conf.Subnets) != count { 97 return fmt.Errorf("subnet count does not match") 98 } 99 return nil 100 } 101 } 102 103 resource.Test(t, resource.TestCase{ 104 PreCheck: func() { testAccPreCheck(t) }, 105 Providers: testAccProviders, 106 CheckDestroy: testAccCheckAWSELBDestroy, 107 Steps: []resource.TestStep{ 108 resource.TestStep{ 109 Config: testAccAWSELBConfigVPC, 110 Check: resource.ComposeTestCheckFunc( 111 testAccCheckAWSELBExists("aws_elb.bar", &conf), 112 testAccCheckAWSELBAttributes(&conf), 113 ), 114 }, 115 116 resource.TestStep{ 117 Config: testAccAWSELBAddSubnets, 118 Check: resource.ComposeTestCheckFunc( 119 testAccCheckAWSELBExists("aws_elb.bar", &conf), 120 testCheckSubnetsAdded(2), 121 ), 122 }, 123 }, 124 }) 125 } 126 127 func TestAccAWSELB_HealthCheck(t *testing.T) { 128 var conf elb.LoadBalancer 129 130 resource.Test(t, resource.TestCase{ 131 PreCheck: func() { testAccPreCheck(t) }, 132 Providers: testAccProviders, 133 CheckDestroy: testAccCheckAWSELBDestroy, 134 Steps: []resource.TestStep{ 135 resource.TestStep{ 136 Config: testAccAWSELBConfigHealthCheck, 137 Check: resource.ComposeTestCheckFunc( 138 testAccCheckAWSELBExists("aws_elb.bar", &conf), 139 testAccCheckAWSELBAttributesHealthCheck(&conf), 140 resource.TestCheckResourceAttr( 141 "aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"), 142 resource.TestCheckResourceAttr( 143 "aws_elb.bar", "health_check.3484319807.unhealthy_threshold", "5"), 144 resource.TestCheckResourceAttr( 145 "aws_elb.bar", "health_check.3484319807.target", "HTTP:8000/"), 146 resource.TestCheckResourceAttr( 147 "aws_elb.bar", "health_check.3484319807.timeout", "30"), 148 resource.TestCheckResourceAttr( 149 "aws_elb.bar", "health_check.3484319807.interval", "60"), 150 ), 151 }, 152 }, 153 }) 154 } 155 156 func TestAccAWSELBUpdate_HealthCheck(t *testing.T) { 157 resource.Test(t, resource.TestCase{ 158 PreCheck: func() { testAccPreCheck(t) }, 159 Providers: testAccProviders, 160 CheckDestroy: testAccCheckAWSELBDestroy, 161 Steps: []resource.TestStep{ 162 resource.TestStep{ 163 Config: testAccAWSELBConfigHealthCheck, 164 Check: resource.ComposeTestCheckFunc( 165 resource.TestCheckResourceAttr( 166 "aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"), 167 ), 168 }, 169 resource.TestStep{ 170 Config: testAccAWSELBConfigHealthCheck_update, 171 Check: resource.ComposeTestCheckFunc( 172 resource.TestCheckResourceAttr( 173 "aws_elb.bar", "health_check.2648756019.healthy_threshold", "10"), 174 ), 175 }, 176 }, 177 }) 178 } 179 180 func testAccCheckAWSELBDestroy(s *terraform.State) error { 181 conn := testAccProvider.Meta().(*AWSClient).elbconn 182 183 for _, rs := range s.RootModule().Resources { 184 if rs.Type != "aws_elb" { 185 continue 186 } 187 188 describe, err := conn.DescribeLoadBalancers(&elb.DescribeLoadBalancer{ 189 Names: []string{rs.Primary.ID}, 190 }) 191 192 if err == nil { 193 if len(describe.LoadBalancers) != 0 && 194 describe.LoadBalancers[0].LoadBalancerName == rs.Primary.ID { 195 return fmt.Errorf("ELB still exists") 196 } 197 } 198 199 // Verify the error 200 providerErr, ok := err.(*elb.Error) 201 if !ok { 202 return err 203 } 204 205 if providerErr.Code != "InvalidLoadBalancerName.NotFound" { 206 return fmt.Errorf("Unexpected error: %s", err) 207 } 208 } 209 210 return nil 211 } 212 213 func testAccCheckAWSELBAttributes(conf *elb.LoadBalancer) resource.TestCheckFunc { 214 return func(s *terraform.State) error { 215 zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"} 216 sort.StringSlice(conf.AvailabilityZones).Sort() 217 if !reflect.DeepEqual(conf.AvailabilityZones, zones) { 218 return fmt.Errorf("bad availability_zones") 219 } 220 221 if conf.LoadBalancerName != "foobar-terraform-test" { 222 return fmt.Errorf("bad name") 223 } 224 225 l := elb.Listener{ 226 InstancePort: 8000, 227 InstanceProtocol: "HTTP", 228 LoadBalancerPort: 80, 229 Protocol: "HTTP", 230 } 231 232 if !reflect.DeepEqual(conf.Listeners[0], l) { 233 return fmt.Errorf( 234 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 235 conf.Listeners[0], 236 l) 237 } 238 239 if conf.DNSName == "" { 240 return fmt.Errorf("empty dns_name") 241 } 242 243 return nil 244 } 245 } 246 247 func testAccCheckAWSELBAttributesHealthCheck(conf *elb.LoadBalancer) resource.TestCheckFunc { 248 return func(s *terraform.State) error { 249 zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"} 250 sort.StringSlice(conf.AvailabilityZones).Sort() 251 if !reflect.DeepEqual(conf.AvailabilityZones, zones) { 252 return fmt.Errorf("bad availability_zones") 253 } 254 255 if conf.LoadBalancerName != "foobar-terraform-test" { 256 return fmt.Errorf("bad name") 257 } 258 259 check := elb.HealthCheck{ 260 Timeout: 30, 261 UnhealthyThreshold: 5, 262 HealthyThreshold: 5, 263 Interval: 60, 264 Target: "HTTP:8000/", 265 } 266 267 if !reflect.DeepEqual(conf.HealthCheck, check) { 268 return fmt.Errorf( 269 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 270 conf.HealthCheck, 271 check) 272 } 273 274 if conf.DNSName == "" { 275 return fmt.Errorf("empty dns_name") 276 } 277 278 return nil 279 } 280 } 281 282 func testAccCheckAWSELBExists(n string, res *elb.LoadBalancer) resource.TestCheckFunc { 283 return func(s *terraform.State) error { 284 rs, ok := s.RootModule().Resources[n] 285 if !ok { 286 return fmt.Errorf("Not found: %s", n) 287 } 288 289 if rs.Primary.ID == "" { 290 return fmt.Errorf("No ELB ID is set") 291 } 292 293 conn := testAccProvider.Meta().(*AWSClient).elbconn 294 295 describe, err := conn.DescribeLoadBalancers(&elb.DescribeLoadBalancer{ 296 Names: []string{rs.Primary.ID}, 297 }) 298 299 if err != nil { 300 return err 301 } 302 303 if len(describe.LoadBalancers) != 1 || 304 describe.LoadBalancers[0].LoadBalancerName != rs.Primary.ID { 305 return fmt.Errorf("ELB not found") 306 } 307 308 *res = describe.LoadBalancers[0] 309 310 return nil 311 } 312 } 313 314 const testAccAWSELBConfig = ` 315 resource "aws_elb" "bar" { 316 name = "foobar-terraform-test" 317 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 318 319 listener { 320 instance_port = 8000 321 instance_protocol = "http" 322 lb_port = 80 323 lb_protocol = "http" 324 } 325 326 cross_zone_load_balancing = true 327 } 328 ` 329 330 const testAccAWSELBConfigNewInstance = ` 331 resource "aws_elb" "bar" { 332 name = "foobar-terraform-test" 333 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 334 335 listener { 336 instance_port = 8000 337 instance_protocol = "http" 338 lb_port = 80 339 lb_protocol = "http" 340 } 341 342 instances = ["${aws_instance.foo.id}"] 343 } 344 345 resource "aws_instance" "foo" { 346 # us-west-2 347 ami = "ami-043a5034" 348 instance_type = "t1.micro" 349 } 350 ` 351 const testAccAWSELBConfigVPC = ` 352 resource "aws_elb" "bar" { 353 vpc_id = "${aws_vpc.foobar.id}" 354 name = "foobar-terraform-test" 355 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 356 357 listener { 358 instance_port = 8000 359 instance_protocol = "http" 360 lb_port = 80 361 lb_protocol = "http" 362 } 363 364 subnets = ["${aws_subnet.baz.id}"] 365 366 } 367 368 resource "aws_subnet" "baz" { 369 vpc_id = "${aws_vpc.foobar.id}" 370 cidr_block = "10.0.69.0/24" 371 } 372 373 resource "aws_vpc" "foobar" { 374 cidr_block = "10.0.0.0/16" 375 } 376 ` 377 378 const testAccAWSELBAddSubnets = ` 379 resource "aws_elb" "bar" { 380 vpc_id = "${aws_vpc.foobar.id}" 381 name = "foobar-terraform-test" 382 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 383 384 listener { 385 instance_port = 8000 386 instance_protocol = "http" 387 lb_port = 80 388 lb_protocol = "http" 389 } 390 391 subnets = ["${aws_subnet.baz.id}", 392 "${aws_subnet.foo.id}"] 393 } 394 395 resource "aws_subnet" "foo" { 396 vpc_id = "${aws_vpc.foobar.id}" 397 cidr_block = "10.0.68.0/24" 398 } 399 400 resource "aws_subnet" "baz" { 401 vpc_id = "${aws_vpc.foobar.id}" 402 cidr_block = "10.0.69.0/24" 403 } 404 405 resource "aws_vpc" "foobar" { 406 cidr_block = "10.0.0.0/16" 407 } 408 ` 409 410 const testAccAWSELBConfigListenerSSLCertificateId = ` 411 resource "aws_elb" "bar" { 412 name = "foobar-terraform-test" 413 availability_zones = ["us-west-2a"] 414 415 listener { 416 instance_port = 8000 417 instance_protocol = "http" 418 ssl_certificate_id = "%s" 419 lb_port = 443 420 lb_protocol = "https" 421 } 422 } 423 ` 424 425 const testAccAWSELBConfigHealthCheck = ` 426 resource "aws_elb" "bar" { 427 name = "foobar-terraform-test" 428 availability_zones = ["us-west-2a"] 429 430 listener { 431 instance_port = 8000 432 instance_protocol = "http" 433 lb_port = 80 434 lb_protocol = "http" 435 } 436 437 health_check { 438 healthy_threshold = 5 439 unhealthy_threshold = 5 440 target = "HTTP:8000/" 441 interval = 60 442 timeout = 30 443 } 444 } 445 ` 446 447 const testAccAWSELBConfigHealthCheck_update = ` 448 resource "aws_elb" "bar" { 449 name = "foobar-terraform-test" 450 availability_zones = ["us-west-2a"] 451 452 listener { 453 instance_port = 8000 454 instance_protocol = "http" 455 lb_port = 80 456 lb_protocol = "http" 457 } 458 459 health_check { 460 healthy_threshold = 10 461 unhealthy_threshold = 5 462 target = "HTTP:8000/" 463 interval = 60 464 timeout = 30 465 } 466 } 467 `