github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/builtin/providers/aws/resource_aws_autoscaling_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/aws-sdk-go/aws"
     8  	"github.com/hashicorp/aws-sdk-go/gen/autoscaling"
     9  	"github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  )
    12  
    13  func TestAccAWSAutoScalingGroup_basic(t *testing.T) {
    14  	var group autoscaling.AutoScalingGroup
    15  	var lc autoscaling.LaunchConfiguration
    16  
    17  	resource.Test(t, resource.TestCase{
    18  		PreCheck:     func() { testAccPreCheck(t) },
    19  		Providers:    testAccProviders,
    20  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
    21  		Steps: []resource.TestStep{
    22  			resource.TestStep{
    23  				Config: testAccAWSAutoScalingGroupConfig,
    24  				Check: resource.ComposeTestCheckFunc(
    25  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    26  					testAccCheckAWSAutoScalingGroupAttributes(&group),
    27  					resource.TestCheckResourceAttr(
    28  						"aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"),
    29  					resource.TestCheckResourceAttr(
    30  						"aws_autoscaling_group.bar", "name", "foobar3-terraform-test"),
    31  					resource.TestCheckResourceAttr(
    32  						"aws_autoscaling_group.bar", "max_size", "5"),
    33  					resource.TestCheckResourceAttr(
    34  						"aws_autoscaling_group.bar", "min_size", "2"),
    35  					resource.TestCheckResourceAttr(
    36  						"aws_autoscaling_group.bar", "health_check_grace_period", "300"),
    37  					resource.TestCheckResourceAttr(
    38  						"aws_autoscaling_group.bar", "health_check_type", "ELB"),
    39  					resource.TestCheckResourceAttr(
    40  						"aws_autoscaling_group.bar", "desired_capacity", "4"),
    41  					resource.TestCheckResourceAttr(
    42  						"aws_autoscaling_group.bar", "force_delete", "true"),
    43  					resource.TestCheckResourceAttr(
    44  						"aws_autoscaling_group.bar", "termination_policies.912102603", "OldestInstance"),
    45  				),
    46  			},
    47  
    48  			resource.TestStep{
    49  				Config: testAccAWSAutoScalingGroupConfigUpdate,
    50  				Check: resource.ComposeTestCheckFunc(
    51  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    52  					testAccCheckAWSLaunchConfigurationExists("aws_launch_configuration.new", &lc),
    53  					resource.TestCheckResourceAttr(
    54  						"aws_autoscaling_group.bar", "desired_capacity", "5"),
    55  					testLaunchConfigurationName("aws_autoscaling_group.bar", &lc),
    56  				),
    57  			},
    58  		},
    59  	})
    60  }
    61  
    62  func TestAccAWSAutoScalingGroupWithLoadBalancer(t *testing.T) {
    63  	var group autoscaling.AutoScalingGroup
    64  
    65  	resource.Test(t, resource.TestCase{
    66  		PreCheck:     func() { testAccPreCheck(t) },
    67  		Providers:    testAccProviders,
    68  		CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy,
    69  		Steps: []resource.TestStep{
    70  			resource.TestStep{
    71  				Config: testAccAWSAutoScalingGroupConfigWithLoadBalancer,
    72  				Check: resource.ComposeTestCheckFunc(
    73  					testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group),
    74  					testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(&group),
    75  				),
    76  			},
    77  		},
    78  	})
    79  }
    80  func testAccCheckAWSAutoScalingGroupDestroy(s *terraform.State) error {
    81  	conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
    82  
    83  	for _, rs := range s.RootModule().Resources {
    84  		if rs.Type != "aws_autoscaling_group" {
    85  			continue
    86  		}
    87  
    88  		// Try to find the Group
    89  		describeGroups, err := conn.DescribeAutoScalingGroups(
    90  			&autoscaling.AutoScalingGroupNamesType{
    91  				AutoScalingGroupNames: []string{rs.Primary.ID},
    92  			})
    93  
    94  		if err == nil {
    95  			if len(describeGroups.AutoScalingGroups) != 0 &&
    96  				*describeGroups.AutoScalingGroups[0].AutoScalingGroupName == rs.Primary.ID {
    97  				return fmt.Errorf("AutoScaling Group still exists")
    98  			}
    99  		}
   100  
   101  		// Verify the error
   102  		ec2err, ok := err.(aws.APIError)
   103  		if !ok {
   104  			return err
   105  		}
   106  		if ec2err.Code != "InvalidGroup.NotFound" {
   107  			return err
   108  		}
   109  	}
   110  
   111  	return nil
   112  }
   113  
   114  func testAccCheckAWSAutoScalingGroupAttributes(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc {
   115  	return func(s *terraform.State) error {
   116  		if group.AvailabilityZones[0] != "us-west-2a" {
   117  			return fmt.Errorf("Bad availability_zones: %s", group.AvailabilityZones[0])
   118  		}
   119  
   120  		if *group.AutoScalingGroupName != "foobar3-terraform-test" {
   121  			return fmt.Errorf("Bad name: %s", *group.AutoScalingGroupName)
   122  		}
   123  
   124  		if *group.MaxSize != 5 {
   125  			return fmt.Errorf("Bad max_size: %d", *group.MaxSize)
   126  		}
   127  
   128  		if *group.MinSize != 2 {
   129  			return fmt.Errorf("Bad max_size: %d", *group.MinSize)
   130  		}
   131  
   132  		if *group.HealthCheckType != "ELB" {
   133  			return fmt.Errorf("Bad health_check_type: %s", *group.HealthCheckType)
   134  		}
   135  
   136  		if *group.HealthCheckGracePeriod != 300 {
   137  			return fmt.Errorf("Bad health_check_grace_period: %d", *group.HealthCheckGracePeriod)
   138  		}
   139  
   140  		if *group.DesiredCapacity != 4 {
   141  			return fmt.Errorf("Bad desired_capacity: %d", *group.DesiredCapacity)
   142  		}
   143  
   144  		if *group.LaunchConfigurationName == "" {
   145  			return fmt.Errorf("Bad launch configuration name: %s", *group.LaunchConfigurationName)
   146  		}
   147  
   148  		return nil
   149  	}
   150  }
   151  
   152  func testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(group *autoscaling.AutoScalingGroup) resource.TestCheckFunc {
   153  	return func(s *terraform.State) error {
   154  		if group.LoadBalancerNames[0] != "foobar-terraform-test" {
   155  			return fmt.Errorf("Bad load_balancers: %s", group.LoadBalancerNames[0])
   156  		}
   157  
   158  		return nil
   159  	}
   160  }
   161  
   162  func testAccCheckAWSAutoScalingGroupExists(n string, group *autoscaling.AutoScalingGroup) resource.TestCheckFunc {
   163  	return func(s *terraform.State) error {
   164  		rs, ok := s.RootModule().Resources[n]
   165  		if !ok {
   166  			return fmt.Errorf("Not found: %s", n)
   167  		}
   168  
   169  		if rs.Primary.ID == "" {
   170  			return fmt.Errorf("No AutoScaling Group ID is set")
   171  		}
   172  
   173  		conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
   174  
   175  		describeOpts := autoscaling.AutoScalingGroupNamesType{
   176  			AutoScalingGroupNames: []string{rs.Primary.ID},
   177  		}
   178  		describeGroups, err := conn.DescribeAutoScalingGroups(&describeOpts)
   179  
   180  		if err != nil {
   181  			return err
   182  		}
   183  
   184  		if len(describeGroups.AutoScalingGroups) != 1 ||
   185  			*describeGroups.AutoScalingGroups[0].AutoScalingGroupName != rs.Primary.ID {
   186  			return fmt.Errorf("AutoScaling Group not found")
   187  		}
   188  
   189  		*group = describeGroups.AutoScalingGroups[0]
   190  
   191  		return nil
   192  	}
   193  }
   194  
   195  func testLaunchConfigurationName(n string, lc *autoscaling.LaunchConfiguration) resource.TestCheckFunc {
   196  	return func(s *terraform.State) error {
   197  		rs, ok := s.RootModule().Resources[n]
   198  		if !ok {
   199  			return fmt.Errorf("Not found: %s", n)
   200  		}
   201  
   202  		if *lc.LaunchConfigurationName != rs.Primary.Attributes["launch_configuration"] {
   203  			return fmt.Errorf("Launch configuration names do not match")
   204  		}
   205  
   206  		return nil
   207  	}
   208  }
   209  
   210  const testAccAWSAutoScalingGroupConfig = `
   211  resource "aws_launch_configuration" "foobar" {
   212    name = "foobarautoscaling-terraform-test"
   213    image_id = "ami-21f78e11"
   214    instance_type = "t1.micro"
   215  }
   216  
   217  resource "aws_autoscaling_group" "bar" {
   218    availability_zones = ["us-west-2a"]
   219    name = "foobar3-terraform-test"
   220    max_size = 5
   221    min_size = 2
   222    health_check_grace_period = 300
   223    health_check_type = "ELB"
   224    desired_capacity = 4
   225    force_delete = true
   226    termination_policies = ["OldestInstance"]
   227  
   228    launch_configuration = "${aws_launch_configuration.foobar.name}"
   229  }
   230  `
   231  
   232  const testAccAWSAutoScalingGroupConfigUpdate = `
   233  resource "aws_launch_configuration" "foobar" {
   234    name = "foobarautoscaling-terraform-test"
   235    image_id = "ami-21f78e11"
   236    instance_type = "t1.micro"
   237  }
   238  
   239  resource "aws_launch_configuration" "new" {
   240    name = "foobarautoscaling-terraform-test-new"
   241    image_id = "ami-21f78e11"
   242    instance_type = "t1.micro"
   243  }
   244  
   245  resource "aws_autoscaling_group" "bar" {
   246    availability_zones = ["us-west-2a"]
   247    name = "foobar3-terraform-test"
   248    max_size = 5
   249    min_size = 2
   250    health_check_grace_period = 300
   251    health_check_type = "ELB"
   252    desired_capacity = 5
   253    force_delete = true
   254  
   255    launch_configuration = "${aws_launch_configuration.new.name}"
   256  }
   257  `
   258  
   259  const testAccAWSAutoScalingGroupConfigWithLoadBalancer = `
   260  resource "aws_elb" "bar" {
   261    name = "foobar-terraform-test"
   262    availability_zones = ["us-west-2a"]
   263  
   264    listener {
   265      instance_port = 8000
   266      instance_protocol = "http"
   267      lb_port = 80
   268      lb_protocol = "http"
   269    }
   270  }
   271  
   272  resource "aws_launch_configuration" "foobar" {
   273    name = "foobarautoscaling-terraform-test"
   274    image_id = "ami-21f78e11"
   275    instance_type = "t1.micro"
   276  }
   277  
   278  resource "aws_autoscaling_group" "bar" {
   279    availability_zones = ["us-west-2a"]
   280    name = "foobar3-terraform-test"
   281    max_size = 5
   282    min_size = 2
   283    health_check_grace_period = 300
   284    health_check_type = "ELB"
   285    desired_capacity = 4
   286    force_delete = true
   287  
   288    launch_configuration = "${aws_launch_configuration.foobar.name}"
   289    load_balancers = ["${aws_elb.bar.name}"]
   290  }
   291  `