github.com/ottenhoff/terraform@v0.7.0-rc1.0.20160607213102-ac2d195cc560/builtin/providers/aws/resource_aws_codedeploy_deployment_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"regexp"
     7  	"sort"
     8  	"testing"
     9  
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/aws/aws-sdk-go/aws/awserr"
    12  	"github.com/aws/aws-sdk-go/service/codedeploy"
    13  	"github.com/hashicorp/terraform/helper/resource"
    14  	"github.com/hashicorp/terraform/helper/schema"
    15  	"github.com/hashicorp/terraform/terraform"
    16  )
    17  
    18  func TestAccAWSCodeDeployDeploymentGroup_basic(t *testing.T) {
    19  	var group codedeploy.DeploymentGroupInfo
    20  
    21  	resource.Test(t, resource.TestCase{
    22  		PreCheck:     func() { testAccPreCheck(t) },
    23  		Providers:    testAccProviders,
    24  		CheckDestroy: testAccCheckAWSCodeDeployDeploymentGroupDestroy,
    25  		Steps: []resource.TestStep{
    26  			resource.TestStep{
    27  				Config: testAccAWSCodeDeployDeploymentGroup,
    28  				Check: resource.ComposeTestCheckFunc(
    29  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo", &group),
    30  					resource.TestCheckResourceAttr(
    31  						"aws_codedeploy_deployment_group.foo", "app_name", "foo_app"),
    32  					resource.TestCheckResourceAttr(
    33  						"aws_codedeploy_deployment_group.foo", "deployment_group_name", "foo"),
    34  					resource.TestCheckResourceAttr(
    35  						"aws_codedeploy_deployment_group.foo", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
    36  
    37  					resource.TestCheckResourceAttr(
    38  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.#", "1"),
    39  					resource.TestCheckResourceAttr(
    40  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2916377465.key", "filterkey"),
    41  					resource.TestCheckResourceAttr(
    42  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2916377465.type", "KEY_AND_VALUE"),
    43  					resource.TestCheckResourceAttr(
    44  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2916377465.value", "filtervalue"),
    45  				),
    46  			},
    47  			resource.TestStep{
    48  				Config: testAccAWSCodeDeployDeploymentGroupModified,
    49  				Check: resource.ComposeTestCheckFunc(
    50  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo", &group),
    51  					resource.TestCheckResourceAttr(
    52  						"aws_codedeploy_deployment_group.foo", "app_name", "foo_app"),
    53  					resource.TestCheckResourceAttr(
    54  						"aws_codedeploy_deployment_group.foo", "deployment_group_name", "bar"),
    55  					resource.TestCheckResourceAttr(
    56  						"aws_codedeploy_deployment_group.foo", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
    57  
    58  					resource.TestCheckResourceAttr(
    59  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.#", "1"),
    60  					resource.TestCheckResourceAttr(
    61  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2369538975.key", "filterkey"),
    62  					resource.TestCheckResourceAttr(
    63  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2369538975.type", "KEY_AND_VALUE"),
    64  					resource.TestCheckResourceAttr(
    65  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2369538975.value", "anotherfiltervalue"),
    66  				),
    67  			},
    68  		},
    69  	})
    70  }
    71  
    72  func TestAccAWSCodeDeployDeploymentGroup_onPremiseTag(t *testing.T) {
    73  	var group codedeploy.DeploymentGroupInfo
    74  
    75  	resource.Test(t, resource.TestCase{
    76  		PreCheck:     func() { testAccPreCheck(t) },
    77  		Providers:    testAccProviders,
    78  		CheckDestroy: testAccCheckAWSCodeDeployDeploymentGroupDestroy,
    79  		Steps: []resource.TestStep{
    80  			resource.TestStep{
    81  				Config: testAccAWSCodeDeployDeploymentGroupOnPremiseTags,
    82  				Check: resource.ComposeTestCheckFunc(
    83  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo", &group),
    84  					resource.TestCheckResourceAttr(
    85  						"aws_codedeploy_deployment_group.foo", "app_name", "foo_app"),
    86  					resource.TestCheckResourceAttr(
    87  						"aws_codedeploy_deployment_group.foo", "deployment_group_name", "foo"),
    88  					resource.TestCheckResourceAttr(
    89  						"aws_codedeploy_deployment_group.foo", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
    90  
    91  					resource.TestCheckResourceAttr(
    92  						"aws_codedeploy_deployment_group.foo", "on_premises_instance_tag_filter.#", "1"),
    93  					resource.TestCheckResourceAttr(
    94  						"aws_codedeploy_deployment_group.foo", "on_premises_instance_tag_filter.2916377465.key", "filterkey"),
    95  					resource.TestCheckResourceAttr(
    96  						"aws_codedeploy_deployment_group.foo", "on_premises_instance_tag_filter.2916377465.type", "KEY_AND_VALUE"),
    97  					resource.TestCheckResourceAttr(
    98  						"aws_codedeploy_deployment_group.foo", "on_premises_instance_tag_filter.2916377465.value", "filtervalue"),
    99  				),
   100  			},
   101  		},
   102  	})
   103  }
   104  
   105  func TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic(t *testing.T) {
   106  	var group codedeploy.DeploymentGroupInfo
   107  
   108  	resource.Test(t, resource.TestCase{
   109  		PreCheck:     func() { testAccPreCheck(t) },
   110  		Providers:    testAccProviders,
   111  		CheckDestroy: testAccCheckAWSCodeDeployDeploymentGroupDestroy,
   112  		Steps: []resource.TestStep{
   113  			resource.TestStep{
   114  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_create,
   115  				Check: resource.ComposeTestCheckFunc(
   116  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group", &group),
   117  					resource.TestCheckResourceAttr(
   118  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
   119  					resource.TestCheckResourceAttr(
   120  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
   121  					testAccCheckTriggerEvents(&group, "foo-trigger", []string{
   122  						"DeploymentFailure",
   123  					}),
   124  				),
   125  			},
   126  			resource.TestStep{
   127  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_update,
   128  				Check: resource.ComposeTestCheckFunc(
   129  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group", &group),
   130  					resource.TestCheckResourceAttr(
   131  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
   132  					resource.TestCheckResourceAttr(
   133  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
   134  					testAccCheckTriggerEvents(&group, "foo-trigger", []string{
   135  						"DeploymentFailure",
   136  						"DeploymentSuccess",
   137  					}),
   138  				),
   139  			},
   140  		},
   141  	})
   142  }
   143  
   144  func TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple(t *testing.T) {
   145  	var group codedeploy.DeploymentGroupInfo
   146  
   147  	resource.Test(t, resource.TestCase{
   148  		PreCheck:     func() { testAccPreCheck(t) },
   149  		Providers:    testAccProviders,
   150  		CheckDestroy: testAccCheckAWSCodeDeployDeploymentGroupDestroy,
   151  		Steps: []resource.TestStep{
   152  			resource.TestStep{
   153  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_createMultiple,
   154  				Check: resource.ComposeTestCheckFunc(
   155  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group", &group),
   156  					resource.TestCheckResourceAttr(
   157  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
   158  					resource.TestCheckResourceAttr(
   159  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
   160  					testAccCheckTriggerEvents(&group, "foo-trigger", []string{
   161  						"DeploymentFailure",
   162  					}),
   163  					testAccCheckTriggerEvents(&group, "bar-trigger", []string{
   164  						"InstanceFailure",
   165  					}),
   166  					testAccCheckTriggerTargetArn(&group, "bar-trigger",
   167  						regexp.MustCompile("^arn:aws:sns:[^:]+:[0-9]{12}:bar-topic$")),
   168  				),
   169  			},
   170  			resource.TestStep{
   171  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_updateMultiple,
   172  				Check: resource.ComposeTestCheckFunc(
   173  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group", &group),
   174  					resource.TestCheckResourceAttr(
   175  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
   176  					resource.TestCheckResourceAttr(
   177  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
   178  					testAccCheckTriggerEvents(&group, "foo-trigger", []string{
   179  						"DeploymentFailure",
   180  						"DeploymentStart",
   181  						"DeploymentStop",
   182  						"DeploymentSuccess",
   183  					}),
   184  					testAccCheckTriggerEvents(&group, "bar-trigger", []string{
   185  						"InstanceFailure",
   186  					}),
   187  					testAccCheckTriggerTargetArn(&group, "bar-trigger",
   188  						regexp.MustCompile("^arn:aws:sns:[^:]+:[0-9]{12}:baz-topic$")),
   189  				),
   190  			},
   191  		},
   192  	})
   193  }
   194  
   195  func TestValidateAWSCodeDeployTriggerEvent(t *testing.T) {
   196  	cases := []struct {
   197  		Value    string
   198  		ErrCount int
   199  	}{
   200  		{
   201  			Value:    "DeploymentStart",
   202  			ErrCount: 0,
   203  		},
   204  		{
   205  			Value:    "DeploymentStop",
   206  			ErrCount: 0,
   207  		},
   208  		{
   209  			Value:    "DeploymentSuccess",
   210  			ErrCount: 0,
   211  		},
   212  		{
   213  			Value:    "DeploymentFailure",
   214  			ErrCount: 0,
   215  		},
   216  		{
   217  			Value:    "InstanceStart",
   218  			ErrCount: 0,
   219  		},
   220  		{
   221  			Value:    "InstanceSuccess",
   222  			ErrCount: 0,
   223  		},
   224  		{
   225  			Value:    "InstanceFailure",
   226  			ErrCount: 0,
   227  		},
   228  		{
   229  			Value:    "DeploymentStarts",
   230  			ErrCount: 1,
   231  		},
   232  		{
   233  			Value:    "InstanceFail",
   234  			ErrCount: 1,
   235  		},
   236  		{
   237  			Value:    "Foo",
   238  			ErrCount: 1,
   239  		},
   240  		{
   241  			Value:    "",
   242  			ErrCount: 1,
   243  		},
   244  	}
   245  
   246  	for _, tc := range cases {
   247  		_, errors := validateTriggerEvent(tc.Value, "trigger_event")
   248  		if len(errors) != tc.ErrCount {
   249  			t.Fatalf("Trigger event validation failed for event type %q: %q", tc.Value, errors)
   250  		}
   251  	}
   252  }
   253  
   254  func TestBuildTriggerConfigs(t *testing.T) {
   255  	input := []interface{}{
   256  		map[string]interface{}{
   257  			"trigger_events": schema.NewSet(schema.HashString, []interface{}{
   258  				"DeploymentFailure",
   259  			}),
   260  			"trigger_name":       "foo-trigger",
   261  			"trigger_target_arn": "arn:aws:sns:us-west-2:123456789012:foo-topic",
   262  		},
   263  	}
   264  
   265  	expected := []*codedeploy.TriggerConfig{
   266  		&codedeploy.TriggerConfig{
   267  			TriggerEvents: []*string{
   268  				aws.String("DeploymentFailure"),
   269  			},
   270  			TriggerName:      aws.String("foo-trigger"),
   271  			TriggerTargetArn: aws.String("arn:aws:sns:us-west-2:123456789012:foo-topic"),
   272  		},
   273  	}
   274  
   275  	actual := buildTriggerConfigs(input)
   276  
   277  	if !reflect.DeepEqual(actual, expected) {
   278  		t.Fatalf("buildTriggerConfigs output is not correct.\nGot:\n%#v\nExpected:\n%#v\n",
   279  			actual, expected)
   280  	}
   281  }
   282  
   283  func TestTriggerConfigsToMap(t *testing.T) {
   284  	input := []*codedeploy.TriggerConfig{
   285  		&codedeploy.TriggerConfig{
   286  			TriggerEvents: []*string{
   287  				aws.String("DeploymentFailure"),
   288  				aws.String("InstanceFailure"),
   289  			},
   290  			TriggerName:      aws.String("bar-trigger"),
   291  			TriggerTargetArn: aws.String("arn:aws:sns:us-west-2:123456789012:bar-topic"),
   292  		},
   293  	}
   294  
   295  	expected := map[string]interface{}{
   296  		"trigger_events": schema.NewSet(schema.HashString, []interface{}{
   297  			"DeploymentFailure",
   298  			"InstanceFailure",
   299  		}),
   300  		"trigger_name":       "bar-trigger",
   301  		"trigger_target_arn": "arn:aws:sns:us-west-2:123456789012:bar-topic",
   302  	}
   303  
   304  	actual := triggerConfigsToMap(input)[0]
   305  
   306  	fatal := false
   307  
   308  	if actual["trigger_name"] != expected["trigger_name"] {
   309  		fatal = true
   310  	}
   311  
   312  	if actual["trigger_target_arn"] != expected["trigger_target_arn"] {
   313  		fatal = true
   314  	}
   315  
   316  	actualEvents := actual["trigger_events"].(*schema.Set)
   317  	expectedEvents := expected["trigger_events"].(*schema.Set)
   318  	if !actualEvents.Equal(expectedEvents) {
   319  		fatal = true
   320  	}
   321  
   322  	if fatal {
   323  		t.Fatalf("triggerConfigsToMap output is not correct.\nGot:\n%#v\nExpected:\n%#v\n",
   324  			actual, expected)
   325  	}
   326  }
   327  
   328  func testAccCheckTriggerEvents(group *codedeploy.DeploymentGroupInfo, triggerName string, expectedEvents []string) resource.TestCheckFunc {
   329  	return func(s *terraform.State) error {
   330  
   331  		for _, actual := range group.TriggerConfigurations {
   332  			if *actual.TriggerName == triggerName {
   333  
   334  				numberOfEvents := len(actual.TriggerEvents)
   335  				if numberOfEvents != len(expectedEvents) {
   336  					return fmt.Errorf("Trigger events do not match. Expected: %d. Got: %d.",
   337  						len(expectedEvents), numberOfEvents)
   338  				}
   339  
   340  				actualEvents := make([]string, 0, numberOfEvents)
   341  				for _, event := range actual.TriggerEvents {
   342  					actualEvents = append(actualEvents, *event)
   343  				}
   344  				sort.Strings(actualEvents)
   345  
   346  				if !reflect.DeepEqual(actualEvents, expectedEvents) {
   347  					return fmt.Errorf("Trigger events do not match.\nExpected: %v\nGot: %v\n",
   348  						expectedEvents, actualEvents)
   349  				}
   350  				break
   351  			}
   352  		}
   353  		return nil
   354  	}
   355  }
   356  
   357  func testAccCheckTriggerTargetArn(group *codedeploy.DeploymentGroupInfo, triggerName string, r *regexp.Regexp) resource.TestCheckFunc {
   358  	return func(s *terraform.State) error {
   359  		for _, actual := range group.TriggerConfigurations {
   360  			if *actual.TriggerName == triggerName {
   361  				if !r.MatchString(*actual.TriggerTargetArn) {
   362  					return fmt.Errorf("Trigger target arn does not match regular expression.\nRegex: %v\nTriggerTargetArn: %v\n",
   363  						r, *actual.TriggerTargetArn)
   364  				}
   365  				break
   366  			}
   367  		}
   368  		return nil
   369  	}
   370  }
   371  
   372  func testAccCheckAWSCodeDeployDeploymentGroupDestroy(s *terraform.State) error {
   373  	conn := testAccProvider.Meta().(*AWSClient).codedeployconn
   374  
   375  	for _, rs := range s.RootModule().Resources {
   376  		if rs.Type != "aws_codedeploy_deployment_group" {
   377  			continue
   378  		}
   379  
   380  		resp, err := conn.GetDeploymentGroup(&codedeploy.GetDeploymentGroupInput{
   381  			ApplicationName:     aws.String(rs.Primary.Attributes["app_name"]),
   382  			DeploymentGroupName: aws.String(rs.Primary.Attributes["deployment_group_name"]),
   383  		})
   384  
   385  		if ae, ok := err.(awserr.Error); ok && ae.Code() == "ApplicationDoesNotExistException" {
   386  			continue
   387  		}
   388  
   389  		if err == nil {
   390  			if resp.DeploymentGroupInfo.DeploymentGroupName != nil {
   391  				return fmt.Errorf("CodeDeploy deployment group still exists:\n%#v", *resp.DeploymentGroupInfo.DeploymentGroupName)
   392  			}
   393  		}
   394  
   395  		return err
   396  	}
   397  
   398  	return nil
   399  }
   400  
   401  func testAccCheckAWSCodeDeployDeploymentGroupExists(name string, group *codedeploy.DeploymentGroupInfo) resource.TestCheckFunc {
   402  	return func(s *terraform.State) error {
   403  		rs, ok := s.RootModule().Resources[name]
   404  		if !ok {
   405  			return fmt.Errorf("Not found: %s", name)
   406  		}
   407  
   408  		conn := testAccProvider.Meta().(*AWSClient).codedeployconn
   409  
   410  		resp, err := conn.GetDeploymentGroup(&codedeploy.GetDeploymentGroupInput{
   411  			ApplicationName:     aws.String(rs.Primary.Attributes["app_name"]),
   412  			DeploymentGroupName: aws.String(rs.Primary.Attributes["deployment_group_name"]),
   413  		})
   414  
   415  		if err != nil {
   416  			return err
   417  		}
   418  
   419  		*group = *resp.DeploymentGroupInfo
   420  
   421  		return nil
   422  	}
   423  }
   424  
   425  var testAccAWSCodeDeployDeploymentGroup = `
   426  resource "aws_codedeploy_app" "foo_app" {
   427  	name = "foo_app"
   428  }
   429  
   430  resource "aws_iam_role_policy" "foo_policy" {
   431  	name = "foo_policy"
   432  	role = "${aws_iam_role.foo_role.id}"
   433  	policy = <<EOF
   434  {
   435  	"Version": "2012-10-17",
   436  	"Statement": [
   437  		{
   438  			"Effect": "Allow",
   439  			"Action": [
   440  				"autoscaling:CompleteLifecycleAction",
   441  				"autoscaling:DeleteLifecycleHook",
   442  				"autoscaling:DescribeAutoScalingGroups",
   443  				"autoscaling:DescribeLifecycleHooks",
   444  				"autoscaling:PutLifecycleHook",
   445  				"autoscaling:RecordLifecycleActionHeartbeat",
   446  				"ec2:DescribeInstances",
   447  				"ec2:DescribeInstanceStatus",
   448  				"tag:GetTags",
   449  				"tag:GetResources"
   450  			],
   451  			"Resource": "*"
   452  		}
   453  	]
   454  }
   455  EOF
   456  }
   457  
   458  resource "aws_iam_role" "foo_role" {
   459  	name = "foo_role"
   460  	assume_role_policy = <<EOF
   461  {
   462  	"Version": "2012-10-17",
   463  	"Statement": [
   464  		{
   465  			"Sid": "",
   466  			"Effect": "Allow",
   467  			"Principal": {
   468  				"Service": [
   469  					"codedeploy.amazonaws.com"
   470  				]
   471  			},
   472  			"Action": "sts:AssumeRole"
   473  		}
   474  	]
   475  }
   476  EOF
   477  }
   478  
   479  resource "aws_codedeploy_deployment_group" "foo" {
   480  	app_name = "${aws_codedeploy_app.foo_app.name}"
   481  	deployment_group_name = "foo"
   482  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   483  	ec2_tag_filter {
   484  		key = "filterkey"
   485  		type = "KEY_AND_VALUE"
   486  		value = "filtervalue"
   487  	}
   488  }`
   489  
   490  var testAccAWSCodeDeployDeploymentGroupModified = `
   491  resource "aws_codedeploy_app" "foo_app" {
   492  	name = "foo_app"
   493  }
   494  
   495  resource "aws_iam_role_policy" "foo_policy" {
   496  	name = "foo_policy"
   497  	role = "${aws_iam_role.foo_role.id}"
   498  	policy = <<EOF
   499  {
   500  	"Version": "2012-10-17",
   501  	"Statement": [
   502  		{
   503  			"Effect": "Allow",
   504  			"Action": [
   505  				"autoscaling:CompleteLifecycleAction",
   506  				"autoscaling:DeleteLifecycleHook",
   507  				"autoscaling:DescribeAutoScalingGroups",
   508  				"autoscaling:DescribeLifecycleHooks",
   509  				"autoscaling:PutLifecycleHook",
   510  				"autoscaling:RecordLifecycleActionHeartbeat",
   511  				"ec2:DescribeInstances",
   512  				"ec2:DescribeInstanceStatus",
   513  				"tag:GetTags",
   514  				"tag:GetResources"
   515  			],
   516  			"Resource": "*"
   517  		}
   518  	]
   519  }
   520  EOF
   521  }
   522  
   523  resource "aws_iam_role" "foo_role" {
   524  	name = "foo_role"
   525  	assume_role_policy = <<EOF
   526  {
   527  	"Version": "2012-10-17",
   528  	"Statement": [
   529  		{
   530  			"Sid": "",
   531  			"Effect": "Allow",
   532  			"Principal": {
   533  				"Service": [
   534  					"codedeploy.amazonaws.com"
   535  				]
   536  			},
   537  			"Action": "sts:AssumeRole"
   538  		}
   539  	]
   540  }
   541  EOF
   542  }
   543  
   544  resource "aws_codedeploy_deployment_group" "foo" {
   545  	app_name = "${aws_codedeploy_app.foo_app.name}"
   546  	deployment_group_name = "bar"
   547  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   548  	ec2_tag_filter {
   549  		key = "filterkey"
   550  		type = "KEY_AND_VALUE"
   551  		value = "anotherfiltervalue"
   552  	}
   553  }`
   554  
   555  var testAccAWSCodeDeployDeploymentGroupOnPremiseTags = `
   556  resource "aws_codedeploy_app" "foo_app" {
   557  	name = "foo_app"
   558  }
   559  
   560  resource "aws_iam_role_policy" "foo_policy" {
   561  	name = "foo_policy"
   562  	role = "${aws_iam_role.foo_role.id}"
   563  	policy = <<EOF
   564  {
   565  	"Version": "2012-10-17",
   566  	"Statement": [
   567  		{
   568  			"Effect": "Allow",
   569  			"Action": [
   570  				"autoscaling:CompleteLifecycleAction",
   571  				"autoscaling:DeleteLifecycleHook",
   572  				"autoscaling:DescribeAutoScalingGroups",
   573  				"autoscaling:DescribeLifecycleHooks",
   574  				"autoscaling:PutLifecycleHook",
   575  				"autoscaling:RecordLifecycleActionHeartbeat",
   576  				"ec2:DescribeInstances",
   577  				"ec2:DescribeInstanceStatus",
   578  				"tag:GetTags",
   579  				"tag:GetResources"
   580  			],
   581  			"Resource": "*"
   582  		}
   583  	]
   584  }
   585  EOF
   586  }
   587  
   588  resource "aws_iam_role" "foo_role" {
   589  	name = "foo_role"
   590  	assume_role_policy = <<EOF
   591  {
   592  	"Version": "2012-10-17",
   593  	"Statement": [
   594  		{
   595  			"Sid": "",
   596  			"Effect": "Allow",
   597  			"Principal": {
   598  				"Service": [
   599  					"codedeploy.amazonaws.com"
   600  				]
   601  			},
   602  			"Action": "sts:AssumeRole"
   603  		}
   604  	]
   605  }
   606  EOF
   607  }
   608  
   609  resource "aws_codedeploy_deployment_group" "foo" {
   610  	app_name = "${aws_codedeploy_app.foo_app.name}"
   611  	deployment_group_name = "foo"
   612  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   613  	on_premises_instance_tag_filter {
   614  		key = "filterkey"
   615  		type = "KEY_AND_VALUE"
   616  		value = "filtervalue"
   617  	}
   618  }`
   619  
   620  const baseCodeDeployConfig = `
   621  resource "aws_codedeploy_app" "foo_app" {
   622  	name = "foo-app"
   623  }
   624  
   625  resource "aws_iam_role_policy" "foo_policy" {
   626  	name = "foo-policy"
   627  	role = "${aws_iam_role.foo_role.id}"
   628  	policy = <<EOF
   629  {
   630  	"Version": "2012-10-17",
   631  	"Statement": [
   632  		{
   633  			"Effect": "Allow",
   634  			"Action": [
   635  				"autoscaling:CompleteLifecycleAction",
   636  				"autoscaling:DeleteLifecycleHook",
   637  				"autoscaling:DescribeAutoScalingGroups",
   638  				"autoscaling:DescribeLifecycleHooks",
   639  				"autoscaling:PutLifecycleHook",
   640  				"autoscaling:RecordLifecycleActionHeartbeat",
   641  				"ec2:DescribeInstances",
   642  				"ec2:DescribeInstanceStatus",
   643  				"tag:GetTags",
   644  				"tag:GetResources",
   645  				"sns:Publish"
   646  			],
   647  			"Resource": "*"
   648  		}
   649  	]
   650  }
   651  EOF
   652  }
   653  
   654  resource "aws_iam_role" "foo_role" {
   655  	name = "foo-role"
   656  	assume_role_policy = <<EOF
   657  {
   658  	"Version": "2012-10-17",
   659  	"Statement": [
   660  		{
   661  			"Sid": "",
   662  			"Effect": "Allow",
   663  			"Principal": {
   664  				"Service": "codedeploy.amazonaws.com"
   665  			},
   666  			"Action": "sts:AssumeRole"
   667  		}
   668  	]
   669  }
   670  EOF
   671  }
   672  
   673  resource "aws_sns_topic" "foo_topic" {
   674  	name = "foo-topic"
   675  }
   676  
   677  `
   678  
   679  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_create = baseCodeDeployConfig + `
   680  resource "aws_codedeploy_deployment_group" "foo_group" {
   681  	app_name = "${aws_codedeploy_app.foo_app.name}"
   682  	deployment_group_name = "foo-group"
   683  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   684  
   685  	trigger_configuration {
   686  		trigger_events = ["DeploymentFailure"]
   687  		trigger_name = "foo-trigger"
   688  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   689  	}
   690  }`
   691  
   692  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_update = baseCodeDeployConfig + `
   693  resource "aws_codedeploy_deployment_group" "foo_group" {
   694  	app_name = "${aws_codedeploy_app.foo_app.name}"
   695  	deployment_group_name = "foo-group"
   696  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   697  
   698  	trigger_configuration {
   699  		trigger_events = ["DeploymentSuccess", "DeploymentFailure"]
   700  		trigger_name = "foo-trigger"
   701  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   702  	}
   703  }`
   704  
   705  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_createMultiple = baseCodeDeployConfig + `
   706  resource "aws_sns_topic" "bar_topic" {
   707  	name = "bar-topic"
   708  }
   709  
   710  resource "aws_codedeploy_deployment_group" "foo_group" {
   711  	app_name = "${aws_codedeploy_app.foo_app.name}"
   712  	deployment_group_name = "foo-group"
   713  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   714  
   715  	trigger_configuration {
   716  		trigger_events = ["DeploymentFailure"]
   717  		trigger_name = "foo-trigger"
   718  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   719  	}
   720  
   721  	trigger_configuration {
   722  		trigger_events = ["InstanceFailure"]
   723  		trigger_name = "bar-trigger"
   724  		trigger_target_arn = "${aws_sns_topic.bar_topic.arn}"
   725  	}
   726  }`
   727  
   728  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_updateMultiple = baseCodeDeployConfig + `
   729  resource "aws_sns_topic" "bar_topic" {
   730  	name = "bar-topic"
   731  }
   732  
   733  resource "aws_sns_topic" "baz_topic" {
   734  	name = "baz-topic"
   735  }
   736  
   737  resource "aws_codedeploy_deployment_group" "foo_group" {
   738  	app_name = "${aws_codedeploy_app.foo_app.name}"
   739  	deployment_group_name = "foo-group"
   740  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   741  
   742  	trigger_configuration {
   743  		trigger_events = ["DeploymentStart", "DeploymentSuccess", "DeploymentFailure", "DeploymentStop"]
   744  		trigger_name = "foo-trigger"
   745  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   746  	}
   747  
   748  	trigger_configuration {
   749  		trigger_events = ["InstanceFailure"]
   750  		trigger_name = "bar-trigger"
   751  		trigger_target_arn = "${aws_sns_topic.baz_topic.arn}"
   752  	}
   753  }`