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 }`