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