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