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