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