github.com/nicgrayson/terraform@v0.4.3-0.20150415203910-c4de50829380/builtin/providers/aws/resource_aws_autoscaling_group_test.go (about)

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