github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/builtin/providers/aws/resource_aws_autoscaling_group_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/hashicorp/aws-sdk-go/aws" 8 "github.com/hashicorp/aws-sdk-go/gen/autoscaling" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 ) 12 13 func TestAccAWSAutoScalingGroup_basic(t *testing.T) { 14 var group autoscaling.AutoScalingGroup 15 var lc autoscaling.LaunchConfiguration 16 17 resource.Test(t, resource.TestCase{ 18 PreCheck: func() { testAccPreCheck(t) }, 19 Providers: testAccProviders, 20 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 21 Steps: []resource.TestStep{ 22 resource.TestStep{ 23 Config: testAccAWSAutoScalingGroupConfig, 24 Check: resource.ComposeTestCheckFunc( 25 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 26 testAccCheckAWSAutoScalingGroupAttributes(&group), 27 resource.TestCheckResourceAttr( 28 "aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"), 29 resource.TestCheckResourceAttr( 30 "aws_autoscaling_group.bar", "name", "foobar3-terraform-test"), 31 resource.TestCheckResourceAttr( 32 "aws_autoscaling_group.bar", "max_size", "5"), 33 resource.TestCheckResourceAttr( 34 "aws_autoscaling_group.bar", "min_size", "2"), 35 resource.TestCheckResourceAttr( 36 "aws_autoscaling_group.bar", "health_check_grace_period", "300"), 37 resource.TestCheckResourceAttr( 38 "aws_autoscaling_group.bar", "health_check_type", "ELB"), 39 resource.TestCheckResourceAttr( 40 "aws_autoscaling_group.bar", "desired_capacity", "4"), 41 resource.TestCheckResourceAttr( 42 "aws_autoscaling_group.bar", "force_delete", "true"), 43 resource.TestCheckResourceAttr( 44 "aws_autoscaling_group.bar", "termination_policies.912102603", "OldestInstance"), 45 ), 46 }, 47 48 resource.TestStep{ 49 Config: testAccAWSAutoScalingGroupConfigUpdate, 50 Check: resource.ComposeTestCheckFunc( 51 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 52 testAccCheckAWSLaunchConfigurationExists("aws_launch_configuration.new", &lc), 53 resource.TestCheckResourceAttr( 54 "aws_autoscaling_group.bar", "desired_capacity", "5"), 55 testLaunchConfigurationName("aws_autoscaling_group.bar", &lc), 56 ), 57 }, 58 }, 59 }) 60 } 61 62 func TestAccAWSAutoScalingGroupWithLoadBalancer(t *testing.T) { 63 var group autoscaling.AutoScalingGroup 64 65 resource.Test(t, resource.TestCase{ 66 PreCheck: func() { testAccPreCheck(t) }, 67 Providers: testAccProviders, 68 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 69 Steps: []resource.TestStep{ 70 resource.TestStep{ 71 Config: testAccAWSAutoScalingGroupConfigWithLoadBalancer, 72 Check: resource.ComposeTestCheckFunc( 73 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 74 testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(&group), 75 ), 76 }, 77 }, 78 }) 79 } 80 func testAccCheckAWSAutoScalingGroupDestroy(s *terraform.State) error { 81 conn := testAccProvider.Meta().(*AWSClient).autoscalingconn 82 83 for _, rs := range s.RootModule().Resources { 84 if rs.Type != "aws_autoscaling_group" { 85 continue 86 } 87 88 // Try to find the Group 89 describeGroups, err := conn.DescribeAutoScalingGroups( 90 &autoscaling.AutoScalingGroupNamesType{ 91 AutoScalingGroupNames: []string{rs.Primary.ID}, 92 }) 93 94 if err == nil { 95 if len(describeGroups.AutoScalingGroups) != 0 && 96 *describeGroups.AutoScalingGroups[0].AutoScalingGroupName == rs.Primary.ID { 97 return fmt.Errorf("AutoScaling Group still exists") 98 } 99 } 100 101 // Verify the error 102 ec2err, ok := err.(aws.APIError) 103 if !ok { 104 return err 105 } 106 if ec2err.Code != "InvalidGroup.NotFound" { 107 return err 108 } 109 } 110 111 return nil 112 } 113 114 func testAccCheckAWSAutoScalingGroupAttributes(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc { 115 return func(s *terraform.State) error { 116 if group.AvailabilityZones[0] != "us-west-2a" { 117 return fmt.Errorf("Bad availability_zones: %s", group.AvailabilityZones[0]) 118 } 119 120 if *group.AutoScalingGroupName != "foobar3-terraform-test" { 121 return fmt.Errorf("Bad name: %s", *group.AutoScalingGroupName) 122 } 123 124 if *group.MaxSize != 5 { 125 return fmt.Errorf("Bad max_size: %d", *group.MaxSize) 126 } 127 128 if *group.MinSize != 2 { 129 return fmt.Errorf("Bad max_size: %d", *group.MinSize) 130 } 131 132 if *group.HealthCheckType != "ELB" { 133 return fmt.Errorf("Bad health_check_type: %s", *group.HealthCheckType) 134 } 135 136 if *group.HealthCheckGracePeriod != 300 { 137 return fmt.Errorf("Bad health_check_grace_period: %d", *group.HealthCheckGracePeriod) 138 } 139 140 if *group.DesiredCapacity != 4 { 141 return fmt.Errorf("Bad desired_capacity: %d", *group.DesiredCapacity) 142 } 143 144 if *group.LaunchConfigurationName == "" { 145 return fmt.Errorf("Bad launch configuration name: %s", *group.LaunchConfigurationName) 146 } 147 148 return nil 149 } 150 } 151 152 func testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc { 153 return func(s *terraform.State) error { 154 if group.LoadBalancerNames[0] != "foobar-terraform-test" { 155 return fmt.Errorf("Bad load_balancers: %s", group.LoadBalancerNames[0]) 156 } 157 158 return nil 159 } 160 } 161 162 func testAccCheckAWSAutoScalingGroupExists(n string, group *autoscaling.AutoScalingGroup) resource.TestCheckFunc { 163 return func(s *terraform.State) error { 164 rs, ok := s.RootModule().Resources[n] 165 if !ok { 166 return fmt.Errorf("Not found: %s", n) 167 } 168 169 if rs.Primary.ID == "" { 170 return fmt.Errorf("No AutoScaling Group ID is set") 171 } 172 173 conn := testAccProvider.Meta().(*AWSClient).autoscalingconn 174 175 describeOpts := autoscaling.AutoScalingGroupNamesType{ 176 AutoScalingGroupNames: []string{rs.Primary.ID}, 177 } 178 describeGroups, err := conn.DescribeAutoScalingGroups(&describeOpts) 179 180 if err != nil { 181 return err 182 } 183 184 if len(describeGroups.AutoScalingGroups) != 1 || 185 *describeGroups.AutoScalingGroups[0].AutoScalingGroupName != rs.Primary.ID { 186 return fmt.Errorf("AutoScaling Group not found") 187 } 188 189 *group = describeGroups.AutoScalingGroups[0] 190 191 return nil 192 } 193 } 194 195 func testLaunchConfigurationName(n string, lc *autoscaling.LaunchConfiguration) resource.TestCheckFunc { 196 return func(s *terraform.State) error { 197 rs, ok := s.RootModule().Resources[n] 198 if !ok { 199 return fmt.Errorf("Not found: %s", n) 200 } 201 202 if *lc.LaunchConfigurationName != rs.Primary.Attributes["launch_configuration"] { 203 return fmt.Errorf("Launch configuration names do not match") 204 } 205 206 return nil 207 } 208 } 209 210 const testAccAWSAutoScalingGroupConfig = ` 211 resource "aws_launch_configuration" "foobar" { 212 name = "foobarautoscaling-terraform-test" 213 image_id = "ami-21f78e11" 214 instance_type = "t1.micro" 215 } 216 217 resource "aws_autoscaling_group" "bar" { 218 availability_zones = ["us-west-2a"] 219 name = "foobar3-terraform-test" 220 max_size = 5 221 min_size = 2 222 health_check_grace_period = 300 223 health_check_type = "ELB" 224 desired_capacity = 4 225 force_delete = true 226 termination_policies = ["OldestInstance"] 227 228 launch_configuration = "${aws_launch_configuration.foobar.name}" 229 } 230 ` 231 232 const testAccAWSAutoScalingGroupConfigUpdate = ` 233 resource "aws_launch_configuration" "foobar" { 234 name = "foobarautoscaling-terraform-test" 235 image_id = "ami-21f78e11" 236 instance_type = "t1.micro" 237 } 238 239 resource "aws_launch_configuration" "new" { 240 name = "foobarautoscaling-terraform-test-new" 241 image_id = "ami-21f78e11" 242 instance_type = "t1.micro" 243 } 244 245 resource "aws_autoscaling_group" "bar" { 246 availability_zones = ["us-west-2a"] 247 name = "foobar3-terraform-test" 248 max_size = 5 249 min_size = 2 250 health_check_grace_period = 300 251 health_check_type = "ELB" 252 desired_capacity = 5 253 force_delete = true 254 255 launch_configuration = "${aws_launch_configuration.new.name}" 256 } 257 ` 258 259 const testAccAWSAutoScalingGroupConfigWithLoadBalancer = ` 260 resource "aws_elb" "bar" { 261 name = "foobar-terraform-test" 262 availability_zones = ["us-west-2a"] 263 264 listener { 265 instance_port = 8000 266 instance_protocol = "http" 267 lb_port = 80 268 lb_protocol = "http" 269 } 270 } 271 272 resource "aws_launch_configuration" "foobar" { 273 name = "foobarautoscaling-terraform-test" 274 image_id = "ami-21f78e11" 275 instance_type = "t1.micro" 276 } 277 278 resource "aws_autoscaling_group" "bar" { 279 availability_zones = ["us-west-2a"] 280 name = "foobar3-terraform-test" 281 max_size = 5 282 min_size = 2 283 health_check_grace_period = 300 284 health_check_type = "ELB" 285 desired_capacity = 4 286 force_delete = true 287 288 launch_configuration = "${aws_launch_configuration.foobar.name}" 289 load_balancers = ["${aws_elb.bar.name}"] 290 } 291 `