github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_autoscaling_lifecycle_hook_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/service/autoscaling"
     9  	"github.com/hashicorp/terraform/helper/acctest"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  )
    13  
    14  func TestAccAWSAutoscalingLifecycleHook_basic(t *testing.T) {
    15  	resourceName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
    16  
    17  	resource.Test(t, resource.TestCase{
    18  		PreCheck:     func() { testAccPreCheck(t) },
    19  		Providers:    testAccProviders,
    20  		CheckDestroy: testAccCheckAWSAutoscalingLifecycleHookDestroy,
    21  		Steps: []resource.TestStep{
    22  			{
    23  				Config: testAccAWSAutoscalingLifecycleHookConfig(resourceName),
    24  				Check: resource.ComposeTestCheckFunc(
    25  					testAccCheckLifecycleHookExists("aws_autoscaling_lifecycle_hook.foobar"),
    26  					resource.TestCheckResourceAttr("aws_autoscaling_lifecycle_hook.foobar", "autoscaling_group_name", resourceName),
    27  					resource.TestCheckResourceAttr("aws_autoscaling_lifecycle_hook.foobar", "default_result", "CONTINUE"),
    28  					resource.TestCheckResourceAttr("aws_autoscaling_lifecycle_hook.foobar", "heartbeat_timeout", "2000"),
    29  					resource.TestCheckResourceAttr("aws_autoscaling_lifecycle_hook.foobar", "lifecycle_transition", "autoscaling:EC2_INSTANCE_LAUNCHING"),
    30  				),
    31  			},
    32  		},
    33  	})
    34  }
    35  
    36  func TestAccAWSAutoscalingLifecycleHook_omitDefaultResult(t *testing.T) {
    37  	rName := acctest.RandString(10)
    38  	rInt := acctest.RandInt()
    39  	resource.Test(t, resource.TestCase{
    40  		PreCheck:     func() { testAccPreCheck(t) },
    41  		Providers:    testAccProviders,
    42  		CheckDestroy: testAccCheckAWSAutoscalingLifecycleHookDestroy,
    43  		Steps: []resource.TestStep{
    44  			{
    45  				Config: testAccAWSAutoscalingLifecycleHookConfig_omitDefaultResult(rName, rInt),
    46  				Check: resource.ComposeTestCheckFunc(
    47  					testAccCheckLifecycleHookExists("aws_autoscaling_lifecycle_hook.foobar"),
    48  					resource.TestCheckResourceAttr("aws_autoscaling_lifecycle_hook.foobar", "default_result", "ABANDON"),
    49  				),
    50  			},
    51  		},
    52  	})
    53  }
    54  
    55  func testAccCheckLifecycleHookExists(n string) resource.TestCheckFunc {
    56  	return func(s *terraform.State) error {
    57  		rs, ok := s.RootModule().Resources[n]
    58  		if !ok {
    59  			return fmt.Errorf("Not found: %s", n)
    60  		}
    61  
    62  		return checkLifecycleHookExistsByName(
    63  			rs.Primary.Attributes["autoscaling_group_name"], rs.Primary.ID)
    64  	}
    65  }
    66  
    67  func checkLifecycleHookExistsByName(asgName, hookName string) error {
    68  	conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
    69  	params := &autoscaling.DescribeLifecycleHooksInput{
    70  		AutoScalingGroupName: aws.String(asgName),
    71  		LifecycleHookNames:   []*string{aws.String(hookName)},
    72  	}
    73  	resp, err := conn.DescribeLifecycleHooks(params)
    74  	if err != nil {
    75  		return err
    76  	}
    77  	if len(resp.LifecycleHooks) == 0 {
    78  		return fmt.Errorf("LifecycleHook not found")
    79  	}
    80  
    81  	return nil
    82  }
    83  
    84  func testAccCheckAWSAutoscalingLifecycleHookDestroy(s *terraform.State) error {
    85  	conn := testAccProvider.Meta().(*AWSClient).autoscalingconn
    86  
    87  	for _, rs := range s.RootModule().Resources {
    88  		if rs.Type != "aws_autoscaling_group" {
    89  			continue
    90  		}
    91  
    92  		params := autoscaling.DescribeLifecycleHooksInput{
    93  			AutoScalingGroupName: aws.String(rs.Primary.Attributes["autoscaling_group_name"]),
    94  			LifecycleHookNames:   []*string{aws.String(rs.Primary.ID)},
    95  		}
    96  
    97  		resp, err := conn.DescribeLifecycleHooks(&params)
    98  
    99  		if err == nil {
   100  			if len(resp.LifecycleHooks) != 0 &&
   101  				*resp.LifecycleHooks[0].LifecycleHookName == rs.Primary.ID {
   102  				return fmt.Errorf("Lifecycle Hook Still Exists: %s", rs.Primary.ID)
   103  			}
   104  		}
   105  	}
   106  
   107  	return nil
   108  }
   109  
   110  func testAccAWSAutoscalingLifecycleHookConfig(name string) string {
   111  	return fmt.Sprintf(`
   112  resource "aws_launch_configuration" "foobar" {
   113      name = "%s"
   114      image_id = "ami-21f78e11"
   115      instance_type = "t1.micro"
   116  }
   117  
   118  resource "aws_sqs_queue" "foobar" {
   119    name = "foobar"
   120    delay_seconds = 90
   121    max_message_size = 2048
   122    message_retention_seconds = 86400
   123    receive_wait_time_seconds = 10
   124  }
   125  
   126  resource "aws_iam_role" "foobar" {
   127      name = "foobar"
   128      assume_role_policy = <<EOF
   129  {
   130    "Version" : "2012-10-17",
   131    "Statement": [ {
   132      "Effect": "Allow",
   133      "Principal": {"AWS": "*"},
   134      "Action": [ "sts:AssumeRole" ]
   135    } ]
   136  }
   137  EOF
   138  }
   139  
   140  resource "aws_iam_role_policy" "foobar" {
   141      name = "foobar"
   142      role = "${aws_iam_role.foobar.id}"
   143      policy = <<EOF
   144  {
   145      "Version" : "2012-10-17",
   146      "Statement": [ {
   147        "Effect": "Allow",
   148        "Action": [
   149  	"sqs:SendMessage",
   150  	"sqs:GetQueueUrl",
   151  	"sns:Publish"
   152        ],
   153        "Resource": [
   154  	"${aws_sqs_queue.foobar.arn}"
   155        ]
   156      } ]
   157  }
   158  EOF
   159  }
   160  
   161  
   162  resource "aws_autoscaling_group" "foobar" {
   163      availability_zones = ["us-west-2a"]
   164      name = "%s"
   165  		max_size = 5
   166      min_size = 2
   167      health_check_grace_period = 300
   168      health_check_type = "ELB"
   169      force_delete = true
   170      termination_policies = ["OldestInstance"]
   171      launch_configuration = "${aws_launch_configuration.foobar.name}"
   172      tag {
   173          key = "Foo"
   174          value = "foo-bar"
   175          propagate_at_launch = true
   176      }
   177  }
   178  
   179  resource "aws_autoscaling_lifecycle_hook" "foobar" {
   180      name = "foobar"
   181      autoscaling_group_name = "${aws_autoscaling_group.foobar.name}"
   182      default_result = "CONTINUE"
   183      heartbeat_timeout = 2000
   184      lifecycle_transition = "autoscaling:EC2_INSTANCE_LAUNCHING"
   185      notification_metadata = <<EOF
   186  {
   187    "foo": "bar"
   188  }
   189  EOF
   190      notification_target_arn = "${aws_sqs_queue.foobar.arn}"
   191      role_arn = "${aws_iam_role.foobar.arn}"
   192  }
   193  `, name, name)
   194  }
   195  
   196  func testAccAWSAutoscalingLifecycleHookConfig_omitDefaultResult(name string, rInt int) string {
   197  	return fmt.Sprintf(`
   198  resource "aws_launch_configuration" "foobar" {
   199    name          = "%s"
   200    image_id      = "ami-21f78e11"
   201    instance_type = "t1.micro"
   202  }
   203  
   204  resource "aws_sqs_queue" "foobar" {
   205    name                      = "foobar"
   206    delay_seconds             = 90
   207    max_message_size          = 2048
   208    message_retention_seconds = 86400
   209    receive_wait_time_seconds = 10
   210  }
   211  
   212  resource "aws_iam_role" "foobar" {
   213    name = "foobar-%d"
   214  
   215    assume_role_policy = <<EOF
   216  {
   217    "Version" : "2012-10-17",
   218    "Statement": [ {
   219      "Effect": "Allow",
   220      "Principal": {"AWS": "*"},
   221      "Action": [ "sts:AssumeRole" ]
   222    } ]
   223  }
   224  EOF
   225  }
   226  
   227  resource "aws_iam_role_policy" "foobar" {
   228    name = "foobar"
   229    role = "${aws_iam_role.foobar.id}"
   230  
   231    policy = <<EOF
   232  {
   233      "Version" : "2012-10-17",
   234      "Statement": [ {
   235        "Effect": "Allow",
   236        "Action": [
   237  	"sqs:SendMessage",
   238  	"sqs:GetQueueUrl",
   239  	"sns:Publish"
   240        ],
   241        "Resource": [
   242  	"${aws_sqs_queue.foobar.arn}"
   243        ]
   244      } ]
   245  }
   246  EOF
   247  }
   248  
   249  resource "aws_autoscaling_group" "foobar" {
   250    availability_zones        = ["us-west-2a"]
   251    name                      = "%s"
   252    max_size                  = 5
   253    min_size                  = 2
   254    health_check_grace_period = 300
   255    health_check_type         = "ELB"
   256    force_delete              = true
   257    termination_policies      = ["OldestInstance"]
   258    launch_configuration      = "${aws_launch_configuration.foobar.name}"
   259  
   260    tag {
   261      key                 = "Foo"
   262      value               = "foo-bar"
   263      propagate_at_launch = true
   264    }
   265  }
   266  
   267  resource "aws_autoscaling_lifecycle_hook" "foobar" {
   268    name                   = "foobar"
   269    autoscaling_group_name = "${aws_autoscaling_group.foobar.name}"
   270    heartbeat_timeout      = 2000
   271    lifecycle_transition   = "autoscaling:EC2_INSTANCE_LAUNCHING"
   272  
   273    notification_metadata = <<EOF
   274  {
   275    "foo": "bar"
   276  }
   277  EOF
   278  
   279    notification_target_arn = "${aws_sqs_queue.foobar.arn}"
   280    role_arn                = "${aws_iam_role.foobar.arn}"
   281  }`, name, rInt, name)
   282  }