github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_alb_target_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"regexp"
     7  	"testing"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  	"github.com/aws/aws-sdk-go/service/elbv2"
    11  	"github.com/hashicorp/errwrap"
    12  	"github.com/hashicorp/terraform/helper/acctest"
    13  	"github.com/hashicorp/terraform/helper/resource"
    14  	"github.com/hashicorp/terraform/terraform"
    15  )
    16  
    17  func TestALBTargetGroupCloudwatchSuffixFromARN(t *testing.T) {
    18  	cases := []struct {
    19  		name   string
    20  		arn    *string
    21  		suffix string
    22  	}{
    23  		{
    24  			name:   "valid suffix",
    25  			arn:    aws.String(`arn:aws:elasticloadbalancing:us-east-1:123456:targetgroup/my-targets/73e2d6bc24d8a067`),
    26  			suffix: `targetgroup/my-targets/73e2d6bc24d8a067`,
    27  		},
    28  		{
    29  			name:   "no suffix",
    30  			arn:    aws.String(`arn:aws:elasticloadbalancing:us-east-1:123456:targetgroup`),
    31  			suffix: ``,
    32  		},
    33  		{
    34  			name:   "nil ARN",
    35  			arn:    nil,
    36  			suffix: ``,
    37  		},
    38  	}
    39  
    40  	for _, tc := range cases {
    41  		actual := albTargetGroupSuffixFromARN(tc.arn)
    42  		if actual != tc.suffix {
    43  			t.Fatalf("bad suffix: %q\nExpected: %s\n     Got: %s", tc.name, tc.suffix, actual)
    44  		}
    45  	}
    46  }
    47  
    48  func TestAccAWSALBTargetGroup_basic(t *testing.T) {
    49  	var conf elbv2.TargetGroup
    50  	targetGroupName := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
    51  
    52  	resource.Test(t, resource.TestCase{
    53  		PreCheck:      func() { testAccPreCheck(t) },
    54  		IDRefreshName: "aws_alb_target_group.test",
    55  		Providers:     testAccProviders,
    56  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
    57  		Steps: []resource.TestStep{
    58  			{
    59  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupName),
    60  				Check: resource.ComposeAggregateTestCheckFunc(
    61  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
    62  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "arn"),
    63  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupName),
    64  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "443"),
    65  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTPS"),
    66  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "vpc_id"),
    67  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "deregistration_delay", "200"),
    68  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.#", "1"),
    69  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.enabled", "true"),
    70  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.type", "lb_cookie"),
    71  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.cookie_duration", "10000"),
    72  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.#", "1"),
    73  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.path", "/health"),
    74  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.interval", "60"),
    75  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.port", "8081"),
    76  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.protocol", "HTTP"),
    77  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.timeout", "3"),
    78  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.healthy_threshold", "3"),
    79  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.unhealthy_threshold", "3"),
    80  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.matcher", "200-299"),
    81  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "tags.%", "1"),
    82  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "tags.TestName", "TestAccAWSALBTargetGroup_basic"),
    83  				),
    84  			},
    85  		},
    86  	})
    87  }
    88  
    89  func TestAccAWSALBTargetGroup_namePrefix(t *testing.T) {
    90  	var conf elbv2.TargetGroup
    91  
    92  	resource.Test(t, resource.TestCase{
    93  		PreCheck:      func() { testAccPreCheck(t) },
    94  		IDRefreshName: "aws_alb_target_group.test",
    95  		Providers:     testAccProviders,
    96  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
    97  		Steps: []resource.TestStep{
    98  			{
    99  				Config: testAccAWSALBTargetGroupConfig_namePrefix,
   100  				Check: resource.ComposeTestCheckFunc(
   101  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   102  					resource.TestMatchResourceAttr("aws_alb_target_group.test", "name", regexp.MustCompile("^tf-")),
   103  				),
   104  			},
   105  		},
   106  	})
   107  }
   108  
   109  func TestAccAWSALBTargetGroup_generatedName(t *testing.T) {
   110  	var conf elbv2.TargetGroup
   111  
   112  	resource.Test(t, resource.TestCase{
   113  		PreCheck:      func() { testAccPreCheck(t) },
   114  		IDRefreshName: "aws_alb_target_group.test",
   115  		Providers:     testAccProviders,
   116  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   117  		Steps: []resource.TestStep{
   118  			{
   119  				Config: testAccAWSALBTargetGroupConfig_generatedName,
   120  				Check: resource.ComposeTestCheckFunc(
   121  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   122  				),
   123  			},
   124  		},
   125  	})
   126  }
   127  
   128  func TestAccAWSALBTargetGroup_changeNameForceNew(t *testing.T) {
   129  	var before, after elbv2.TargetGroup
   130  	targetGroupNameBefore := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
   131  	targetGroupNameAfter := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(4, acctest.CharSetAlphaNum))
   132  
   133  	resource.Test(t, resource.TestCase{
   134  		PreCheck:      func() { testAccPreCheck(t) },
   135  		IDRefreshName: "aws_alb_target_group.test",
   136  		Providers:     testAccProviders,
   137  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   138  		Steps: []resource.TestStep{
   139  			{
   140  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupNameBefore),
   141  				Check: resource.ComposeAggregateTestCheckFunc(
   142  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &before),
   143  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupNameBefore),
   144  				),
   145  			},
   146  			{
   147  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupNameAfter),
   148  				Check: resource.ComposeAggregateTestCheckFunc(
   149  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &after),
   150  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupNameAfter),
   151  				),
   152  			},
   153  		},
   154  	})
   155  }
   156  
   157  func TestAccAWSALBTargetGroup_changeProtocolForceNew(t *testing.T) {
   158  	var before, after elbv2.TargetGroup
   159  	targetGroupName := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
   160  
   161  	resource.Test(t, resource.TestCase{
   162  		PreCheck:      func() { testAccPreCheck(t) },
   163  		IDRefreshName: "aws_alb_target_group.test",
   164  		Providers:     testAccProviders,
   165  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   166  		Steps: []resource.TestStep{
   167  			{
   168  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupName),
   169  				Check: resource.ComposeAggregateTestCheckFunc(
   170  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &before),
   171  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTPS"),
   172  				),
   173  			},
   174  			{
   175  				Config: testAccAWSALBTargetGroupConfig_updatedProtocol(targetGroupName),
   176  				Check: resource.ComposeAggregateTestCheckFunc(
   177  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &after),
   178  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTP"),
   179  				),
   180  			},
   181  		},
   182  	})
   183  }
   184  
   185  func TestAccAWSALBTargetGroup_changePortForceNew(t *testing.T) {
   186  	var before, after elbv2.TargetGroup
   187  	targetGroupName := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
   188  
   189  	resource.Test(t, resource.TestCase{
   190  		PreCheck:      func() { testAccPreCheck(t) },
   191  		IDRefreshName: "aws_alb_target_group.test",
   192  		Providers:     testAccProviders,
   193  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   194  		Steps: []resource.TestStep{
   195  			{
   196  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupName),
   197  				Check: resource.ComposeAggregateTestCheckFunc(
   198  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &before),
   199  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "443"),
   200  				),
   201  			},
   202  			{
   203  				Config: testAccAWSALBTargetGroupConfig_updatedPort(targetGroupName),
   204  				Check: resource.ComposeAggregateTestCheckFunc(
   205  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &after),
   206  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "442"),
   207  				),
   208  			},
   209  		},
   210  	})
   211  }
   212  
   213  func TestAccAWSALBTargetGroup_changeVpcForceNew(t *testing.T) {
   214  	var before, after elbv2.TargetGroup
   215  	targetGroupName := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
   216  
   217  	resource.Test(t, resource.TestCase{
   218  		PreCheck:      func() { testAccPreCheck(t) },
   219  		IDRefreshName: "aws_alb_target_group.test",
   220  		Providers:     testAccProviders,
   221  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   222  		Steps: []resource.TestStep{
   223  			{
   224  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupName),
   225  				Check: resource.ComposeAggregateTestCheckFunc(
   226  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &before),
   227  				),
   228  			},
   229  			{
   230  				Config: testAccAWSALBTargetGroupConfig_updatedVpc(targetGroupName),
   231  				Check: resource.ComposeAggregateTestCheckFunc(
   232  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &after),
   233  				),
   234  			},
   235  		},
   236  	})
   237  }
   238  
   239  func TestAccAWSALBTargetGroup_tags(t *testing.T) {
   240  	var conf elbv2.TargetGroup
   241  	targetGroupName := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
   242  
   243  	resource.Test(t, resource.TestCase{
   244  		PreCheck:      func() { testAccPreCheck(t) },
   245  		IDRefreshName: "aws_alb_target_group.test",
   246  		Providers:     testAccProviders,
   247  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   248  		Steps: []resource.TestStep{
   249  			{
   250  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupName),
   251  				Check: resource.ComposeAggregateTestCheckFunc(
   252  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   253  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "tags.%", "1"),
   254  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "tags.TestName", "TestAccAWSALBTargetGroup_basic"),
   255  				),
   256  			},
   257  			{
   258  				Config: testAccAWSALBTargetGroupConfig_updateTags(targetGroupName),
   259  				Check: resource.ComposeAggregateTestCheckFunc(
   260  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   261  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "tags.%", "2"),
   262  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "tags.Environment", "Production"),
   263  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "tags.Type", "ALB Target Group"),
   264  				),
   265  			},
   266  		},
   267  	})
   268  }
   269  
   270  func TestAccAWSALBTargetGroup_updateHealthCheck(t *testing.T) {
   271  	var conf elbv2.TargetGroup
   272  	targetGroupName := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
   273  
   274  	resource.Test(t, resource.TestCase{
   275  		PreCheck:      func() { testAccPreCheck(t) },
   276  		IDRefreshName: "aws_alb_target_group.test",
   277  		Providers:     testAccProviders,
   278  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   279  		Steps: []resource.TestStep{
   280  			{
   281  				Config: testAccAWSALBTargetGroupConfig_basic(targetGroupName),
   282  				Check: resource.ComposeAggregateTestCheckFunc(
   283  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   284  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "arn"),
   285  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupName),
   286  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "443"),
   287  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTPS"),
   288  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "vpc_id"),
   289  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "deregistration_delay", "200"),
   290  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.#", "1"),
   291  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.type", "lb_cookie"),
   292  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.cookie_duration", "10000"),
   293  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.#", "1"),
   294  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.path", "/health"),
   295  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.interval", "60"),
   296  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.port", "8081"),
   297  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.protocol", "HTTP"),
   298  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.timeout", "3"),
   299  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.healthy_threshold", "3"),
   300  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.unhealthy_threshold", "3"),
   301  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.matcher", "200-299"),
   302  				),
   303  			},
   304  			{
   305  				Config: testAccAWSALBTargetGroupConfig_updateHealthCheck(targetGroupName),
   306  				Check: resource.ComposeAggregateTestCheckFunc(
   307  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   308  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "arn"),
   309  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupName),
   310  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "443"),
   311  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTPS"),
   312  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "vpc_id"),
   313  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "deregistration_delay", "200"),
   314  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.#", "1"),
   315  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.type", "lb_cookie"),
   316  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.cookie_duration", "10000"),
   317  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.#", "1"),
   318  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.path", "/health2"),
   319  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.interval", "30"),
   320  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.port", "8082"),
   321  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.protocol", "HTTPS"),
   322  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.timeout", "4"),
   323  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.healthy_threshold", "4"),
   324  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.unhealthy_threshold", "4"),
   325  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.matcher", "200"),
   326  				),
   327  			},
   328  		},
   329  	})
   330  }
   331  
   332  func TestAccAWSALBTargetGroup_updateSticknessEnabled(t *testing.T) {
   333  	var conf elbv2.TargetGroup
   334  	targetGroupName := fmt.Sprintf("test-target-group-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
   335  
   336  	resource.Test(t, resource.TestCase{
   337  		PreCheck:      func() { testAccPreCheck(t) },
   338  		IDRefreshName: "aws_alb_target_group.test",
   339  		Providers:     testAccProviders,
   340  		CheckDestroy:  testAccCheckAWSALBTargetGroupDestroy,
   341  		Steps: []resource.TestStep{
   342  			{
   343  				Config: testAccAWSALBTargetGroupConfig_stickiness(targetGroupName, false, false),
   344  				Check: resource.ComposeAggregateTestCheckFunc(
   345  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   346  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "arn"),
   347  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupName),
   348  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "443"),
   349  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTPS"),
   350  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "vpc_id"),
   351  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "deregistration_delay", "200"),
   352  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.#", "1"),
   353  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.path", "/health2"),
   354  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.interval", "30"),
   355  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.port", "8082"),
   356  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.protocol", "HTTPS"),
   357  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.timeout", "4"),
   358  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.healthy_threshold", "4"),
   359  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.unhealthy_threshold", "4"),
   360  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.matcher", "200"),
   361  				),
   362  			},
   363  			{
   364  				Config: testAccAWSALBTargetGroupConfig_stickiness(targetGroupName, true, true),
   365  				Check: resource.ComposeAggregateTestCheckFunc(
   366  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   367  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "arn"),
   368  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupName),
   369  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "443"),
   370  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTPS"),
   371  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "vpc_id"),
   372  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "deregistration_delay", "200"),
   373  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.#", "1"),
   374  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.enabled", "true"),
   375  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.type", "lb_cookie"),
   376  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.cookie_duration", "10000"),
   377  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.#", "1"),
   378  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.path", "/health2"),
   379  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.interval", "30"),
   380  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.port", "8082"),
   381  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.protocol", "HTTPS"),
   382  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.timeout", "4"),
   383  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.healthy_threshold", "4"),
   384  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.unhealthy_threshold", "4"),
   385  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.matcher", "200"),
   386  				),
   387  			},
   388  			{
   389  				Config: testAccAWSALBTargetGroupConfig_stickiness(targetGroupName, true, false),
   390  				Check: resource.ComposeAggregateTestCheckFunc(
   391  					testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &conf),
   392  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "arn"),
   393  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "name", targetGroupName),
   394  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "port", "443"),
   395  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "protocol", "HTTPS"),
   396  					resource.TestCheckResourceAttrSet("aws_alb_target_group.test", "vpc_id"),
   397  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "deregistration_delay", "200"),
   398  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.#", "1"),
   399  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.enabled", "false"),
   400  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.type", "lb_cookie"),
   401  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "stickiness.0.cookie_duration", "10000"),
   402  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.#", "1"),
   403  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.path", "/health2"),
   404  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.interval", "30"),
   405  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.port", "8082"),
   406  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.protocol", "HTTPS"),
   407  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.timeout", "4"),
   408  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.healthy_threshold", "4"),
   409  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.unhealthy_threshold", "4"),
   410  					resource.TestCheckResourceAttr("aws_alb_target_group.test", "health_check.0.matcher", "200"),
   411  				),
   412  			},
   413  		},
   414  	})
   415  }
   416  
   417  func testAccCheckAWSALBTargetGroupExists(n string, res *elbv2.TargetGroup) resource.TestCheckFunc {
   418  	return func(s *terraform.State) error {
   419  		rs, ok := s.RootModule().Resources[n]
   420  		if !ok {
   421  			return fmt.Errorf("Not found: %s", n)
   422  		}
   423  
   424  		if rs.Primary.ID == "" {
   425  			return errors.New("No Target Group ID is set")
   426  		}
   427  
   428  		conn := testAccProvider.Meta().(*AWSClient).elbv2conn
   429  
   430  		describe, err := conn.DescribeTargetGroups(&elbv2.DescribeTargetGroupsInput{
   431  			TargetGroupArns: []*string{aws.String(rs.Primary.ID)},
   432  		})
   433  
   434  		if err != nil {
   435  			return err
   436  		}
   437  
   438  		if len(describe.TargetGroups) != 1 ||
   439  			*describe.TargetGroups[0].TargetGroupArn != rs.Primary.ID {
   440  			return errors.New("Target Group not found")
   441  		}
   442  
   443  		*res = *describe.TargetGroups[0]
   444  		return nil
   445  	}
   446  }
   447  
   448  func testAccCheckAWSALBTargetGroupDestroy(s *terraform.State) error {
   449  	conn := testAccProvider.Meta().(*AWSClient).elbv2conn
   450  
   451  	for _, rs := range s.RootModule().Resources {
   452  		if rs.Type != "aws_alb_target_group" {
   453  			continue
   454  		}
   455  
   456  		describe, err := conn.DescribeTargetGroups(&elbv2.DescribeTargetGroupsInput{
   457  			TargetGroupArns: []*string{aws.String(rs.Primary.ID)},
   458  		})
   459  
   460  		if err == nil {
   461  			if len(describe.TargetGroups) != 0 &&
   462  				*describe.TargetGroups[0].TargetGroupArn == rs.Primary.ID {
   463  				return fmt.Errorf("Target Group %q still exists", rs.Primary.ID)
   464  			}
   465  		}
   466  
   467  		// Verify the error
   468  		if isTargetGroupNotFound(err) {
   469  			return nil
   470  		} else {
   471  			return errwrap.Wrapf("Unexpected error checking ALB destroyed: {{err}}", err)
   472  		}
   473  	}
   474  
   475  	return nil
   476  }
   477  
   478  func testAccAWSALBTargetGroupConfig_basic(targetGroupName string) string {
   479  	return fmt.Sprintf(`resource "aws_alb_target_group" "test" {
   480    name = "%s"
   481    port = 443
   482    protocol = "HTTPS"
   483    vpc_id = "${aws_vpc.test.id}"
   484  
   485    deregistration_delay = 200
   486  
   487    stickiness {
   488      type = "lb_cookie"
   489      cookie_duration = 10000
   490    }
   491  
   492    health_check {
   493      path = "/health"
   494      interval = 60
   495      port = 8081
   496      protocol = "HTTP"
   497      timeout = 3
   498      healthy_threshold = 3
   499      unhealthy_threshold = 3
   500      matcher = "200-299"
   501    }
   502  
   503    tags {
   504      TestName = "TestAccAWSALBTargetGroup_basic"
   505    }
   506  }
   507  
   508  resource "aws_vpc" "test" {
   509    cidr_block = "10.0.0.0/16"
   510  
   511    tags {
   512      TestName = "TestAccAWSALBTargetGroup_basic"
   513    }
   514  }`, targetGroupName)
   515  }
   516  
   517  func testAccAWSALBTargetGroupConfig_updatedPort(targetGroupName string) string {
   518  	return fmt.Sprintf(`resource "aws_alb_target_group" "test" {
   519    name = "%s"
   520    port = 442
   521    protocol = "HTTPS"
   522    vpc_id = "${aws_vpc.test.id}"
   523  
   524    deregistration_delay = 200
   525  
   526    stickiness {
   527      type = "lb_cookie"
   528      cookie_duration = 10000
   529    }
   530  
   531    health_check {
   532      path = "/health"
   533      interval = 60
   534      port = 8081
   535      protocol = "HTTP"
   536      timeout = 3
   537      healthy_threshold = 3
   538      unhealthy_threshold = 3
   539      matcher = "200-299"
   540    }
   541  
   542    tags {
   543      TestName = "TestAccAWSALBTargetGroup_basic"
   544    }
   545  }
   546  
   547  resource "aws_vpc" "test" {
   548    cidr_block = "10.0.0.0/16"
   549  
   550    tags {
   551      TestName = "TestAccAWSALBTargetGroup_basic"
   552    }
   553  }`, targetGroupName)
   554  }
   555  
   556  func testAccAWSALBTargetGroupConfig_updatedProtocol(targetGroupName string) string {
   557  	return fmt.Sprintf(`resource "aws_alb_target_group" "test" {
   558    name = "%s"
   559    port = 443
   560    protocol = "HTTP"
   561    vpc_id = "${aws_vpc.test2.id}"
   562  
   563    deregistration_delay = 200
   564  
   565    stickiness {
   566      type = "lb_cookie"
   567      cookie_duration = 10000
   568    }
   569  
   570    health_check {
   571      path = "/health"
   572      interval = 60
   573      port = 8081
   574      protocol = "HTTP"
   575      timeout = 3
   576      healthy_threshold = 3
   577      unhealthy_threshold = 3
   578      matcher = "200-299"
   579    }
   580  
   581    tags {
   582      TestName = "TestAccAWSALBTargetGroup_basic"
   583    }
   584  }
   585  
   586  resource "aws_vpc" "test2" {
   587    cidr_block = "10.10.0.0/16"
   588  
   589    tags {
   590      TestName = "TestAccAWSALBTargetGroup_basic"
   591    }
   592  }
   593  
   594  resource "aws_vpc" "test" {
   595    cidr_block = "10.0.0.0/16"
   596  
   597    tags {
   598      TestName = "TestAccAWSALBTargetGroup_basic"
   599    }
   600  }`, targetGroupName)
   601  }
   602  
   603  func testAccAWSALBTargetGroupConfig_updatedVpc(targetGroupName string) string {
   604  	return fmt.Sprintf(`resource "aws_alb_target_group" "test" {
   605    name = "%s"
   606    port = 443
   607    protocol = "HTTPS"
   608    vpc_id = "${aws_vpc.test.id}"
   609  
   610    deregistration_delay = 200
   611  
   612    stickiness {
   613      type = "lb_cookie"
   614      cookie_duration = 10000
   615    }
   616  
   617    health_check {
   618      path = "/health"
   619      interval = 60
   620      port = 8081
   621      protocol = "HTTP"
   622      timeout = 3
   623      healthy_threshold = 3
   624      unhealthy_threshold = 3
   625      matcher = "200-299"
   626    }
   627  
   628    tags {
   629      TestName = "TestAccAWSALBTargetGroup_basic"
   630    }
   631  }
   632  
   633  resource "aws_vpc" "test" {
   634    cidr_block = "10.0.0.0/16"
   635  
   636    tags {
   637      TestName = "TestAccAWSALBTargetGroup_basic"
   638    }
   639  }`, targetGroupName)
   640  }
   641  
   642  func testAccAWSALBTargetGroupConfig_updateTags(targetGroupName string) string {
   643  	return fmt.Sprintf(`resource "aws_alb_target_group" "test" {
   644    name = "%s"
   645    port = 443
   646    protocol = "HTTPS"
   647    vpc_id = "${aws_vpc.test.id}"
   648  
   649    deregistration_delay = 200
   650  
   651    stickiness {
   652      type = "lb_cookie"
   653      cookie_duration = 10000
   654    }
   655  
   656    health_check {
   657      path = "/health"
   658      interval = 60
   659      port = 8081
   660      protocol = "HTTP"
   661      timeout = 3
   662      healthy_threshold = 3
   663      unhealthy_threshold = 3
   664      matcher = "200-299"
   665    }
   666  
   667    tags {
   668      Environment = "Production"
   669      Type = "ALB Target Group"
   670    }
   671  }
   672  
   673  resource "aws_vpc" "test" {
   674    cidr_block = "10.0.0.0/16"
   675  
   676    tags {
   677      TestName = "TestAccAWSALBTargetGroup_basic"
   678    }
   679  }`, targetGroupName)
   680  }
   681  
   682  func testAccAWSALBTargetGroupConfig_updateHealthCheck(targetGroupName string) string {
   683  	return fmt.Sprintf(`resource "aws_alb_target_group" "test" {
   684    name = "%s"
   685    port = 443
   686    protocol = "HTTPS"
   687    vpc_id = "${aws_vpc.test.id}"
   688  
   689    deregistration_delay = 200
   690  
   691    stickiness {
   692      type = "lb_cookie"
   693      cookie_duration = 10000
   694    }
   695  
   696    health_check {
   697      path = "/health2"
   698      interval = 30
   699      port = 8082
   700      protocol = "HTTPS"
   701      timeout = 4
   702      healthy_threshold = 4
   703      unhealthy_threshold = 4
   704      matcher = "200"
   705    }
   706  }
   707  
   708  resource "aws_vpc" "test" {
   709    cidr_block = "10.0.0.0/16"
   710  
   711    tags {
   712      TestName = "TestAccAWSALBTargetGroup_basic"
   713    }
   714  }`, targetGroupName)
   715  }
   716  
   717  func testAccAWSALBTargetGroupConfig_stickiness(targetGroupName string, addStickinessBlock bool, enabled bool) string {
   718  	var stickinessBlock string
   719  
   720  	if addStickinessBlock {
   721  		stickinessBlock = fmt.Sprintf(`stickiness {
   722  	    enabled = "%t"
   723  	    type = "lb_cookie"
   724  	    cookie_duration = 10000
   725  	  }`, enabled)
   726  	}
   727  
   728  	return fmt.Sprintf(`resource "aws_alb_target_group" "test" {
   729    name = "%s"
   730    port = 443
   731    protocol = "HTTPS"
   732    vpc_id = "${aws_vpc.test.id}"
   733  
   734    deregistration_delay = 200
   735  
   736    %s
   737  
   738    health_check {
   739      path = "/health2"
   740      interval = 30
   741      port = 8082
   742      protocol = "HTTPS"
   743      timeout = 4
   744      healthy_threshold = 4
   745      unhealthy_threshold = 4
   746      matcher = "200"
   747    }
   748  }
   749  
   750  resource "aws_vpc" "test" {
   751    cidr_block = "10.0.0.0/16"
   752  
   753    tags {
   754      TestName = "TestAccAWSALBTargetGroup_stickiness"
   755    }
   756  }`, targetGroupName, stickinessBlock)
   757  }
   758  
   759  const testAccAWSALBTargetGroupConfig_namePrefix = `
   760  resource "aws_alb_target_group" "test" {
   761    name_prefix = "tf-"
   762    port = 80
   763    protocol = "HTTP"
   764    vpc_id = "${aws_vpc.test.id}"
   765  }
   766  
   767  resource "aws_vpc" "test" {
   768    cidr_block = "10.0.0.0/16"
   769  }
   770  `
   771  
   772  const testAccAWSALBTargetGroupConfig_generatedName = `
   773  resource "aws_alb_target_group" "test" {
   774    port = 80
   775    protocol = "HTTP"
   776    vpc_id = "${aws_vpc.test.id}"
   777  }
   778  
   779  resource "aws_vpc" "test" {
   780    cidr_block = "10.0.0.0/16"
   781  }
   782  `