github.com/subuk/terraform@v0.6.14-0.20160317140351-de1567c2e732/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_grace_period = 300
   559    health_check_type = "ELB"
   560    desired_capacity = 4
   561    force_delete = true
   562    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   563  
   564    launch_configuration = "${aws_launch_configuration.foobar.name}"
   565  
   566    tag {
   567      key = "Foo"
   568      value = "foo-bar"
   569      propagate_at_launch = true
   570    }
   571  }
   572  `
   573  
   574  const testAccAWSAutoScalingGroupConfigUpdate = `
   575  resource "aws_launch_configuration" "foobar" {
   576    image_id = "ami-21f78e11"
   577    instance_type = "t1.micro"
   578  }
   579  
   580  resource "aws_launch_configuration" "new" {
   581    image_id = "ami-21f78e11"
   582    instance_type = "t1.micro"
   583  }
   584  
   585  resource "aws_autoscaling_group" "bar" {
   586    availability_zones = ["us-west-2a"]
   587    name = "foobar3-terraform-test"
   588    max_size = 5
   589    min_size = 2
   590    health_check_grace_period = 300
   591    health_check_type = "ELB"
   592    desired_capacity = 5
   593    force_delete = true
   594    termination_policies = ["ClosestToNextInstanceHour"]
   595  
   596    launch_configuration = "${aws_launch_configuration.new.name}"
   597  
   598    tag {
   599      key = "Bar"
   600      value = "bar-foo"
   601      propagate_at_launch = true
   602    }
   603  }
   604  `
   605  
   606  const testAccAWSAutoScalingGroupConfigWithLoadBalancer = `
   607  resource "aws_vpc" "foo" {
   608    cidr_block = "10.1.0.0/16"
   609  	tags { Name = "tf-asg-test" }
   610  }
   611  
   612  resource "aws_internet_gateway" "gw" {
   613    vpc_id = "${aws_vpc.foo.id}"
   614  }
   615  
   616  resource "aws_subnet" "foo" {
   617  	cidr_block = "10.1.1.0/24"
   618  	vpc_id = "${aws_vpc.foo.id}"
   619  }
   620  
   621  resource "aws_security_group" "foo" {
   622    vpc_id="${aws_vpc.foo.id}"
   623  
   624    ingress {
   625      protocol = "-1"
   626      from_port = 0
   627      to_port = 0
   628      cidr_blocks = ["0.0.0.0/0"]
   629    }
   630  
   631    egress {
   632      protocol = "-1"
   633      from_port = 0
   634      to_port = 0
   635      cidr_blocks = ["0.0.0.0/0"]
   636    }
   637  }
   638  
   639  resource "aws_elb" "bar" {
   640    subnets = ["${aws_subnet.foo.id}"]
   641  	security_groups = ["${aws_security_group.foo.id}"]
   642  
   643    listener {
   644      instance_port = 80
   645      instance_protocol = "http"
   646      lb_port = 80
   647      lb_protocol = "http"
   648    }
   649  
   650    health_check {
   651      healthy_threshold = 2
   652      unhealthy_threshold = 2
   653      target = "HTTP:80/"
   654      interval = 5
   655      timeout = 2
   656    }
   657  
   658  	depends_on = ["aws_internet_gateway.gw"]
   659  }
   660  
   661  resource "aws_launch_configuration" "foobar" {
   662    // need an AMI that listens on :80 at boot, this is:
   663    // bitnami-nginxstack-1.6.1-0-linux-ubuntu-14.04.1-x86_64-hvm-ebs-ami-99f5b1a9-3
   664    image_id = "ami-b5b3fc85"
   665    instance_type = "t2.micro"
   666  	security_groups = ["${aws_security_group.foo.id}"]
   667  }
   668  
   669  resource "aws_autoscaling_group" "bar" {
   670    availability_zones = ["${aws_subnet.foo.availability_zone}"]
   671  	vpc_zone_identifier = ["${aws_subnet.foo.id}"]
   672    name = "foobar3-terraform-test"
   673    max_size = 2
   674    min_size = 2
   675    health_check_grace_period = 300
   676    health_check_type = "ELB"
   677    wait_for_elb_capacity = 2
   678    force_delete = true
   679  
   680    launch_configuration = "${aws_launch_configuration.foobar.name}"
   681    load_balancers = ["${aws_elb.bar.name}"]
   682  }
   683  `
   684  
   685  const testAccAWSAutoScalingGroupConfigWithAZ = `
   686  resource "aws_vpc" "default" {
   687    cidr_block = "10.0.0.0/16"
   688    tags {
   689       Name = "terraform-test"
   690    }
   691  }
   692  
   693  resource "aws_subnet" "main" {
   694    vpc_id = "${aws_vpc.default.id}"
   695    cidr_block = "10.0.1.0/24"
   696    availability_zone = "us-west-2a"
   697    tags {
   698       Name = "terraform-test"
   699    }
   700  }
   701  
   702  resource "aws_launch_configuration" "foobar" {
   703    image_id = "ami-b5b3fc85"
   704    instance_type = "t2.micro"
   705  }
   706  
   707  resource "aws_autoscaling_group" "bar" {
   708    availability_zones = [
   709  	  "us-west-2a"
   710    ]
   711    desired_capacity = 0
   712    max_size = 0
   713    min_size = 0
   714    launch_configuration = "${aws_launch_configuration.foobar.name}"
   715  }
   716  `
   717  
   718  const testAccAWSAutoScalingGroupConfigWithVPCIdent = `
   719  resource "aws_vpc" "default" {
   720    cidr_block = "10.0.0.0/16"
   721    tags {
   722       Name = "terraform-test"
   723    }
   724  }
   725  
   726  resource "aws_subnet" "main" {
   727    vpc_id = "${aws_vpc.default.id}"
   728    cidr_block = "10.0.1.0/24"
   729    availability_zone = "us-west-2a"
   730    tags {
   731       Name = "terraform-test"
   732    }
   733  }
   734  
   735  resource "aws_launch_configuration" "foobar" {
   736    image_id = "ami-b5b3fc85"
   737    instance_type = "t2.micro"
   738  }
   739  
   740  resource "aws_autoscaling_group" "bar" {
   741    vpc_zone_identifier = [
   742      "${aws_subnet.main.id}",
   743    ]
   744    desired_capacity = 0
   745    max_size = 0
   746    min_size = 0
   747    launch_configuration = "${aws_launch_configuration.foobar.name}"
   748  }
   749  `
   750  
   751  const testAccAWSAutoScalingGroupConfig_withPlacementGroup = `
   752  resource "aws_launch_configuration" "foobar" {
   753    image_id = "ami-21f78e11"
   754    instance_type = "c3.large"
   755  }
   756  
   757  resource "aws_placement_group" "test" {
   758    name = "tf_placement_test"
   759    strategy = "cluster"
   760  }
   761  
   762  resource "aws_autoscaling_group" "bar" {
   763    availability_zones = ["us-west-2a"]
   764    name = "foobar3-terraform-test"
   765    max_size = 1
   766    min_size = 1
   767    health_check_grace_period = 300
   768    health_check_type = "ELB"
   769    desired_capacity = 1
   770    force_delete = true
   771    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   772    placement_group = "${aws_placement_group.test.name}"
   773  
   774    launch_configuration = "${aws_launch_configuration.foobar.name}"
   775  
   776    tag {
   777      key = "Foo"
   778      value = "foo-bar"
   779      propagate_at_launch = true
   780    }
   781  }
   782  `
   783  
   784  const testAccAWSAutoscalingMetricsCollectionConfig_allMetricsCollected = `
   785  resource "aws_launch_configuration" "foobar" {
   786    image_id = "ami-21f78e11"
   787    instance_type = "t1.micro"
   788  }
   789  
   790  resource "aws_autoscaling_group" "bar" {
   791    availability_zones = ["us-west-2a"]
   792    max_size = 1
   793    min_size = 0
   794    health_check_grace_period = 300
   795    health_check_type = "EC2"
   796    desired_capacity = 0
   797    force_delete = true
   798    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   799    launch_configuration = "${aws_launch_configuration.foobar.name}"
   800    enabled_metrics = ["GroupTotalInstances",
   801    	     "GroupPendingInstances",
   802    	     "GroupTerminatingInstances",
   803    	     "GroupDesiredCapacity",
   804    	     "GroupInServiceInstances",
   805    	     "GroupMinSize",
   806    	     "GroupMaxSize"
   807    ]
   808    metrics_granularity = "1Minute"
   809  }
   810  `
   811  
   812  const testAccAWSAutoscalingMetricsCollectionConfig_updatingMetricsCollected = `
   813  resource "aws_launch_configuration" "foobar" {
   814    image_id = "ami-21f78e11"
   815    instance_type = "t1.micro"
   816  }
   817  
   818  resource "aws_autoscaling_group" "bar" {
   819    availability_zones = ["us-west-2a"]
   820    max_size = 1
   821    min_size = 0
   822    health_check_grace_period = 300
   823    health_check_type = "EC2"
   824    desired_capacity = 0
   825    force_delete = true
   826    termination_policies = ["OldestInstance","ClosestToNextInstanceHour"]
   827    launch_configuration = "${aws_launch_configuration.foobar.name}"
   828    enabled_metrics = ["GroupTotalInstances",
   829    	     "GroupPendingInstances",
   830    	     "GroupTerminatingInstances",
   831    	     "GroupDesiredCapacity",
   832    	     "GroupMaxSize"
   833    ]
   834    metrics_granularity = "1Minute"
   835  }
   836  `