github.com/paulmey/terraform@v0.5.2-0.20150519145237-046e9b4c884d/builtin/providers/aws/resource_aws_autoscaling_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/awslabs/aws-sdk-go/aws"
    10  	"github.com/awslabs/aws-sdk-go/service/autoscaling"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestAccAWSAutoScalingGroup_basic(t *testing.T) {
    16  	var group autoscaling.AutoScalingGroup
    17  	var lc autoscaling.LaunchConfiguration
    18  
    19  	resource.Test(t, resource.TestCase{
    20  		PreCheck:     func() { testAccPreCheck(t) },
    21  		Providers:    testAccProviders,
    22  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
    23  		Steps: []resource.TestStep{
    24  			resource.TestStep{
    25  				Config: testAccAWSAutoScalingGroupConfig,
    26  				Check: resource.ComposeTestCheckFunc(
    27  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    28  					testAccCheckAWSAutoScalingGroupHealthyCapacity(&group, 2),
    29  					testAccCheckAWSAutoScalingGroupAttributes(&group),
    30  					resource.TestCheckResourceAttr(
    31  						"aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"),
    32  					resource.TestCheckResourceAttr(
    33  						"aws_autoscaling_group.bar", "name", "foobar3-terraform-test"),
    34  					resource.TestCheckResourceAttr(
    35  						"aws_autoscaling_group.bar", "max_size", "5"),
    36  					resource.TestCheckResourceAttr(
    37  						"aws_autoscaling_group.bar", "min_size", "2"),
    38  					resource.TestCheckResourceAttr(
    39  						"aws_autoscaling_group.bar", "health_check_grace_period", "300"),
    40  					resource.TestCheckResourceAttr(
    41  						"aws_autoscaling_group.bar", "health_check_type", "ELB"),
    42  					resource.TestCheckResourceAttr(
    43  						"aws_autoscaling_group.bar", "desired_capacity", "4"),
    44  					resource.TestCheckResourceAttr(
    45  						"aws_autoscaling_group.bar", "force_delete", "true"),
    46  					resource.TestCheckResourceAttr(
    47  						"aws_autoscaling_group.bar", "termination_policies.912102603", "OldestInstance"),
    48  				),
    49  			},
    50  
    51  			resource.TestStep{
    52  				Config: testAccAWSAutoScalingGroupConfigUpdate,
    53  				Check: resource.ComposeTestCheckFunc(
    54  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    55  					testAccCheckAWSLaunchConfigurationExists("aws_launch_configuration.new", &lc),
    56  					resource.TestCheckResourceAttr(
    57  						"aws_autoscaling_group.bar", "desired_capacity", "5"),
    58  					testLaunchConfigurationName("aws_autoscaling_group.bar", &lc),
    59  					testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{
    60  						"value":               "bar-foo",
    61  						"propagate_at_launch": true,
    62  					}),
    63  				),
    64  			},
    65  		},
    66  	})
    67  }
    68  
    69  func TestAccAWSAutoScalingGroup_tags(t *testing.T) {
    70  	var group autoscaling.AutoScalingGroup
    71  
    72  	resource.Test(t, resource.TestCase{
    73  		PreCheck:     func() { testAccPreCheck(t) },
    74  		Providers:    testAccProviders,
    75  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
    76  		Steps: []resource.TestStep{
    77  			resource.TestStep{
    78  				Config: testAccAWSAutoScalingGroupConfig,
    79  				Check: resource.ComposeTestCheckFunc(
    80  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    81  					testAccCheckAutoscalingTags(&group.Tags, "Foo", map[string]interface{}{
    82  						"value":               "foo-bar",
    83  						"propagate_at_launch": true,
    84  					}),
    85  				),
    86  			},
    87  
    88  			resource.TestStep{
    89  				Config: testAccAWSAutoScalingGroupConfigUpdate,
    90  				Check: resource.ComposeTestCheckFunc(
    91  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    92  					testAccCheckAutoscalingTagNotExists(&group.Tags, "Foo"),
    93  					testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{
    94  						"value":               "bar-foo",
    95  						"propagate_at_launch": true,
    96  					}),
    97  				),
    98  			},
    99  		},
   100  	})
   101  }
   102  
   103  func TestAccAWSAutoScalingGroup_WithLoadBalancer(t *testing.T) {
   104  	var group autoscaling.AutoScalingGroup
   105  
   106  	resource.Test(t, resource.TestCase{
   107  		PreCheck:     func() { testAccPreCheck(t) },
   108  		Providers:    testAccProviders,
   109  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
   110  		Steps: []resource.TestStep{
   111  			resource.TestStep{
   112  				Config: testAccAWSAutoScalingGroupConfigWithLoadBalancer,
   113  				Check: resource.ComposeTestCheckFunc(
   114  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
   115  					testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(&group),
   116  				),
   117  			},
   118  		},
   119  	})
   120  }
   121  
   122  func testAccCheckAWSAutoScalingGroupDestroy(s *terraform.State) error {
   123  	conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
   124  
   125  	for _, rs := range s.RootModule().Resources {
   126  		if rs.Type != "aws_autoscaling_group" {
   127  			continue
   128  		}
   129  
   130  		// Try to find the Group
   131  		describeGroups, err := conn.DescribeAutoScalingGroups(
   132  			&autoscaling.DescribeAutoScalingGroupsInput{
   133  				AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)},
   134  			})
   135  
   136  		if err == nil {
   137  			if len(describeGroups.AutoScalingGroups) != 0 &&
   138  				*describeGroups.AutoScalingGroups[0].AutoScalingGroupName == rs.Primary.ID {
   139  				return fmt.Errorf("AutoScaling Group still exists")
   140  			}
   141  		}
   142  
   143  		// Verify the error
   144  		ec2err, ok := err.(aws.APIError)
   145  		if !ok {
   146  			return err
   147  		}
   148  		if ec2err.Code != "InvalidGroup.NotFound" {
   149  			return err
   150  		}
   151  	}
   152  
   153  	return nil
   154  }
   155  
   156  func testAccCheckAWSAutoScalingGroupAttributes(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc {
   157  	return func(s *terraform.State) error {
   158  		if *group.AvailabilityZones[0] != "us-west-2a" {
   159  			return fmt.Errorf("Bad availability_zones: %#v", group.AvailabilityZones[0])
   160  		}
   161  
   162  		if *group.AutoScalingGroupName != "foobar3-terraform-test" {
   163  			return fmt.Errorf("Bad name: %s", *group.AutoScalingGroupName)
   164  		}
   165  
   166  		if *group.MaxSize != 5 {
   167  			return fmt.Errorf("Bad max_size: %d", *group.MaxSize)
   168  		}
   169  
   170  		if *group.MinSize != 2 {
   171  			return fmt.Errorf("Bad max_size: %d", *group.MinSize)
   172  		}
   173  
   174  		if *group.HealthCheckType != "ELB" {
   175  			return fmt.Errorf("Bad health_check_type,\nexpected: %s\ngot: %s", "ELB", *group.HealthCheckType)
   176  		}
   177  
   178  		if *group.HealthCheckGracePeriod != 300 {
   179  			return fmt.Errorf("Bad health_check_grace_period: %d", *group.HealthCheckGracePeriod)
   180  		}
   181  
   182  		if *group.DesiredCapacity != 4 {
   183  			return fmt.Errorf("Bad desired_capacity: %d", *group.DesiredCapacity)
   184  		}
   185  
   186  		if *group.LaunchConfigurationName == "" {
   187  			return fmt.Errorf("Bad launch configuration name: %s", *group.LaunchConfigurationName)
   188  		}
   189  
   190  		t := &autoscaling.TagDescription{
   191  			Key:               aws.String("Foo"),
   192  			Value:             aws.String("foo-bar"),
   193  			PropagateAtLaunch: aws.Boolean(true),
   194  			ResourceType:      aws.String("auto-scaling-group"),
   195  			ResourceID:        group.AutoScalingGroupName,
   196  		}
   197  
   198  		if !reflect.DeepEqual(group.Tags[0], t) {
   199  			return fmt.Errorf(
   200  				"Got:\n\n%#v\n\nExpected:\n\n%#v\n",
   201  				group.Tags[0],
   202  				t)
   203  		}
   204  
   205  		return nil
   206  	}
   207  }
   208  
   209  func testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc {
   210  	return func(s *terraform.State) error {
   211  		if *group.LoadBalancerNames[0] != "foobar-terraform-test" {
   212  			return fmt.Errorf("Bad load_balancers: %#v", group.LoadBalancerNames[0])
   213  		}
   214  
   215  		return nil
   216  	}
   217  }
   218  
   219  func testAccCheckAWSAutoScalingGroupExists(n string, group *autoscaling.AutoScalingGroup) resource.TestCheckFunc {
   220  	return func(s *terraform.State) error {
   221  		rs, ok := s.RootModule().Resources[n]
   222  		if !ok {
   223  			return fmt.Errorf("Not found: %s", n)
   224  		}
   225  
   226  		if rs.Primary.ID == "" {
   227  			return fmt.Errorf("No AutoScaling Group ID is set")
   228  		}
   229  
   230  		conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
   231  
   232  		describeGroups, err := conn.DescribeAutoScalingGroups(
   233  			&autoscaling.DescribeAutoScalingGroupsInput{
   234  				AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)},
   235  			})
   236  
   237  		if err != nil {
   238  			return err
   239  		}
   240  
   241  		if len(describeGroups.AutoScalingGroups) != 1 ||
   242  			*describeGroups.AutoScalingGroups[0].AutoScalingGroupName != rs.Primary.ID {
   243  			return fmt.Errorf("AutoScaling Group not found")
   244  		}
   245  
   246  		*group = *describeGroups.AutoScalingGroups[0]
   247  
   248  		return nil
   249  	}
   250  }
   251  
   252  func testLaunchConfigurationName(n string, lc *autoscaling.LaunchConfiguration) resource.TestCheckFunc {
   253  	return func(s *terraform.State) error {
   254  		rs, ok := s.RootModule().Resources[n]
   255  		if !ok {
   256  			return fmt.Errorf("Not found: %s", n)
   257  		}
   258  
   259  		if *lc.LaunchConfigurationName != rs.Primary.Attributes["launch_configuration"] {
   260  			return fmt.Errorf("Launch configuration names do not match")
   261  		}
   262  
   263  		return nil
   264  	}
   265  }
   266  
   267  func testAccCheckAWSAutoScalingGroupHealthyCapacity(
   268  	g *autoscaling.AutoScalingGroup, exp int) resource.TestCheckFunc {
   269  	return func(s *terraform.State) error {
   270  		healthy := 0
   271  		for _, i := range g.Instances {
   272  			if i.HealthStatus == nil {
   273  				continue
   274  			}
   275  			if strings.EqualFold(*i.HealthStatus, "Healthy") {
   276  				healthy++
   277  			}
   278  		}
   279  		if healthy < exp {
   280  			return fmt.Errorf("Expected at least %d healthy, got %d.", exp, healthy)
   281  		}
   282  		return nil
   283  	}
   284  }
   285  
   286  const testAccAWSAutoScalingGroupConfig = `
   287  resource "aws_launch_configuration" "foobar" {
   288    image_id = "ami-21f78e11"
   289    instance_type = "t1.micro"
   290  }
   291  
   292  resource "aws_autoscaling_group" "bar" {
   293    availability_zones = ["us-west-2a"]
   294    name = "foobar3-terraform-test"
   295    max_size = 5
   296    min_size = 2
   297    health_check_grace_period = 300
   298    health_check_type = "ELB"
   299    desired_capacity = 4
   300    force_delete = true
   301    termination_policies = ["OldestInstance"]
   302  
   303    launch_configuration = "${aws_launch_configuration.foobar.name}"
   304  
   305    tag {
   306      key = "Foo"
   307      value = "foo-bar"
   308      propagate_at_launch = true
   309    }
   310  }
   311  `
   312  
   313  const testAccAWSAutoScalingGroupConfigUpdate = `
   314  resource "aws_launch_configuration" "foobar" {
   315    image_id = "ami-21f78e11"
   316    instance_type = "t1.micro"
   317  }
   318  
   319  resource "aws_launch_configuration" "new" {
   320    image_id = "ami-21f78e11"
   321    instance_type = "t1.micro"
   322  }
   323  
   324  resource "aws_autoscaling_group" "bar" {
   325    availability_zones = ["us-west-2a"]
   326    name = "foobar3-terraform-test"
   327    max_size = 5
   328    min_size = 2
   329    health_check_grace_period = 300
   330    health_check_type = "ELB"
   331    desired_capacity = 5
   332    force_delete = true
   333  
   334    launch_configuration = "${aws_launch_configuration.new.name}"
   335  
   336    tag {
   337      key = "Bar"
   338      value = "bar-foo"
   339      propagate_at_launch = true
   340    }
   341  }
   342  `
   343  
   344  const testAccAWSAutoScalingGroupConfigWithLoadBalancer = `
   345  resource "aws_elb" "bar" {
   346    name = "foobar-terraform-test"
   347    availability_zones = ["us-west-2a"]
   348  
   349    listener {
   350      instance_port = 80
   351      instance_protocol = "http"
   352      lb_port = 80
   353      lb_protocol = "http"
   354    }
   355  
   356    health_check {
   357      healthy_threshold = 2
   358      unhealthy_threshold = 2
   359      target = "HTTP:80/"
   360      interval = 5
   361      timeout = 2
   362    }
   363  }
   364  
   365  resource "aws_launch_configuration" "foobar" {
   366    // need an AMI that listens on :80 at boot, this is:
   367    // bitnami-nginxstack-1.6.1-0-linux-ubuntu-14.04.1-x86_64-hvm-ebs-ami-99f5b1a9-3
   368    image_id = "ami-b5b3fc85"
   369    instance_type = "t2.micro"
   370  }
   371  
   372  resource "aws_autoscaling_group" "bar" {
   373    availability_zones = ["us-west-2a"]
   374    name = "foobar3-terraform-test"
   375    max_size = 2
   376    min_size = 2
   377    health_check_grace_period = 300
   378    health_check_type = "ELB"
   379    min_elb_capacity = 1
   380    force_delete = true
   381  
   382    launch_configuration = "${aws_launch_configuration.foobar.name}"
   383    load_balancers = ["${aws_elb.bar.name}"]
   384  }
   385  `