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