From 046bb0e1c3724af7b042c3a55ca8c465e0b1d80b Mon Sep 17 00:00:00 2001 From: Paul Stack Date: Thu, 4 May 2017 20:46:11 +0300 Subject: [PATCH] provider/aws: Support run_command_parameters in aws_cloudwatch_event_target (#14067) ``` % make testacc TEST=./builtin/providers/aws TESTARGS='-run=TestAccAWSCloudWatchEventTarget_' ==> Checking that code complies with gofmt requirements... go generate $(go list ./... | grep -v /terraform/vendor/) 2017/04/29 11:00:09 Generated command/internal_plugin_list.go TF_ACC=1 go test ./builtin/providers/aws -v -run=TestAccAWSCloudWatchEventTarget_ -timeout 120m === RUN TestAccAWSCloudWatchEventTarget_basic --- PASS: TestAccAWSCloudWatchEventTarget_basic (58.75s) === RUN TestAccAWSCloudWatchEventTarget_missingTargetId --- PASS: TestAccAWSCloudWatchEventTarget_missingTargetId (36.11s) === RUN TestAccAWSCloudWatchEventTarget_full --- PASS: TestAccAWSCloudWatchEventTarget_full (90.30s) === RUN TestAccAWSCloudWatchEventTarget_ssmDocument --- PASS: TestAccAWSCloudWatchEventTarget_ssmDocument (38.64s) PASS ok github.com/hashicorp/terraform/builtin/providers/aws 223.833s ``` --- .../resource_aws_cloudwatch_event_target.go | 89 +++++++++++- ...source_aws_cloudwatch_event_target_test.go | 129 ++++++++++++++++-- .../aws/resource_aws_ssm_document.go | 13 ++ .../r/cloudwatch_event_target.html.markdown | 8 ++ 4 files changed, 219 insertions(+), 20 deletions(-) diff --git a/builtin/providers/aws/resource_aws_cloudwatch_event_target.go b/builtin/providers/aws/resource_aws_cloudwatch_event_target.go index 767b94b16f..afa5e84fdc 100644 --- a/builtin/providers/aws/resource_aws_cloudwatch_event_target.go +++ b/builtin/providers/aws/resource_aws_cloudwatch_event_target.go @@ -11,6 +11,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" events "github.com/aws/aws-sdk-go/service/cloudwatchevents" + "github.com/hashicorp/terraform/helper/validation" ) func resourceAwsCloudWatchEventTarget() *schema.Resource { @@ -21,14 +22,14 @@ func resourceAwsCloudWatchEventTarget() *schema.Resource { Delete: resourceAwsCloudWatchEventTargetDelete, Schema: map[string]*schema.Schema{ - "rule": &schema.Schema{ + "rule": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validateCloudWatchEventRuleName, }, - "target_id": &schema.Schema{ + "target_id": { Type: schema.TypeString, Optional: true, Computed: true, @@ -36,12 +37,12 @@ func resourceAwsCloudWatchEventTarget() *schema.Resource { ValidateFunc: validateCloudWatchEventTargetId, }, - "arn": &schema.Schema{ + "arn": { Type: schema.TypeString, Required: true, }, - "input": &schema.Schema{ + "input": { Type: schema.TypeString, Optional: true, ConflictsWith: []string{"input_path"}, @@ -49,11 +50,36 @@ func resourceAwsCloudWatchEventTarget() *schema.Resource { // but for built-in targets input may not be JSON }, - "input_path": &schema.Schema{ + "input_path": { Type: schema.TypeString, Optional: true, ConflictsWith: []string{"input"}, }, + + "role_arn": { + Type: schema.TypeString, + Optional: true, + }, + + "run_command_targets": { + Type: schema.TypeList, + Optional: true, + MaxItems: 5, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringLenBetween(1, 128), + }, + "values": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + }, + }, }, } } @@ -72,6 +98,7 @@ func resourceAwsCloudWatchEventTargetCreate(d *schema.ResourceData, meta interfa } input := buildPutTargetInputStruct(d) + log.Printf("[DEBUG] Creating CloudWatch Event Target: %s", input) out, err := conn.PutTargets(input) if err != nil { @@ -128,6 +155,13 @@ func resourceAwsCloudWatchEventTargetRead(d *schema.ResourceData, meta interface d.Set("target_id", t.Id) d.Set("input", t.Input) d.Set("input_path", t.InputPath) + d.Set("role_arn", t.RoleArn) + + if t.RunCommandParameters != nil { + if err := d.Set("run_command_targets", flattenAwsCloudWatchEventTargetRunParameters(t.RunCommandParameters)); err != nil { + return fmt.Errorf("[DEBUG] Error setting run_command_targets error: %#v", err) + } + } return nil } @@ -162,6 +196,7 @@ func resourceAwsCloudWatchEventTargetUpdate(d *schema.ResourceData, meta interfa conn := meta.(*AWSClient).cloudwatcheventsconn input := buildPutTargetInputStruct(d) + log.Printf("[DEBUG] Updating CloudWatch Event Target: %s", input) _, err := conn.PutTargets(input) if err != nil { @@ -203,6 +238,14 @@ func buildPutTargetInputStruct(d *schema.ResourceData) *events.PutTargetsInput { e.InputPath = aws.String(v.(string)) } + if v, ok := d.GetOk("role_arn"); ok { + e.RoleArn = aws.String(v.(string)) + } + + if v, ok := d.GetOk("run_command_targets"); ok { + e.RunCommandParameters = expandAwsCloudWatchEventTargetRunParameters(v.([]interface{})) + } + input := events.PutTargetsInput{ Rule: aws.String(d.Get("rule").(string)), Targets: []*events.Target{e}, @@ -210,3 +253,39 @@ func buildPutTargetInputStruct(d *schema.ResourceData) *events.PutTargetsInput { return &input } + +func expandAwsCloudWatchEventTargetRunParameters(config []interface{}) *events.RunCommandParameters { + + commands := make([]*events.RunCommandTarget, 0) + + for _, c := range config { + param := c.(map[string]interface{}) + command := &events.RunCommandTarget{ + Key: aws.String(param["key"].(string)), + Values: expandStringList(param["values"].([]interface{})), + } + + commands = append(commands, command) + } + + command := &events.RunCommandParameters{ + RunCommandTargets: commands, + } + + return command +} + +func flattenAwsCloudWatchEventTargetRunParameters(runCommand *events.RunCommandParameters) []map[string]interface{} { + result := make([]map[string]interface{}, 0) + + for _, x := range runCommand.RunCommandTargets { + config := make(map[string]interface{}) + + config["key"] = *x.Key + config["values"] = flattenStringList(x.Values) + + result = append(result, config) + } + + return result +} diff --git a/builtin/providers/aws/resource_aws_cloudwatch_event_target_test.go b/builtin/providers/aws/resource_aws_cloudwatch_event_target_test.go index a5509bec8a..d6d5816740 100644 --- a/builtin/providers/aws/resource_aws_cloudwatch_event_target_test.go +++ b/builtin/providers/aws/resource_aws_cloudwatch_event_target_test.go @@ -18,7 +18,7 @@ func TestAccAWSCloudWatchEventTarget_basic(t *testing.T) { Providers: testAccProviders, CheckDestroy: testAccCheckAWSCloudWatchEventTargetDestroy, Steps: []resource.TestStep{ - resource.TestStep{ + { Config: testAccAWSCloudWatchEventTargetConfig, Check: resource.ComposeTestCheckFunc( testAccCheckCloudWatchEventTargetExists("aws_cloudwatch_event_target.moobar", &target), @@ -28,7 +28,7 @@ func TestAccAWSCloudWatchEventTarget_basic(t *testing.T) { regexp.MustCompile(":tf-acc-moon$")), ), }, - resource.TestStep{ + { Config: testAccAWSCloudWatchEventTargetConfigModified, Check: resource.ComposeTestCheckFunc( testAccCheckCloudWatchEventTargetExists("aws_cloudwatch_event_target.moobar", &target), @@ -50,7 +50,7 @@ func TestAccAWSCloudWatchEventTarget_missingTargetId(t *testing.T) { Providers: testAccProviders, CheckDestroy: testAccCheckAWSCloudWatchEventTargetDestroy, Steps: []resource.TestStep{ - resource.TestStep{ + { Config: testAccAWSCloudWatchEventTargetConfigMissingTargetId, Check: resource.ComposeTestCheckFunc( testAccCheckCloudWatchEventTargetExists("aws_cloudwatch_event_target.moobar", &target), @@ -71,7 +71,7 @@ func TestAccAWSCloudWatchEventTarget_full(t *testing.T) { Providers: testAccProviders, CheckDestroy: testAccCheckAWSCloudWatchEventTargetDestroy, Steps: []resource.TestStep{ - resource.TestStep{ + { Config: testAccAWSCloudWatchEventTargetConfig_full, Check: resource.ComposeTestCheckFunc( testAccCheckCloudWatchEventTargetExists("aws_cloudwatch_event_target.foobar", &target), @@ -87,6 +87,24 @@ func TestAccAWSCloudWatchEventTarget_full(t *testing.T) { }) } +func TestAccAWSCloudWatchEventTarget_ssmDocument(t *testing.T) { + var target events.Target + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSCloudWatchEventTargetDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSCloudWatchEventTargetConfigSsmDocument, + Check: resource.ComposeTestCheckFunc( + testAccCheckCloudWatchEventTargetExists("aws_cloudwatch_event_target.test", &target), + ), + }, + }, + }) +} + func testAccCheckCloudWatchEventTargetExists(n string, rule *events.Target) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -126,17 +144,6 @@ func testAccCheckAWSCloudWatchEventTargetDestroy(s *terraform.State) error { return nil } -func testAccCheckTargetIdExists(targetId string) resource.TestCheckFunc { - return func(s *terraform.State) error { - _, ok := s.RootModule().Resources[targetId] - if !ok { - return fmt.Errorf("Not found: %s", targetId) - } - - return nil - } -} - var testAccAWSCloudWatchEventTargetConfig = ` resource "aws_cloudwatch_event_rule" "foo" { name = "tf-acc-cw-event-rule-basic" @@ -249,3 +256,95 @@ resource "aws_kinesis_stream" "test_stream" { shard_count = 1 } ` + +var testAccAWSCloudWatchEventTargetConfigSsmDocument = ` +resource "aws_ssm_document" "foo" { + name = "test_document-100" + document_type = "Command" + + content = <