github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/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_InstanceAttaching(t *testing.T) { 57 var conf elb.LoadBalancerDescription 58 59 testCheckInstanceAttached := func(count int) resource.TestCheckFunc { 60 return func(*terraform.State) error { 61 if len(conf.Instances) != count { 62 return fmt.Errorf("instance count does not match") 63 } 64 return nil 65 } 66 } 67 68 resource.Test(t, resource.TestCase{ 69 PreCheck: func() { testAccPreCheck(t) }, 70 Providers: testAccProviders, 71 CheckDestroy: testAccCheckAWSELBDestroy, 72 Steps: []resource.TestStep{ 73 resource.TestStep{ 74 Config: testAccAWSELBConfig, 75 Check: resource.ComposeTestCheckFunc( 76 testAccCheckAWSELBExists("aws_elb.bar", &conf), 77 testAccCheckAWSELBAttributes(&conf), 78 ), 79 }, 80 81 resource.TestStep{ 82 Config: testAccAWSELBConfigNewInstance, 83 Check: resource.ComposeTestCheckFunc( 84 testAccCheckAWSELBExists("aws_elb.bar", &conf), 85 testCheckInstanceAttached(1), 86 ), 87 }, 88 }, 89 }) 90 } 91 92 func TestAccAWSELB_HealthCheck(t *testing.T) { 93 var conf elb.LoadBalancerDescription 94 95 resource.Test(t, resource.TestCase{ 96 PreCheck: func() { testAccPreCheck(t) }, 97 Providers: testAccProviders, 98 CheckDestroy: testAccCheckAWSELBDestroy, 99 Steps: []resource.TestStep{ 100 resource.TestStep{ 101 Config: testAccAWSELBConfigHealthCheck, 102 Check: resource.ComposeTestCheckFunc( 103 testAccCheckAWSELBExists("aws_elb.bar", &conf), 104 testAccCheckAWSELBAttributesHealthCheck(&conf), 105 resource.TestCheckResourceAttr( 106 "aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"), 107 resource.TestCheckResourceAttr( 108 "aws_elb.bar", "health_check.3484319807.unhealthy_threshold", "5"), 109 resource.TestCheckResourceAttr( 110 "aws_elb.bar", "health_check.3484319807.target", "HTTP:8000/"), 111 resource.TestCheckResourceAttr( 112 "aws_elb.bar", "health_check.3484319807.timeout", "30"), 113 resource.TestCheckResourceAttr( 114 "aws_elb.bar", "health_check.3484319807.interval", "60"), 115 ), 116 }, 117 }, 118 }) 119 } 120 121 func TestAccAWSELBUpdate_HealthCheck(t *testing.T) { 122 resource.Test(t, resource.TestCase{ 123 PreCheck: func() { testAccPreCheck(t) }, 124 Providers: testAccProviders, 125 CheckDestroy: testAccCheckAWSELBDestroy, 126 Steps: []resource.TestStep{ 127 resource.TestStep{ 128 Config: testAccAWSELBConfigHealthCheck, 129 Check: resource.ComposeTestCheckFunc( 130 resource.TestCheckResourceAttr( 131 "aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"), 132 ), 133 }, 134 resource.TestStep{ 135 Config: testAccAWSELBConfigHealthCheck_update, 136 Check: resource.ComposeTestCheckFunc( 137 resource.TestCheckResourceAttr( 138 "aws_elb.bar", "health_check.2648756019.healthy_threshold", "10"), 139 ), 140 }, 141 }, 142 }) 143 } 144 145 func testAccCheckAWSELBDestroy(s *terraform.State) error { 146 conn := testAccProvider.Meta().(*AWSClient).elbconn 147 148 for _, rs := range s.RootModule().Resources { 149 if rs.Type != "aws_elb" { 150 continue 151 } 152 153 describe, err := conn.DescribeLoadBalancers(&elb.DescribeAccessPointsInput{ 154 LoadBalancerNames: []string{rs.Primary.ID}, 155 }) 156 157 if err == nil { 158 if len(describe.LoadBalancerDescriptions) != 0 && 159 *describe.LoadBalancerDescriptions[0].LoadBalancerName == rs.Primary.ID { 160 return fmt.Errorf("ELB still exists") 161 } 162 } 163 164 // Verify the error 165 providerErr, ok := err.(aws.APIError) 166 if !ok { 167 return err 168 } 169 170 if providerErr.Code != "InvalidLoadBalancerName.NotFound" { 171 return fmt.Errorf("Unexpected error: %s", err) 172 } 173 } 174 175 return nil 176 } 177 178 func testAccCheckAWSELBAttributes(conf *elb.LoadBalancerDescription) resource.TestCheckFunc { 179 return func(s *terraform.State) error { 180 zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"} 181 sort.StringSlice(conf.AvailabilityZones).Sort() 182 if !reflect.DeepEqual(conf.AvailabilityZones, zones) { 183 return fmt.Errorf("bad availability_zones") 184 } 185 186 if *conf.LoadBalancerName != "foobar-terraform-test" { 187 return fmt.Errorf("bad name") 188 } 189 190 l := elb.Listener{ 191 InstancePort: aws.Integer(8000), 192 InstanceProtocol: aws.String("HTTP"), 193 LoadBalancerPort: aws.Integer(80), 194 Protocol: aws.String("HTTP"), 195 } 196 197 if !reflect.DeepEqual(conf.ListenerDescriptions[0].Listener, &l) { 198 return fmt.Errorf( 199 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 200 conf.ListenerDescriptions[0].Listener, 201 l) 202 } 203 204 if *conf.DNSName == "" { 205 return fmt.Errorf("empty dns_name") 206 } 207 208 return nil 209 } 210 } 211 212 func testAccCheckAWSELBAttributesHealthCheck(conf *elb.LoadBalancerDescription) resource.TestCheckFunc { 213 return func(s *terraform.State) error { 214 zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"} 215 sort.StringSlice(conf.AvailabilityZones).Sort() 216 if !reflect.DeepEqual(conf.AvailabilityZones, zones) { 217 return fmt.Errorf("bad availability_zones") 218 } 219 220 if *conf.LoadBalancerName != "foobar-terraform-test" { 221 return fmt.Errorf("bad name") 222 } 223 224 check := elb.HealthCheck{ 225 Timeout: aws.Integer(30), 226 UnhealthyThreshold: aws.Integer(5), 227 HealthyThreshold: aws.Integer(5), 228 Interval: aws.Integer(60), 229 Target: aws.String("HTTP:8000/"), 230 } 231 232 if !reflect.DeepEqual(conf.HealthCheck, &check) { 233 return fmt.Errorf( 234 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 235 conf.HealthCheck, 236 check) 237 } 238 239 if *conf.DNSName == "" { 240 return fmt.Errorf("empty dns_name") 241 } 242 243 return nil 244 } 245 } 246 247 func testAccCheckAWSELBExists(n string, res *elb.LoadBalancerDescription) resource.TestCheckFunc { 248 return func(s *terraform.State) error { 249 rs, ok := s.RootModule().Resources[n] 250 if !ok { 251 return fmt.Errorf("Not found: %s", n) 252 } 253 254 if rs.Primary.ID == "" { 255 return fmt.Errorf("No ELB ID is set") 256 } 257 258 conn := testAccProvider.Meta().(*AWSClient).elbconn 259 260 describe, err := conn.DescribeLoadBalancers(&elb.DescribeAccessPointsInput{ 261 LoadBalancerNames: []string{rs.Primary.ID}, 262 }) 263 264 if err != nil { 265 return err 266 } 267 268 if len(describe.LoadBalancerDescriptions) != 1 || 269 *describe.LoadBalancerDescriptions[0].LoadBalancerName != rs.Primary.ID { 270 return fmt.Errorf("ELB not found") 271 } 272 273 *res = describe.LoadBalancerDescriptions[0] 274 275 return nil 276 } 277 } 278 279 const testAccAWSELBConfig = ` 280 resource "aws_elb" "bar" { 281 name = "foobar-terraform-test" 282 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 283 284 listener { 285 instance_port = 8000 286 instance_protocol = "http" 287 lb_port = 80 288 lb_protocol = "http" 289 } 290 291 cross_zone_load_balancing = true 292 } 293 ` 294 295 const testAccAWSELBConfigNewInstance = ` 296 resource "aws_elb" "bar" { 297 name = "foobar-terraform-test" 298 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 299 300 listener { 301 instance_port = 8000 302 instance_protocol = "http" 303 lb_port = 80 304 lb_protocol = "http" 305 } 306 307 instances = ["${aws_instance.foo.id}"] 308 } 309 310 resource "aws_instance" "foo" { 311 # us-west-2 312 ami = "ami-043a5034" 313 instance_type = "t1.micro" 314 } 315 ` 316 317 const testAccAWSELBConfigListenerSSLCertificateId = ` 318 resource "aws_elb" "bar" { 319 name = "foobar-terraform-test" 320 availability_zones = ["us-west-2a"] 321 322 listener { 323 instance_port = 8000 324 instance_protocol = "http" 325 ssl_certificate_id = "%s" 326 lb_port = 443 327 lb_protocol = "https" 328 } 329 } 330 ` 331 332 const testAccAWSELBConfigHealthCheck = ` 333 resource "aws_elb" "bar" { 334 name = "foobar-terraform-test" 335 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 336 337 listener { 338 instance_port = 8000 339 instance_protocol = "http" 340 lb_port = 80 341 lb_protocol = "http" 342 } 343 344 health_check { 345 healthy_threshold = 5 346 unhealthy_threshold = 5 347 target = "HTTP:8000/" 348 interval = 60 349 timeout = 30 350 } 351 } 352 ` 353 354 const testAccAWSELBConfigHealthCheck_update = ` 355 resource "aws_elb" "bar" { 356 name = "foobar-terraform-test" 357 availability_zones = ["us-west-2a"] 358 359 listener { 360 instance_port = 8000 361 instance_protocol = "http" 362 lb_port = 80 363 lb_protocol = "http" 364 } 365 366 health_check { 367 healthy_threshold = 10 368 unhealthy_threshold = 5 369 target = "HTTP:8000/" 370 interval = 60 371 timeout = 30 372 } 373 } 374 `