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