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