github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_codedeploy_deployment_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/aws/awserr"
    10  	"github.com/aws/aws-sdk-go/service/codedeploy"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/helper/schema"
    13  	"github.com/hashicorp/terraform/terraform"
    14  )
    15  
    16  func TestAccAWSCodeDeployDeploymentGroup_basic(t *testing.T) {
    17  	resource.Test(t, resource.TestCase{
    18  		PreCheck:     func() { testAccPreCheck(t) },
    19  		Providers:    testAccProviders,
    20  		CheckDestroy: testAccCheckAWSCodeDeployDeploymentGroupDestroy,
    21  		Steps: []resource.TestStep{
    22  			resource.TestStep{
    23  				Config: testAccAWSCodeDeployDeploymentGroup,
    24  				Check: resource.ComposeTestCheckFunc(
    25  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo"),
    26  					resource.TestCheckResourceAttr(
    27  						"aws_codedeploy_deployment_group.foo", "app_name", "foo_app"),
    28  					resource.TestCheckResourceAttr(
    29  						"aws_codedeploy_deployment_group.foo", "deployment_group_name", "foo"),
    30  					resource.TestCheckResourceAttr(
    31  						"aws_codedeploy_deployment_group.foo", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
    32  
    33  					resource.TestCheckResourceAttr(
    34  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.#", "1"),
    35  					resource.TestCheckResourceAttr(
    36  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2916377465.key", "filterkey"),
    37  					resource.TestCheckResourceAttr(
    38  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2916377465.type", "KEY_AND_VALUE"),
    39  					resource.TestCheckResourceAttr(
    40  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2916377465.value", "filtervalue"),
    41  				),
    42  			},
    43  			resource.TestStep{
    44  				Config: testAccAWSCodeDeployDeploymentGroupModified,
    45  				Check: resource.ComposeTestCheckFunc(
    46  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo"),
    47  					resource.TestCheckResourceAttr(
    48  						"aws_codedeploy_deployment_group.foo", "app_name", "foo_app"),
    49  					resource.TestCheckResourceAttr(
    50  						"aws_codedeploy_deployment_group.foo", "deployment_group_name", "bar"),
    51  					resource.TestCheckResourceAttr(
    52  						"aws_codedeploy_deployment_group.foo", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
    53  
    54  					resource.TestCheckResourceAttr(
    55  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.#", "1"),
    56  					resource.TestCheckResourceAttr(
    57  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2369538975.key", "filterkey"),
    58  					resource.TestCheckResourceAttr(
    59  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2369538975.type", "KEY_AND_VALUE"),
    60  					resource.TestCheckResourceAttr(
    61  						"aws_codedeploy_deployment_group.foo", "ec2_tag_filter.2369538975.value", "anotherfiltervalue"),
    62  				),
    63  			},
    64  		},
    65  	})
    66  }
    67  
    68  func TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_basic(t *testing.T) {
    69  	resource.Test(t, resource.TestCase{
    70  		PreCheck:     func() { testAccPreCheck(t) },
    71  		Providers:    testAccProviders,
    72  		CheckDestroy: testAccCheckAWSCodeDeployDeploymentGroupDestroy,
    73  		Steps: []resource.TestStep{
    74  			resource.TestStep{
    75  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_create,
    76  				Check: resource.ComposeTestCheckFunc(
    77  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group"),
    78  					resource.TestCheckResourceAttr(
    79  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
    80  					resource.TestCheckResourceAttr(
    81  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
    82  					resource.TestCheckResourceAttr(
    83  						"aws_codedeploy_deployment_group.foo_group", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
    84  				),
    85  			},
    86  			resource.TestStep{
    87  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_update,
    88  				Check: resource.ComposeTestCheckFunc(
    89  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group"),
    90  					resource.TestCheckResourceAttr(
    91  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
    92  					resource.TestCheckResourceAttr(
    93  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
    94  					resource.TestCheckResourceAttr(
    95  						"aws_codedeploy_deployment_group.foo_group", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
    96  				),
    97  			},
    98  		},
    99  	})
   100  }
   101  
   102  func TestAccAWSCodeDeployDeploymentGroup_triggerConfiguration_multiple(t *testing.T) {
   103  	resource.Test(t, resource.TestCase{
   104  		PreCheck:     func() { testAccPreCheck(t) },
   105  		Providers:    testAccProviders,
   106  		CheckDestroy: testAccCheckAWSCodeDeployDeploymentGroupDestroy,
   107  		Steps: []resource.TestStep{
   108  			resource.TestStep{
   109  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_createMultiple,
   110  				Check: resource.ComposeTestCheckFunc(
   111  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group"),
   112  					resource.TestCheckResourceAttr(
   113  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
   114  					resource.TestCheckResourceAttr(
   115  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
   116  					resource.TestCheckResourceAttr(
   117  						"aws_codedeploy_deployment_group.foo_group", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
   118  				),
   119  			},
   120  			resource.TestStep{
   121  				Config: testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_updateMultiple,
   122  				Check: resource.ComposeTestCheckFunc(
   123  					testAccCheckAWSCodeDeployDeploymentGroupExists("aws_codedeploy_deployment_group.foo_group"),
   124  					resource.TestCheckResourceAttr(
   125  						"aws_codedeploy_deployment_group.foo_group", "app_name", "foo-app"),
   126  					resource.TestCheckResourceAttr(
   127  						"aws_codedeploy_deployment_group.foo_group", "deployment_group_name", "foo-group"),
   128  					resource.TestCheckResourceAttr(
   129  						"aws_codedeploy_deployment_group.foo_group", "deployment_config_name", "CodeDeployDefault.OneAtATime"),
   130  				),
   131  			},
   132  		},
   133  	})
   134  }
   135  
   136  func TestValidateAWSCodeDeployTriggerEvent(t *testing.T) {
   137  	cases := []struct {
   138  		Value    string
   139  		ErrCount int
   140  	}{
   141  		{
   142  			Value:    "DeploymentStart",
   143  			ErrCount: 0,
   144  		},
   145  		{
   146  			Value:    "DeploymentStop",
   147  			ErrCount: 0,
   148  		},
   149  		{
   150  			Value:    "DeploymentSuccess",
   151  			ErrCount: 0,
   152  		},
   153  		{
   154  			Value:    "DeploymentFailure",
   155  			ErrCount: 0,
   156  		},
   157  		{
   158  			Value:    "InstanceStart",
   159  			ErrCount: 0,
   160  		},
   161  		{
   162  			Value:    "InstanceSuccess",
   163  			ErrCount: 0,
   164  		},
   165  		{
   166  			Value:    "InstanceFailure",
   167  			ErrCount: 0,
   168  		},
   169  		{
   170  			Value:    "DeploymentStarts",
   171  			ErrCount: 1,
   172  		},
   173  		{
   174  			Value:    "InstanceFail",
   175  			ErrCount: 1,
   176  		},
   177  		{
   178  			Value:    "Foo",
   179  			ErrCount: 1,
   180  		},
   181  		{
   182  			Value:    "",
   183  			ErrCount: 1,
   184  		},
   185  	}
   186  
   187  	for _, tc := range cases {
   188  		_, errors := validateTriggerEvent(tc.Value, "trigger_event")
   189  		if len(errors) != tc.ErrCount {
   190  			t.Fatalf("Trigger event validation failed for event type %q: %q", tc.Value, errors)
   191  		}
   192  	}
   193  }
   194  
   195  func TestBuildTriggerConfigs(t *testing.T) {
   196  	input := []interface{}{
   197  		map[string]interface{}{
   198  			"trigger_events": schema.NewSet(schema.HashString, []interface{}{
   199  				"DeploymentFailure",
   200  			}),
   201  			"trigger_name":       "foo-trigger",
   202  			"trigger_target_arn": "arn:aws:sns:us-west-2:123456789012:foo-topic",
   203  		},
   204  	}
   205  
   206  	expected := []*codedeploy.TriggerConfig{
   207  		&codedeploy.TriggerConfig{
   208  			TriggerEvents: []*string{
   209  				aws.String("DeploymentFailure"),
   210  			},
   211  			TriggerName:      aws.String("foo-trigger"),
   212  			TriggerTargetArn: aws.String("arn:aws:sns:us-west-2:123456789012:foo-topic"),
   213  		},
   214  	}
   215  
   216  	actual := buildTriggerConfigs(input)
   217  
   218  	if !reflect.DeepEqual(actual, expected) {
   219  		t.Fatalf("buildTriggerConfigs output is not correct.\nGot:\n%#v\nExpected:\n%#v\n",
   220  			actual, expected)
   221  	}
   222  }
   223  
   224  func TestTriggerConfigsToMap(t *testing.T) {
   225  	input := []*codedeploy.TriggerConfig{
   226  		&codedeploy.TriggerConfig{
   227  			TriggerEvents: []*string{
   228  				aws.String("DeploymentFailure"),
   229  				aws.String("InstanceFailure"),
   230  			},
   231  			TriggerName:      aws.String("bar-trigger"),
   232  			TriggerTargetArn: aws.String("arn:aws:sns:us-west-2:123456789012:bar-topic"),
   233  		},
   234  	}
   235  
   236  	expected := map[string]interface{}{
   237  		"trigger_events": schema.NewSet(schema.HashString, []interface{}{
   238  			"DeploymentFailure",
   239  			"InstanceFailure",
   240  		}),
   241  		"trigger_name":       "bar-trigger",
   242  		"trigger_target_arn": "arn:aws:sns:us-west-2:123456789012:bar-topic",
   243  	}
   244  
   245  	actual := triggerConfigsToMap(input)[0]
   246  
   247  	fatal := false
   248  
   249  	if actual["trigger_name"] != expected["trigger_name"] {
   250  		fatal = true
   251  	}
   252  
   253  	if actual["trigger_target_arn"] != expected["trigger_target_arn"] {
   254  		fatal = true
   255  	}
   256  
   257  	actualEvents := actual["trigger_events"].(*schema.Set)
   258  	expectedEvents := expected["trigger_events"].(*schema.Set)
   259  	if !actualEvents.Equal(expectedEvents) {
   260  		fatal = true
   261  	}
   262  
   263  	if fatal {
   264  		t.Fatalf("triggerConfigsToMap output is not correct.\nGot:\n%#v\nExpected:\n%#v\n",
   265  			actual, expected)
   266  	}
   267  }
   268  
   269  func testAccCheckAWSCodeDeployDeploymentGroupDestroy(s *terraform.State) error {
   270  	conn := testAccProvider.Meta().(*AWSClient).codedeployconn
   271  
   272  	for _, rs := range s.RootModule().Resources {
   273  		if rs.Type != "aws_codedeploy_deployment_group" {
   274  			continue
   275  		}
   276  
   277  		resp, err := conn.GetDeploymentGroup(&codedeploy.GetDeploymentGroupInput{
   278  			ApplicationName:     aws.String(rs.Primary.Attributes["app_name"]),
   279  			DeploymentGroupName: aws.String(rs.Primary.Attributes["deployment_group_name"]),
   280  		})
   281  
   282  		if ae, ok := err.(awserr.Error); ok && ae.Code() == "ApplicationDoesNotExistException" {
   283  			continue
   284  		}
   285  
   286  		if err == nil {
   287  			if resp.DeploymentGroupInfo.DeploymentGroupName != nil {
   288  				return fmt.Errorf("CodeDeploy deployment group still exists:\n%#v", *resp.DeploymentGroupInfo.DeploymentGroupName)
   289  			}
   290  		}
   291  
   292  		return err
   293  	}
   294  
   295  	return nil
   296  }
   297  
   298  func testAccCheckAWSCodeDeployDeploymentGroupExists(name string) resource.TestCheckFunc {
   299  	return func(s *terraform.State) error {
   300  		_, ok := s.RootModule().Resources[name]
   301  		if !ok {
   302  			return fmt.Errorf("Not found: %s", name)
   303  		}
   304  
   305  		return nil
   306  	}
   307  }
   308  
   309  var testAccAWSCodeDeployDeploymentGroup = `
   310  resource "aws_codedeploy_app" "foo_app" {
   311  	name = "foo_app"
   312  }
   313  
   314  resource "aws_iam_role_policy" "foo_policy" {
   315  	name = "foo_policy"
   316  	role = "${aws_iam_role.foo_role.id}"
   317  	policy = <<EOF
   318  {
   319  	"Version": "2012-10-17",
   320  	"Statement": [
   321  		{
   322  			"Effect": "Allow",
   323  			"Action": [
   324  				"autoscaling:CompleteLifecycleAction",
   325  				"autoscaling:DeleteLifecycleHook",
   326  				"autoscaling:DescribeAutoScalingGroups",
   327  				"autoscaling:DescribeLifecycleHooks",
   328  				"autoscaling:PutLifecycleHook",
   329  				"autoscaling:RecordLifecycleActionHeartbeat",
   330  				"ec2:DescribeInstances",
   331  				"ec2:DescribeInstanceStatus",
   332  				"tag:GetTags",
   333  				"tag:GetResources"
   334  			],
   335  			"Resource": "*"
   336  		}
   337  	]
   338  }
   339  EOF
   340  }
   341  
   342  resource "aws_iam_role" "foo_role" {
   343  	name = "foo_role"
   344  	assume_role_policy = <<EOF
   345  {
   346  	"Version": "2012-10-17",
   347  	"Statement": [
   348  		{
   349  			"Sid": "",
   350  			"Effect": "Allow",
   351  			"Principal": {
   352  				"Service": [
   353  					"codedeploy.amazonaws.com"
   354  				]
   355  			},
   356  			"Action": "sts:AssumeRole"
   357  		}
   358  	]
   359  }
   360  EOF
   361  }
   362  
   363  resource "aws_codedeploy_deployment_group" "foo" {
   364  	app_name = "${aws_codedeploy_app.foo_app.name}"
   365  	deployment_group_name = "foo"
   366  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   367  	ec2_tag_filter {
   368  		key = "filterkey"
   369  		type = "KEY_AND_VALUE"
   370  		value = "filtervalue"
   371  	}
   372  }`
   373  
   374  var testAccAWSCodeDeployDeploymentGroupModified = `
   375  resource "aws_codedeploy_app" "foo_app" {
   376  	name = "foo_app"
   377  }
   378  
   379  resource "aws_iam_role_policy" "foo_policy" {
   380  	name = "foo_policy"
   381  	role = "${aws_iam_role.foo_role.id}"
   382  	policy = <<EOF
   383  {
   384  	"Version": "2012-10-17",
   385  	"Statement": [
   386  		{
   387  			"Effect": "Allow",
   388  			"Action": [
   389  				"autoscaling:CompleteLifecycleAction",
   390  				"autoscaling:DeleteLifecycleHook",
   391  				"autoscaling:DescribeAutoScalingGroups",
   392  				"autoscaling:DescribeLifecycleHooks",
   393  				"autoscaling:PutLifecycleHook",
   394  				"autoscaling:RecordLifecycleActionHeartbeat",
   395  				"ec2:DescribeInstances",
   396  				"ec2:DescribeInstanceStatus",
   397  				"tag:GetTags",
   398  				"tag:GetResources"
   399  			],
   400  			"Resource": "*"
   401  		}
   402  	]
   403  }
   404  EOF
   405  }
   406  
   407  resource "aws_iam_role" "foo_role" {
   408  	name = "foo_role"
   409  	assume_role_policy = <<EOF
   410  {
   411  	"Version": "2012-10-17",
   412  	"Statement": [
   413  		{
   414  			"Sid": "",
   415  			"Effect": "Allow",
   416  			"Principal": {
   417  				"Service": [
   418  					"codedeploy.amazonaws.com"
   419  				]
   420  			},
   421  			"Action": "sts:AssumeRole"
   422  		}
   423  	]
   424  }
   425  EOF
   426  }
   427  
   428  resource "aws_codedeploy_deployment_group" "foo" {
   429  	app_name = "${aws_codedeploy_app.foo_app.name}"
   430  	deployment_group_name = "bar"
   431  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   432  	ec2_tag_filter {
   433  		key = "filterkey"
   434  		type = "KEY_AND_VALUE"
   435  		value = "anotherfiltervalue"
   436  	}
   437  }`
   438  
   439  const baseCodeDeployConfig = `
   440  resource "aws_codedeploy_app" "foo_app" {
   441  	name = "foo-app"
   442  }
   443  
   444  resource "aws_iam_role_policy" "foo_policy" {
   445  	name = "foo-policy"
   446  	role = "${aws_iam_role.foo_role.id}"
   447  	policy = <<EOF
   448  {
   449  	"Version": "2012-10-17",
   450  	"Statement": [
   451  		{
   452  			"Effect": "Allow",
   453  			"Action": [
   454  				"autoscaling:CompleteLifecycleAction",
   455  				"autoscaling:DeleteLifecycleHook",
   456  				"autoscaling:DescribeAutoScalingGroups",
   457  				"autoscaling:DescribeLifecycleHooks",
   458  				"autoscaling:PutLifecycleHook",
   459  				"autoscaling:RecordLifecycleActionHeartbeat",
   460  				"ec2:DescribeInstances",
   461  				"ec2:DescribeInstanceStatus",
   462  				"tag:GetTags",
   463  				"tag:GetResources",
   464  				"sns:Publish"
   465  			],
   466  			"Resource": "*"
   467  		}
   468  	]
   469  }
   470  EOF
   471  }
   472  
   473  resource "aws_iam_role" "foo_role" {
   474  	name = "foo-role"
   475  	assume_role_policy = <<EOF
   476  {
   477  	"Version": "2012-10-17",
   478  	"Statement": [
   479  		{
   480  			"Sid": "",
   481  			"Effect": "Allow",
   482  			"Principal": {
   483  				"Service": "codedeploy.amazonaws.com"
   484  			},
   485  			"Action": "sts:AssumeRole"
   486  		}
   487  	]
   488  }
   489  EOF
   490  }
   491  
   492  resource "aws_sns_topic" "foo_topic" {
   493  	name = "foo-topic"
   494  }
   495  
   496  `
   497  
   498  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_create = baseCodeDeployConfig + `
   499  resource "aws_codedeploy_deployment_group" "foo_group" {
   500  	app_name = "${aws_codedeploy_app.foo_app.name}"
   501  	deployment_group_name = "foo-group"
   502  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   503  
   504  	trigger_configuration {
   505  		trigger_events = ["DeploymentFailure"]
   506  		trigger_name = "foo-trigger"
   507  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   508  	}
   509  }`
   510  
   511  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_update = baseCodeDeployConfig + `
   512  resource "aws_codedeploy_deployment_group" "foo_group" {
   513  	app_name = "${aws_codedeploy_app.foo_app.name}"
   514  	deployment_group_name = "foo-group"
   515  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   516  
   517  	trigger_configuration {
   518  		trigger_events = ["DeploymentSuccess", "DeploymentFailure"]
   519  		trigger_name = "foo-trigger"
   520  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   521  	}
   522  }`
   523  
   524  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_createMultiple = baseCodeDeployConfig + `
   525  resource "aws_sns_topic" "bar_topic" {
   526  	name = "bar-topic"
   527  }
   528  
   529  resource "aws_codedeploy_deployment_group" "foo_group" {
   530  	app_name = "${aws_codedeploy_app.foo_app.name}"
   531  	deployment_group_name = "foo-group"
   532  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   533  
   534  	trigger_configuration {
   535  		trigger_events = ["DeploymentFailure"]
   536  		trigger_name = "foo-trigger"
   537  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   538  	}
   539  
   540  	trigger_configuration {
   541  		trigger_events = ["InstanceFailure"]
   542  		trigger_name = "bar-trigger"
   543  		trigger_target_arn = "${aws_sns_topic.bar_topic.arn}"
   544  	}
   545  }`
   546  
   547  const testAccAWSCodeDeployDeploymentGroup_triggerConfiguration_updateMultiple = baseCodeDeployConfig + `
   548  resource "aws_sns_topic" "bar_topic" {
   549  	name = "bar-topic"
   550  }
   551  
   552  resource "aws_sns_topic" "baz_topic" {
   553  	name = "baz-topic"
   554  }
   555  
   556  resource "aws_codedeploy_deployment_group" "foo_group" {
   557  	app_name = "${aws_codedeploy_app.foo_app.name}"
   558  	deployment_group_name = "foo-group"
   559  	service_role_arn = "${aws_iam_role.foo_role.arn}"
   560  
   561  	trigger_configuration {
   562  		trigger_events = ["DeploymentStart", "DeploymentSuccess", "DeploymentFailure", "DeploymentStop"]
   563  		trigger_name = "foo-trigger"
   564  		trigger_target_arn = "${aws_sns_topic.foo_topic.arn}"
   565  	}
   566  
   567  	trigger_configuration {
   568  		trigger_events = ["InstanceFailure"]
   569  		trigger_name = "bar-trigger"
   570  		trigger_target_arn = "${aws_sns_topic.baz_topic.arn}"
   571  	}
   572  }`