github.com/danrjohnson/terraform@v0.7.0-rc2.0.20160627135212-d0fc1fa086ff/builtin/providers/aws/resource_aws_autoscaling_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"regexp"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/aws/aws-sdk-go/aws/awserr"
    12  	"github.com/aws/aws-sdk-go/service/autoscaling"
    13  	"github.com/hashicorp/terraform/helper/acctest"
    14  	"github.com/hashicorp/terraform/helper/resource"
    15  	"github.com/hashicorp/terraform/terraform"
    16  )
    17  
    18  func TestAccAWSAutoScalingGroup_basic(t *testing.T) {
    19  	var group autoscaling.Group
    20  	var lc autoscaling.LaunchConfiguration
    21  
    22  	randName := fmt.Sprintf("terraform-test-%s", acctest.RandString(10))
    23  
    24  	resource.Test(t, resource.TestCase{
    25  		PreCheck:        func() { testAccPreCheck(t) },
    26  		IDRefreshName:   "aws_autoscaling_group.bar",
    27  		IDRefreshIgnore: []string{"force_delete", "metrics_granularity", "wait_for_capacity_timeout"},
    28  		Providers:       testAccProviders,
    29  		CheckDestroy:    testAccCheckAWSAutoScalingGroupDestroy,
    30  		Steps: []resource.TestStep{
    31  			resource.TestStep{
    32  				Config: testAccAWSAutoScalingGroupConfig(randName),
    33  				Check: resource.ComposeTestCheckFunc(
    34  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    35  					testAccCheckAWSAutoScalingGroupHealthyCapacity(&group, 2),
    36  					testAccCheckAWSAutoScalingGroupAttributes(&group, randName),
    37  					resource.TestCheckResourceAttr(
    38  						"aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"),
    39  					resource.TestCheckResourceAttr(
    40  						"aws_autoscaling_group.bar", "name", randName),
    41  					resource.TestCheckResourceAttr(
    42  						"aws_autoscaling_group.bar", "max_size", "5"),
    43  					resource.TestCheckResourceAttr(
    44  						"aws_autoscaling_group.bar", "min_size", "2"),
    45  					resource.TestCheckResourceAttr(
    46  						"aws_autoscaling_group.bar", "health_check_grace_period", "300"),
    47  					resource.TestCheckResourceAttr(
    48  						"aws_autoscaling_group.bar", "health_check_type", "ELB"),
    49  					resource.TestCheckResourceAttr(
    50  						"aws_autoscaling_group.bar", "desired_capacity", "4"),
    51  					resource.TestCheckResourceAttr(
    52  						"aws_autoscaling_group.bar", "force_delete", "true"),
    53  					resource.TestCheckResourceAttr(
    54  						"aws_autoscaling_group.bar", "termination_policies.0", "OldestInstance"),
    55  					resource.TestCheckResourceAttr(
    56  						"aws_autoscaling_group.bar", "termination_policies.1", "ClosestToNextInstanceHour"),
    57  				),
    58  			},
    59  
    60  			resource.TestStep{
    61  				Config: testAccAWSAutoScalingGroupConfigUpdate(randName),
    62  				Check: resource.ComposeTestCheckFunc(
    63  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    64  					testAccCheckAWSLaunchConfigurationExists("aws_launch_configuration.new", &lc),
    65  					resource.TestCheckResourceAttr(
    66  						"aws_autoscaling_group.bar", "desired_capacity", "5"),
    67  					resource.TestCheckResourceAttr(
    68  						"aws_autoscaling_group.bar", "termination_policies.0", "ClosestToNextInstanceHour"),
    69  					testLaunchConfigurationName("aws_autoscaling_group.bar", &lc),
    70  					testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{
    71  						"value":               "bar-foo",
    72  						"propagate_at_launch": true,
    73  					}),
    74  				),
    75  			},
    76  		},
    77  	})
    78  }
    79  
    80  func TestAccAWSAutoScalingGroup_autoGeneratedName(t *testing.T) {
    81  	asgNameRegexp := regexp.MustCompile("^tf-asg-")
    82  
    83  	resource.Test(t, resource.TestCase{
    84  		PreCheck:     func() { testAccPreCheck(t) },
    85  		Providers:    testAccProviders,
    86  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
    87  		Steps: []resource.TestStep{
    88  			resource.TestStep{
    89  				Config: testAccAWSAutoScalingGroupConfig_autoGeneratedName,
    90  				Check: resource.ComposeTestCheckFunc(
    91  					resource.TestMatchResourceAttr(
    92  						"aws_autoscaling_group.bar", "name", asgNameRegexp),
    93  				),
    94  			},
    95  		},
    96  	})
    97  }
    98  
    99  func TestAccAWSAutoScalingGroup_terminationPolicies(t *testing.T) {
   100  	resource.Test(t, resource.TestCase{
   101  		PreCheck:     func() { testAccPreCheck(t) },
   102  		Providers:    testAccProviders,
   103  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
   104  		Steps: []resource.TestStep{
   105  			resource.TestStep{
   106  				Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesEmpty,
   107  				Check: resource.ComposeTestCheckFunc(
   108  					resource.TestCheckResourceAttr(
   109  						"aws_autoscaling_group.bar", "termination_policies.#", "0"),
   110  				),
   111  			},
   112  
   113  			resource.TestStep{
   114  				Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesUpdate,
   115  				Check: resource.ComposeTestCheckFunc(
   116  					resource.TestCheckResourceAttr(
   117  						"aws_autoscaling_group.bar", "termination_policies.#", "1"),
   118  					resource.TestCheckResourceAttr(
   119  						"aws_autoscaling_group.bar", "termination_policies.0", "OldestInstance"),
   120  				),
   121  			},
   122  
   123  			resource.TestStep{
   124  				Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesExplicitDefault,
   125  				Check: resource.ComposeTestCheckFunc(
   126  					resource.TestCheckResourceAttr(
   127  						"aws_autoscaling_group.bar", "termination_policies.#", "1"),
   128  					resource.TestCheckResourceAttr(
   129  						"aws_autoscaling_group.bar", "termination_policies.0", "Default"),
   130  				),
   131  			},
   132  
   133  			resource.TestStep{
   134  				Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesEmpty,
   135  				Check: resource.ComposeTestCheckFunc(
   136  					resource.TestCheckResourceAttr(
   137  						"aws_autoscaling_group.bar", "termination_policies.#", "0"),
   138  				),
   139  			},
   140  		},
   141  	})
   142  }
   143  
   144  func TestAccAWSAutoScalingGroup_tags(t *testing.T) {
   145  	var group autoscaling.Group
   146  
   147  	randName := fmt.Sprintf("tfautotags-%s", acctest.RandString(5))
   148  
   149  	resource.Test(t, resource.TestCase{
   150  		PreCheck:     func() { testAccPreCheck(t) },
   151  		Providers:    testAccProviders,
   152  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
   153  		Steps: []resource.TestStep{
   154  			resource.TestStep{
   155  				Config: testAccAWSAutoScalingGroupConfig(randName),
   156  				Check: resource.ComposeTestCheckFunc(
   157  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   158  					testAccCheckAutoscalingTags(&group.Tags, "Foo", map[string]interface{}{
   159  						"value":               "foo-bar",
   160  						"propagate_at_launch": true,
   161  					}),
   162  				),
   163  			},
   164  
   165  			resource.TestStep{
   166  				Config: testAccAWSAutoScalingGroupConfigUpdate(randName),
   167  				Check: resource.ComposeTestCheckFunc(
   168  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   169  					testAccCheckAutoscalingTagNotExists(&group.Tags, "Foo"),
   170  					testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{
   171  						"value":               "bar-foo",
   172  						"propagate_at_launch": true,
   173  					}),
   174  				),
   175  			},
   176  		},
   177  	})
   178  }
   179  
   180  func TestAccAWSAutoScalingGroup_VpcUpdates(t *testing.T) {
   181  	var group autoscaling.Group
   182  
   183  	resource.Test(t, resource.TestCase{
   184  		PreCheck:     func() { testAccPreCheck(t) },
   185  		Providers:    testAccProviders,
   186  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
   187  		Steps: []resource.TestStep{
   188  			resource.TestStep{
   189  				Config: testAccAWSAutoScalingGroupConfigWithAZ,
   190  				Check: resource.ComposeTestCheckFunc(
   191  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   192  					resource.TestCheckResourceAttr(
   193  						"aws_autoscaling_group.bar", "availability_zones.#", "1"),
   194  					resource.TestCheckResourceAttr(
   195  						"aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"),
   196  					resource.TestCheckResourceAttr(
   197  						"aws_autoscaling_group.bar", "vpc_zone_identifier.#", "1"),
   198  				),
   199  			},
   200  
   201  			resource.TestStep{
   202  				Config: testAccAWSAutoScalingGroupConfigWithVPCIdent,
   203  				Check: resource.ComposeTestCheckFunc(
   204  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   205  					testAccCheckAWSAutoScalingGroupAttributesVPCZoneIdentifer(&group),
   206  					resource.TestCheckResourceAttr(
   207  						"aws_autoscaling_group.bar", "availability_zones.#", "1"),
   208  					resource.TestCheckResourceAttr(
   209  						"aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"),
   210  					resource.TestCheckResourceAttr(
   211  						"aws_autoscaling_group.bar", "vpc_zone_identifier.#", "1"),
   212  				),
   213  			},
   214  		},
   215  	})
   216  }
   217  
   218  func TestAccAWSAutoScalingGroup_WithLoadBalancer(t *testing.T) {
   219  	var group autoscaling.Group
   220  
   221  	resource.Test(t, resource.TestCase{
   222  		PreCheck:     func() { testAccPreCheck(t) },
   223  		Providers:    testAccProviders,
   224  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
   225  		Steps: []resource.TestStep{
   226  			resource.TestStep{
   227  				Config: testAccAWSAutoScalingGroupConfigWithLoadBalancer,
   228  				Check: resource.ComposeTestCheckFunc(
   229  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   230  					testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(&group),
   231  				),
   232  			},
   233  		},
   234  	})
   235  }
   236  
   237  func TestAccAWSAutoScalingGroup_withPlacementGroup(t *testing.T) {
   238  	var group autoscaling.Group
   239  
   240  	randName := fmt.Sprintf("tf_placement_test-%s", acctest.RandString(5))
   241  	resource.Test(t, resource.TestCase{
   242  		PreCheck:     func() { testAccPreCheck(t) },
   243  		Providers:    testAccProviders,
   244  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
   245  		Steps: []resource.TestStep{
   246  			resource.TestStep{
   247  				Config: testAccAWSAutoScalingGroupConfig_withPlacementGroup(randName),
   248  				Check: resource.ComposeTestCheckFunc(
   249  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   250  					resource.TestCheckResourceAttr(
   251  						"aws_autoscaling_group.bar", "placement_group", randName),
   252  				),
   253  			},
   254  		},
   255  	})
   256  }
   257  
   258  func TestAccAWSAutoScalingGroup_withMetrics(t *testing.T) {
   259  	var group autoscaling.Group
   260  
   261  	resource.Test(t, resource.TestCase{
   262  		PreCheck:     func() { testAccPreCheck(t) },
   263  		Providers:    testAccProviders,
   264  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
   265  		Steps: []resource.TestStep{
   266  			resource.TestStep{
   267  				Config: testAccAWSAutoscalingMetricsCollectionConfig_allMetricsCollected,
   268  				Check: resource.ComposeTestCheckFunc(
   269  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   270  					resource.TestCheckResourceAttr(
   271  						"aws_autoscaling_group.bar", "enabled_metrics.#", "7"),
   272  				),
   273  			},
   274  
   275  			resource.TestStep{
   276  				Config: testAccAWSAutoscalingMetricsCollectionConfig_updatingMetricsCollected,
   277  				Check: resource.ComposeTestCheckFunc(
   278  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   279  					resource.TestCheckResourceAttr(
   280  						"aws_autoscaling_group.bar", "enabled_metrics.#", "5"),
   281  				),
   282  			},
   283  		},
   284  	})
   285  }
   286  
   287  func testAccCheckAWSAutoScalingGroupDestroy(s *terraform.State) error {
   288  	conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
   289  
   290  	for _, rs := range s.RootModule().Resources {
   291  		if rs.Type != "aws_autoscaling_group" {
   292  			continue
   293  		}
   294  
   295  		// Try to find the Group
   296  		describeGroups, err := conn.DescribeAutoScalingGroups(
   297  			&autoscaling.DescribeAutoScalingGroupsInput{
   298  				AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)},
   299  			})
   300  
   301  		if err == nil {
   302  			if len(describeGroups.AutoScalingGroups) != 0 &&
   303  				*describeGroups.AutoScalingGroups[0].AutoScalingGroupName == rs.Primary.ID {
   304  				return fmt.Errorf("AutoScaling Group still exists")
   305  			}
   306  		}
   307  
   308  		// Verify the error
   309  		ec2err, ok := err.(awserr.Error)
   310  		if !ok {
   311  			return err
   312  		}
   313  		if ec2err.Code() != "InvalidGroup.NotFound" {
   314  			return err
   315  		}
   316  	}
   317  
   318  	return nil
   319  }
   320  
   321  func testAccCheckAWSAutoScalingGroupAttributes(group *autoscaling.Group, name string) resource.TestCheckFunc {
   322  	return func(s *terraform.State) error {
   323  		if *group.AvailabilityZones[0] != "us-west-2a" {
   324  			return fmt.Errorf("Bad availability_zones: %#v", group.AvailabilityZones[0])
   325  		}
   326  
   327  		if *group.AutoScalingGroupName != name {
   328  			return fmt.Errorf("Bad Autoscaling Group name, expected (%s), got (%s)", name, *group.AutoScalingGroupName)
   329  		}
   330  
   331  		if *group.MaxSize != 5 {
   332  			return fmt.Errorf("Bad max_size: %d", *group.MaxSize)
   333  		}
   334  
   335  		if *group.MinSize != 2 {
   336  			return fmt.Errorf("Bad max_size: %d", *group.MinSize)
   337  		}
   338  
   339  		if *group.HealthCheckType != "ELB" {
   340  			return fmt.Errorf("Bad health_check_type,\nexpected: %s\ngot: %s", "ELB", *group.HealthCheckType)
   341  		}
   342  
   343  		if *group.HealthCheckGracePeriod != 300 {
   344  			return fmt.Errorf("Bad health_check_grace_period: %d", *group.HealthCheckGracePeriod)
   345  		}
   346  
   347  		if *group.DesiredCapacity != 4 {
   348  			return fmt.Errorf("Bad desired_capacity: %d", *group.DesiredCapacity)
   349  		}
   350  
   351  		if *group.LaunchConfigurationName == "" {
   352  			return fmt.Errorf("Bad launch configuration name: %s", *group.LaunchConfigurationName)
   353  		}
   354  
   355  		t := &autoscaling.TagDescription{
   356  			Key:               aws.String("Foo"),
   357  			Value:             aws.String("foo-bar"),
   358  			PropagateAtLaunch: aws.Bool(true),
   359  			ResourceType:      aws.String("auto-scaling-group"),
   360  			ResourceId:        group.AutoScalingGroupName,
   361  		}
   362  
   363  		if !reflect.DeepEqual(group.Tags[0], t) {
   364  			return fmt.Errorf(
   365  				"Got:\n\n%#v\n\nExpected:\n\n%#v\n",
   366  				group.Tags[0],
   367  				t)
   368  		}
   369  
   370  		return nil
   371  	}
   372  }
   373  
   374  func testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(group *autoscaling.Group) resource.TestCheckFunc {
   375  	return func(s *terraform.State) error {
   376  		if len(group.LoadBalancerNames) != 1 {
   377  			return fmt.Errorf("Bad load_balancers: %v", group.LoadBalancerNames)
   378  		}
   379  
   380  		return nil
   381  	}
   382  }
   383  
   384  func testAccCheckAWSAutoScalingGroupExists(n string, group *autoscaling.Group) resource.TestCheckFunc {
   385  	return func(s *terraform.State) error {
   386  		rs, ok := s.RootModule().Resources[n]
   387  		if !ok {
   388  			return fmt.Errorf("Not found: %s", n)
   389  		}
   390  
   391  		if rs.Primary.ID == "" {
   392  			return fmt.Errorf("No AutoScaling Group ID is set")
   393  		}
   394  
   395  		conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
   396  
   397  		describeGroups, err := conn.DescribeAutoScalingGroups(
   398  			&autoscaling.DescribeAutoScalingGroupsInput{
   399  				AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)},
   400  			})
   401  
   402  		if err != nil {
   403  			return err
   404  		}
   405  
   406  		if len(describeGroups.AutoScalingGroups) != 1 ||
   407  			*describeGroups.AutoScalingGroups[0].AutoScalingGroupName != rs.Primary.ID {
   408  			return fmt.Errorf("AutoScaling Group not found")
   409  		}
   410  
   411  		*group = *describeGroups.AutoScalingGroups[0]
   412  
   413  		return nil
   414  	}
   415  }
   416  
   417  func testLaunchConfigurationName(n string, lc *autoscaling.LaunchConfiguration) resource.TestCheckFunc {
   418  	return func(s *terraform.State) error {
   419  		rs, ok := s.RootModule().Resources[n]
   420  		if !ok {
   421  			return fmt.Errorf("Not found: %s", n)
   422  		}
   423  
   424  		if *lc.LaunchConfigurationName != rs.Primary.Attributes["launch_configuration"] {
   425  			return fmt.Errorf("Launch configuration names do not match")
   426  		}
   427  
   428  		return nil
   429  	}
   430  }
   431  
   432  func testAccCheckAWSAutoScalingGroupHealthyCapacity(
   433  	g *autoscaling.Group, exp int) resource.TestCheckFunc {
   434  	return func(s *terraform.State) error {
   435  		healthy := 0
   436  		for _, i := range g.Instances {
   437  			if i.HealthStatus == nil {
   438  				continue
   439  			}
   440  			if strings.EqualFold(*i.HealthStatus, "Healthy") {
   441  				healthy++
   442  			}
   443  		}
   444  		if healthy < exp {
   445  			return fmt.Errorf("Expected at least %d healthy, got %d.", exp, healthy)
   446  		}
   447  		return nil
   448  	}
   449  }
   450  
   451  func testAccCheckAWSAutoScalingGroupAttributesVPCZoneIdentifer(group *autoscaling.Group) resource.TestCheckFunc {
   452  	return func(s *terraform.State) error {
   453  		// Grab Subnet Ids
   454  		var subnets []string
   455  		for _, rs := range s.RootModule().Resources {
   456  			if rs.Type != "aws_subnet" {
   457  				continue
   458  			}
   459  			subnets = append(subnets, rs.Primary.Attributes["id"])
   460  		}
   461  
   462  		if group.VPCZoneIdentifier == nil {
   463  			return fmt.Errorf("Bad VPC Zone Identifier\nexpected: %s\ngot nil", subnets)
   464  		}
   465  
   466  		zones := strings.Split(*group.VPCZoneIdentifier, ",")
   467  
   468  		remaining := len(zones)
   469  		for _, z := range zones {
   470  			for _, s := range subnets {
   471  				if z == s {
   472  					remaining--
   473  				}
   474  			}
   475  		}
   476  
   477  		if remaining != 0 {
   478  			return fmt.Errorf("Bad VPC Zone Identifier match\nexpected: %s\ngot:%s", zones, subnets)
   479  		}
   480  
   481  		return nil
   482  	}
   483  }
   484  
   485  const testAccAWSAutoScalingGroupConfig_autoGeneratedName = `
   486  resource "aws_launch_configuration" "foobar" {
   487    image_id = "ami-21f78e11"
   488    instance_type = "t1.micro"
   489  }
   490  
   491  resource "aws_autoscaling_group" "bar" {
   492    availability_zones = ["us-west-2a"]
   493    desired_capacity = 0
   494    max_size = 0
   495    min_size = 0
   496    launch_configuration = "${aws_launch_configuration.foobar.name}"
   497  }
   498  `
   499  
   500  const testAccAWSAutoScalingGroupConfig_terminationPoliciesEmpty = `
   501  resource "aws_launch_configuration" "foobar" {
   502    image_id = "ami-21f78e11"
   503    instance_type = "t1.micro"
   504  }
   505  
   506  resource "aws_autoscaling_group" "bar" {
   507    availability_zones = ["us-west-2a"]
   508    max_size = 0
   509    min_size = 0
   510    desired_capacity = 0
   511  
   512    launch_configuration = "${aws_launch_configuration.foobar.name}"
   513  }
   514  `
   515  
   516  const testAccAWSAutoScalingGroupConfig_terminationPoliciesExplicitDefault = `
   517  resource "aws_launch_configuration" "foobar" {
   518    image_id = "ami-21f78e11"
   519    instance_type = "t1.micro"
   520  }
   521  
   522  resource "aws_autoscaling_group" "bar" {
   523    availability_zones = ["us-west-2a"]
   524    max_size = 0
   525    min_size = 0
   526    desired_capacity = 0
   527    termination_policies = ["Default"]
   528  
   529    launch_configuration = "${aws_launch_configuration.foobar.name}"
   530  }
   531  `
   532  
   533  const testAccAWSAutoScalingGroupConfig_terminationPoliciesUpdate = `
   534  resource "aws_launch_configuration" "foobar" {
   535    image_id = "ami-21f78e11"
   536    instance_type = "t1.micro"
   537  }
   538  
   539  resource "aws_autoscaling_group" "bar" {
   540    availability_zones = ["us-west-2a"]
   541    max_size = 0
   542    min_size = 0
   543    desired_capacity = 0
   544    termination_policies = ["OldestInstance"]
   545  
   546    launch_configuration = "${aws_launch_configuration.foobar.name}"
   547  }
   548  `
   549  
   550  func testAccAWSAutoScalingGroupConfig(name string) string {
   551  	return fmt.Sprintf(`
   552  resource "aws_launch_configuration" "foobar" {
   553    image_id = "ami-21f78e11"
   554    instance_type = "t1.micro"
   555  }
   556  
   557  resource "aws_placement_group" "test" {
   558    name = "asg_pg_%s"
   559    strategy = "cluster"
   560  }
   561  
   562  resource "aws_autoscaling_group" "bar" {
   563    availability_zones = ["us-west-2a"]
   564    name = "%s"
   565    max_size = 5
   566    min_size = 2
   567    health_check_type = "ELB"
   568    desired_capacity = 4
   569    force_delete = true
   570    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   571  
   572    launch_configuration = "${aws_launch_configuration.foobar.name}"
   573  
   574    tag {
   575      key = "Foo"
   576      value = "foo-bar"
   577      propagate_at_launch = true
   578    }
   579  }
   580  `, name, name)
   581  }
   582  
   583  func testAccAWSAutoScalingGroupConfigUpdate(name string) string {
   584  	return fmt.Sprintf(`
   585  resource "aws_launch_configuration" "foobar" {
   586    image_id = "ami-21f78e11"
   587    instance_type = "t1.micro"
   588  }
   589  
   590  resource "aws_launch_configuration" "new" {
   591    image_id = "ami-21f78e11"
   592    instance_type = "t1.micro"
   593  }
   594  
   595  resource "aws_autoscaling_group" "bar" {
   596    availability_zones = ["us-west-2a"]
   597    name = "%s"
   598    max_size = 5
   599    min_size = 2
   600    health_check_grace_period = 300
   601    health_check_type = "ELB"
   602    desired_capacity = 5
   603    force_delete = true
   604    termination_policies = ["ClosestToNextInstanceHour"]
   605  
   606    launch_configuration = "${aws_launch_configuration.new.name}"
   607  
   608    tag {
   609      key = "Bar"
   610      value = "bar-foo"
   611      propagate_at_launch = true
   612    }
   613  }
   614  `, name)
   615  }
   616  
   617  const testAccAWSAutoScalingGroupConfigWithLoadBalancer = `
   618  resource "aws_vpc" "foo" {
   619    cidr_block = "10.1.0.0/16"
   620  	tags { Name = "tf-asg-test" }
   621  }
   622  
   623  resource "aws_internet_gateway" "gw" {
   624    vpc_id = "${aws_vpc.foo.id}"
   625  }
   626  
   627  resource "aws_subnet" "foo" {
   628  	cidr_block = "10.1.1.0/24"
   629  	vpc_id = "${aws_vpc.foo.id}"
   630  }
   631  
   632  resource "aws_security_group" "foo" {
   633    vpc_id="${aws_vpc.foo.id}"
   634  
   635    ingress {
   636      protocol = "-1"
   637      from_port = 0
   638      to_port = 0
   639      cidr_blocks = ["0.0.0.0/0"]
   640    }
   641  
   642    egress {
   643      protocol = "-1"
   644      from_port = 0
   645      to_port = 0
   646      cidr_blocks = ["0.0.0.0/0"]
   647    }
   648  }
   649  
   650  resource "aws_elb" "bar" {
   651    subnets = ["${aws_subnet.foo.id}"]
   652  	security_groups = ["${aws_security_group.foo.id}"]
   653  
   654    listener {
   655      instance_port = 80
   656      instance_protocol = "http"
   657      lb_port = 80
   658      lb_protocol = "http"
   659    }
   660  
   661    health_check {
   662      healthy_threshold = 2
   663      unhealthy_threshold = 2
   664      target = "HTTP:80/"
   665      interval = 5
   666      timeout = 2
   667    }
   668  
   669  	depends_on = ["aws_internet_gateway.gw"]
   670  }
   671  
   672  resource "aws_launch_configuration" "foobar" {
   673    // need an AMI that listens on :80 at boot, this is:
   674    // bitnami-nginxstack-1.6.1-0-linux-ubuntu-14.04.1-x86_64-hvm-ebs-ami-99f5b1a9-3
   675    image_id = "ami-b5b3fc85"
   676    instance_type = "t2.micro"
   677  	security_groups = ["${aws_security_group.foo.id}"]
   678  }
   679  
   680  resource "aws_autoscaling_group" "bar" {
   681    availability_zones = ["${aws_subnet.foo.availability_zone}"]
   682  	vpc_zone_identifier = ["${aws_subnet.foo.id}"]
   683    max_size = 2
   684    min_size = 2
   685    health_check_grace_period = 300
   686    health_check_type = "ELB"
   687    wait_for_elb_capacity = 2
   688    force_delete = true
   689  
   690    launch_configuration = "${aws_launch_configuration.foobar.name}"
   691    load_balancers = ["${aws_elb.bar.name}"]
   692  }
   693  `
   694  
   695  const testAccAWSAutoScalingGroupConfigWithAZ = `
   696  resource "aws_vpc" "default" {
   697    cidr_block = "10.0.0.0/16"
   698    tags {
   699       Name = "terraform-test"
   700    }
   701  }
   702  
   703  resource "aws_subnet" "main" {
   704    vpc_id = "${aws_vpc.default.id}"
   705    cidr_block = "10.0.1.0/24"
   706    availability_zone = "us-west-2a"
   707    tags {
   708       Name = "terraform-test"
   709    }
   710  }
   711  
   712  resource "aws_launch_configuration" "foobar" {
   713    image_id = "ami-b5b3fc85"
   714    instance_type = "t2.micro"
   715  }
   716  
   717  resource "aws_autoscaling_group" "bar" {
   718    availability_zones = [
   719  	  "us-west-2a"
   720    ]
   721    desired_capacity = 0
   722    max_size = 0
   723    min_size = 0
   724    launch_configuration = "${aws_launch_configuration.foobar.name}"
   725  }
   726  `
   727  
   728  const testAccAWSAutoScalingGroupConfigWithVPCIdent = `
   729  resource "aws_vpc" "default" {
   730    cidr_block = "10.0.0.0/16"
   731    tags {
   732       Name = "terraform-test"
   733    }
   734  }
   735  
   736  resource "aws_subnet" "main" {
   737    vpc_id = "${aws_vpc.default.id}"
   738    cidr_block = "10.0.1.0/24"
   739    availability_zone = "us-west-2a"
   740    tags {
   741       Name = "terraform-test"
   742    }
   743  }
   744  
   745  resource "aws_launch_configuration" "foobar" {
   746    image_id = "ami-b5b3fc85"
   747    instance_type = "t2.micro"
   748  }
   749  
   750  resource "aws_autoscaling_group" "bar" {
   751    vpc_zone_identifier = [
   752      "${aws_subnet.main.id}",
   753    ]
   754    desired_capacity = 0
   755    max_size = 0
   756    min_size = 0
   757    launch_configuration = "${aws_launch_configuration.foobar.name}"
   758  }
   759  `
   760  
   761  func testAccAWSAutoScalingGroupConfig_withPlacementGroup(name string) string {
   762  	return fmt.Sprintf(`
   763  resource "aws_launch_configuration" "foobar" {
   764    image_id = "ami-21f78e11"
   765    instance_type = "c3.large"
   766  }
   767  
   768  resource "aws_placement_group" "test" {
   769    name = "%s"
   770    strategy = "cluster"
   771  }
   772  
   773  resource "aws_autoscaling_group" "bar" {
   774    availability_zones = ["us-west-2a"]
   775    name = "%s"
   776    max_size = 1
   777    min_size = 1
   778    health_check_grace_period = 300
   779    health_check_type = "ELB"
   780    desired_capacity = 1
   781    force_delete = true
   782    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   783    placement_group = "${aws_placement_group.test.name}"
   784  
   785    launch_configuration = "${aws_launch_configuration.foobar.name}"
   786  
   787    tag {
   788      key = "Foo"
   789      value = "foo-bar"
   790      propagate_at_launch = true
   791    }
   792  }
   793  `, name, name)
   794  }
   795  
   796  const testAccAWSAutoscalingMetricsCollectionConfig_allMetricsCollected = `
   797  resource "aws_launch_configuration" "foobar" {
   798    image_id = "ami-21f78e11"
   799    instance_type = "t1.micro"
   800  }
   801  
   802  resource "aws_autoscaling_group" "bar" {
   803    availability_zones = ["us-west-2a"]
   804    max_size = 1
   805    min_size = 0
   806    health_check_grace_period = 300
   807    health_check_type = "EC2"
   808    desired_capacity = 0
   809    force_delete = true
   810    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   811    launch_configuration = "${aws_launch_configuration.foobar.name}"
   812    enabled_metrics = ["GroupTotalInstances",
   813    	     "GroupPendingInstances",
   814    	     "GroupTerminatingInstances",
   815    	     "GroupDesiredCapacity",
   816    	     "GroupInServiceInstances",
   817    	     "GroupMinSize",
   818    	     "GroupMaxSize"
   819    ]
   820    metrics_granularity = "1Minute"
   821  }
   822  `
   823  
   824  const testAccAWSAutoscalingMetricsCollectionConfig_updatingMetricsCollected = `
   825  resource "aws_launch_configuration" "foobar" {
   826    image_id = "ami-21f78e11"
   827    instance_type = "t1.micro"
   828  }
   829  
   830  resource "aws_autoscaling_group" "bar" {
   831    availability_zones = ["us-west-2a"]
   832    max_size = 1
   833    min_size = 0
   834    health_check_grace_period = 300
   835    health_check_type = "EC2"
   836    desired_capacity = 0
   837    force_delete = true
   838    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   839    launch_configuration = "${aws_launch_configuration.foobar.name}"
   840    enabled_metrics = ["GroupTotalInstances",
   841    	     "GroupPendingInstances",
   842    	     "GroupTerminatingInstances",
   843    	     "GroupDesiredCapacity",
   844    	     "GroupMaxSize"
   845    ]
   846    metrics_granularity = "1Minute"
   847  }
   848  `