github.com/paulmey/terraform@v0.5.2-0.20150519145237-046e9b4c884d/builtin/providers/aws/resource_aws_autoscaling_group_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "reflect" 6 "strings" 7 "testing" 8 9 "github.com/awslabs/aws-sdk-go/aws" 10 "github.com/awslabs/aws-sdk-go/service/autoscaling" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestAccAWSAutoScalingGroup_basic(t *testing.T) { 16 var group autoscaling.AutoScalingGroup 17 var lc autoscaling.LaunchConfiguration 18 19 resource.Test(t, resource.TestCase{ 20 PreCheck: func() { testAccPreCheck(t) }, 21 Providers: testAccProviders, 22 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 23 Steps: []resource.TestStep{ 24 resource.TestStep{ 25 Config: testAccAWSAutoScalingGroupConfig, 26 Check: resource.ComposeTestCheckFunc( 27 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 28 testAccCheckAWSAutoScalingGroupHealthyCapacity(&group, 2), 29 testAccCheckAWSAutoScalingGroupAttributes(&group), 30 resource.TestCheckResourceAttr( 31 "aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"), 32 resource.TestCheckResourceAttr( 33 "aws_autoscaling_group.bar", "name", "foobar3-terraform-test"), 34 resource.TestCheckResourceAttr( 35 "aws_autoscaling_group.bar", "max_size", "5"), 36 resource.TestCheckResourceAttr( 37 "aws_autoscaling_group.bar", "min_size", "2"), 38 resource.TestCheckResourceAttr( 39 "aws_autoscaling_group.bar", "health_check_grace_period", "300"), 40 resource.TestCheckResourceAttr( 41 "aws_autoscaling_group.bar", "health_check_type", "ELB"), 42 resource.TestCheckResourceAttr( 43 "aws_autoscaling_group.bar", "desired_capacity", "4"), 44 resource.TestCheckResourceAttr( 45 "aws_autoscaling_group.bar", "force_delete", "true"), 46 resource.TestCheckResourceAttr( 47 "aws_autoscaling_group.bar", "termination_policies.912102603", "OldestInstance"), 48 ), 49 }, 50 51 resource.TestStep{ 52 Config: testAccAWSAutoScalingGroupConfigUpdate, 53 Check: resource.ComposeTestCheckFunc( 54 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 55 testAccCheckAWSLaunchConfigurationExists("aws_launch_configuration.new", &lc), 56 resource.TestCheckResourceAttr( 57 "aws_autoscaling_group.bar", "desired_capacity", "5"), 58 testLaunchConfigurationName("aws_autoscaling_group.bar", &lc), 59 testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{ 60 "value": "bar-foo", 61 "propagate_at_launch": true, 62 }), 63 ), 64 }, 65 }, 66 }) 67 } 68 69 func TestAccAWSAutoScalingGroup_tags(t *testing.T) { 70 var group autoscaling.AutoScalingGroup 71 72 resource.Test(t, resource.TestCase{ 73 PreCheck: func() { testAccPreCheck(t) }, 74 Providers: testAccProviders, 75 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 76 Steps: []resource.TestStep{ 77 resource.TestStep{ 78 Config: testAccAWSAutoScalingGroupConfig, 79 Check: resource.ComposeTestCheckFunc( 80 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 81 testAccCheckAutoscalingTags(&group.Tags, "Foo", map[string]interface{}{ 82 "value": "foo-bar", 83 "propagate_at_launch": true, 84 }), 85 ), 86 }, 87 88 resource.TestStep{ 89 Config: testAccAWSAutoScalingGroupConfigUpdate, 90 Check: resource.ComposeTestCheckFunc( 91 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 92 testAccCheckAutoscalingTagNotExists(&group.Tags, "Foo"), 93 testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{ 94 "value": "bar-foo", 95 "propagate_at_launch": true, 96 }), 97 ), 98 }, 99 }, 100 }) 101 } 102 103 func TestAccAWSAutoScalingGroup_WithLoadBalancer(t *testing.T) { 104 var group autoscaling.AutoScalingGroup 105 106 resource.Test(t, resource.TestCase{ 107 PreCheck: func() { testAccPreCheck(t) }, 108 Providers: testAccProviders, 109 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 110 Steps: []resource.TestStep{ 111 resource.TestStep{ 112 Config: testAccAWSAutoScalingGroupConfigWithLoadBalancer, 113 Check: resource.ComposeTestCheckFunc( 114 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 115 testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(&group), 116 ), 117 }, 118 }, 119 }) 120 } 121 122 func testAccCheckAWSAutoScalingGroupDestroy(s *terraform.State) error { 123 conn := testAccProvider.Meta().(*AWSClient).autoscalingconn 124 125 for _, rs := range s.RootModule().Resources { 126 if rs.Type != "aws_autoscaling_group" { 127 continue 128 } 129 130 // Try to find the Group 131 describeGroups, err := conn.DescribeAutoScalingGroups( 132 &autoscaling.DescribeAutoScalingGroupsInput{ 133 AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)}, 134 }) 135 136 if err == nil { 137 if len(describeGroups.AutoScalingGroups) != 0 && 138 *describeGroups.AutoScalingGroups[0].AutoScalingGroupName == rs.Primary.ID { 139 return fmt.Errorf("AutoScaling Group still exists") 140 } 141 } 142 143 // Verify the error 144 ec2err, ok := err.(aws.APIError) 145 if !ok { 146 return err 147 } 148 if ec2err.Code != "InvalidGroup.NotFound" { 149 return err 150 } 151 } 152 153 return nil 154 } 155 156 func testAccCheckAWSAutoScalingGroupAttributes(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc { 157 return func(s *terraform.State) error { 158 if *group.AvailabilityZones[0] != "us-west-2a" { 159 return fmt.Errorf("Bad availability_zones: %#v", group.AvailabilityZones[0]) 160 } 161 162 if *group.AutoScalingGroupName != "foobar3-terraform-test" { 163 return fmt.Errorf("Bad name: %s", *group.AutoScalingGroupName) 164 } 165 166 if *group.MaxSize != 5 { 167 return fmt.Errorf("Bad max_size: %d", *group.MaxSize) 168 } 169 170 if *group.MinSize != 2 { 171 return fmt.Errorf("Bad max_size: %d", *group.MinSize) 172 } 173 174 if *group.HealthCheckType != "ELB" { 175 return fmt.Errorf("Bad health_check_type,\nexpected: %s\ngot: %s", "ELB", *group.HealthCheckType) 176 } 177 178 if *group.HealthCheckGracePeriod != 300 { 179 return fmt.Errorf("Bad health_check_grace_period: %d", *group.HealthCheckGracePeriod) 180 } 181 182 if *group.DesiredCapacity != 4 { 183 return fmt.Errorf("Bad desired_capacity: %d", *group.DesiredCapacity) 184 } 185 186 if *group.LaunchConfigurationName == "" { 187 return fmt.Errorf("Bad launch configuration name: %s", *group.LaunchConfigurationName) 188 } 189 190 t := &autoscaling.TagDescription{ 191 Key: aws.String("Foo"), 192 Value: aws.String("foo-bar"), 193 PropagateAtLaunch: aws.Boolean(true), 194 ResourceType: aws.String("auto-scaling-group"), 195 ResourceID: group.AutoScalingGroupName, 196 } 197 198 if !reflect.DeepEqual(group.Tags[0], t) { 199 return fmt.Errorf( 200 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 201 group.Tags[0], 202 t) 203 } 204 205 return nil 206 } 207 } 208 209 func testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc { 210 return func(s *terraform.State) error { 211 if *group.LoadBalancerNames[0] != "foobar-terraform-test" { 212 return fmt.Errorf("Bad load_balancers: %#v", group.LoadBalancerNames[0]) 213 } 214 215 return nil 216 } 217 } 218 219 func testAccCheckAWSAutoScalingGroupExists(n string, group *autoscaling.AutoScalingGroup) resource.TestCheckFunc { 220 return func(s *terraform.State) error { 221 rs, ok := s.RootModule().Resources[n] 222 if !ok { 223 return fmt.Errorf("Not found: %s", n) 224 } 225 226 if rs.Primary.ID == "" { 227 return fmt.Errorf("No AutoScaling Group ID is set") 228 } 229 230 conn := testAccProvider.Meta().(*AWSClient).autoscalingconn 231 232 describeGroups, err := conn.DescribeAutoScalingGroups( 233 &autoscaling.DescribeAutoScalingGroupsInput{ 234 AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)}, 235 }) 236 237 if err != nil { 238 return err 239 } 240 241 if len(describeGroups.AutoScalingGroups) != 1 || 242 *describeGroups.AutoScalingGroups[0].AutoScalingGroupName != rs.Primary.ID { 243 return fmt.Errorf("AutoScaling Group not found") 244 } 245 246 *group = *describeGroups.AutoScalingGroups[0] 247 248 return nil 249 } 250 } 251 252 func testLaunchConfigurationName(n string, lc *autoscaling.LaunchConfiguration) resource.TestCheckFunc { 253 return func(s *terraform.State) error { 254 rs, ok := s.RootModule().Resources[n] 255 if !ok { 256 return fmt.Errorf("Not found: %s", n) 257 } 258 259 if *lc.LaunchConfigurationName != rs.Primary.Attributes["launch_configuration"] { 260 return fmt.Errorf("Launch configuration names do not match") 261 } 262 263 return nil 264 } 265 } 266 267 func testAccCheckAWSAutoScalingGroupHealthyCapacity( 268 g *autoscaling.AutoScalingGroup, exp int) resource.TestCheckFunc { 269 return func(s *terraform.State) error { 270 healthy := 0 271 for _, i := range g.Instances { 272 if i.HealthStatus == nil { 273 continue 274 } 275 if strings.EqualFold(*i.HealthStatus, "Healthy") { 276 healthy++ 277 } 278 } 279 if healthy < exp { 280 return fmt.Errorf("Expected at least %d healthy, got %d.", exp, healthy) 281 } 282 return nil 283 } 284 } 285 286 const testAccAWSAutoScalingGroupConfig = ` 287 resource "aws_launch_configuration" "foobar" { 288 image_id = "ami-21f78e11" 289 instance_type = "t1.micro" 290 } 291 292 resource "aws_autoscaling_group" "bar" { 293 availability_zones = ["us-west-2a"] 294 name = "foobar3-terraform-test" 295 max_size = 5 296 min_size = 2 297 health_check_grace_period = 300 298 health_check_type = "ELB" 299 desired_capacity = 4 300 force_delete = true 301 termination_policies = ["OldestInstance"] 302 303 launch_configuration = "${aws_launch_configuration.foobar.name}" 304 305 tag { 306 key = "Foo" 307 value = "foo-bar" 308 propagate_at_launch = true 309 } 310 } 311 ` 312 313 const testAccAWSAutoScalingGroupConfigUpdate = ` 314 resource "aws_launch_configuration" "foobar" { 315 image_id = "ami-21f78e11" 316 instance_type = "t1.micro" 317 } 318 319 resource "aws_launch_configuration" "new" { 320 image_id = "ami-21f78e11" 321 instance_type = "t1.micro" 322 } 323 324 resource "aws_autoscaling_group" "bar" { 325 availability_zones = ["us-west-2a"] 326 name = "foobar3-terraform-test" 327 max_size = 5 328 min_size = 2 329 health_check_grace_period = 300 330 health_check_type = "ELB" 331 desired_capacity = 5 332 force_delete = true 333 334 launch_configuration = "${aws_launch_configuration.new.name}" 335 336 tag { 337 key = "Bar" 338 value = "bar-foo" 339 propagate_at_launch = true 340 } 341 } 342 ` 343 344 const testAccAWSAutoScalingGroupConfigWithLoadBalancer = ` 345 resource "aws_elb" "bar" { 346 name = "foobar-terraform-test" 347 availability_zones = ["us-west-2a"] 348 349 listener { 350 instance_port = 80 351 instance_protocol = "http" 352 lb_port = 80 353 lb_protocol = "http" 354 } 355 356 health_check { 357 healthy_threshold = 2 358 unhealthy_threshold = 2 359 target = "HTTP:80/" 360 interval = 5 361 timeout = 2 362 } 363 } 364 365 resource "aws_launch_configuration" "foobar" { 366 // need an AMI that listens on :80 at boot, this is: 367 // bitnami-nginxstack-1.6.1-0-linux-ubuntu-14.04.1-x86_64-hvm-ebs-ami-99f5b1a9-3 368 image_id = "ami-b5b3fc85" 369 instance_type = "t2.micro" 370 } 371 372 resource "aws_autoscaling_group" "bar" { 373 availability_zones = ["us-west-2a"] 374 name = "foobar3-terraform-test" 375 max_size = 2 376 min_size = 2 377 health_check_grace_period = 300 378 health_check_type = "ELB" 379 min_elb_capacity = 1 380 force_delete = true 381 382 launch_configuration = "${aws_launch_configuration.foobar.name}" 383 load_balancers = ["${aws_elb.bar.name}"] 384 } 385 `