Skip to content

Commit

Permalink
Merge pull request #7024 from sunilkumarmohanty/sfn-tag
Browse files Browse the repository at this point in the history
Add support for tags for aws_sfn_state_machine and aws_sfn_activity
  • Loading branch information
bflad committed Jan 10, 2019
2 parents 085de23 + bac0aa9 commit 0ef5ea2
Show file tree
Hide file tree
Showing 8 changed files with 658 additions and 0 deletions.
69 changes: 69 additions & 0 deletions aws/resource_aws_sfn_activity.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ func resourceAwsSfnActivity() *schema.Resource {
return &schema.Resource{
Create: resourceAwsSfnActivityCreate,
Read: resourceAwsSfnActivityRead,
Update: resourceAwsSfnActivityUpdate,
Delete: resourceAwsSfnActivityDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
Expand All @@ -34,6 +35,7 @@ func resourceAwsSfnActivity() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"tags": tagsSchema(),
},
}
}
Expand All @@ -53,6 +55,59 @@ func resourceAwsSfnActivityCreate(d *schema.ResourceData, meta interface{}) erro

d.SetId(*activity.ActivityArn)

if v, ok := d.GetOk("tags"); ok {
input := &sfn.TagResourceInput{
ResourceArn: aws.String(d.Id()),
Tags: tagsFromMapSfn(v.(map[string]interface{})),
}
log.Printf("[DEBUG] Tagging SFN Activity: %s", input)
_, err := conn.TagResource(input)
if err != nil {
return fmt.Errorf("error tagging SFN Activity (%s): %s", d.Id(), input)
}
}
return resourceAwsSfnActivityRead(d, meta)
}

func resourceAwsSfnActivityUpdate(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).sfnconn

if d.HasChange("tags") {
oldTagsRaw, newTagsRaw := d.GetChange("tags")
oldTagsMap := oldTagsRaw.(map[string]interface{})
newTagsMap := newTagsRaw.(map[string]interface{})
createTags, removeTags := diffTagsSfn(tagsFromMapSfn(oldTagsMap), tagsFromMapSfn(newTagsMap))

if len(removeTags) > 0 {
removeTagKeys := make([]*string, len(removeTags))
for i, removeTag := range removeTags {
removeTagKeys[i] = removeTag.Key
}

input := &sfn.UntagResourceInput{
ResourceArn: aws.String(d.Id()),
TagKeys: removeTagKeys,
}

log.Printf("[DEBUG] Untagging State Function Activity: %s", input)
if _, err := conn.UntagResource(input); err != nil {
return fmt.Errorf("error untagging State Function Activity (%s): %s", d.Id(), err)
}
}

if len(createTags) > 0 {
input := &sfn.TagResourceInput{
ResourceArn: aws.String(d.Id()),
Tags: createTags,
}

log.Printf("[DEBUG] Tagging State Function Activity: %s", input)
if _, err := conn.TagResource(input); err != nil {
return fmt.Errorf("error tagging State Function Activity (%s): %s", d.Id(), err)
}
}
}

return resourceAwsSfnActivityRead(d, meta)
}

Expand All @@ -77,6 +132,20 @@ func resourceAwsSfnActivityRead(d *schema.ResourceData, meta interface{}) error
log.Printf("[DEBUG] Error setting creation_date: %s", err)
}

tagsResp, err := conn.ListTagsForResource(
&sfn.ListTagsForResourceInput{
ResourceArn: aws.String(d.Id()),
},
)

if err != nil {
return fmt.Errorf("error listing SFN Activity (%s) tags: %s", d.Id(), err)
}

if err := d.Set("tags", tagsToMapSfn(tagsResp.Tags)); err != nil {
return fmt.Errorf("error setting tags: %s", err)
}

return nil
}

Expand Down
60 changes: 60 additions & 0 deletions aws/resource_aws_sfn_activity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,43 @@ func TestAccAWSSfnActivity_basic(t *testing.T) {
})
}

func TestAccAWSSfnActivity_Tags(t *testing.T) {
name := acctest.RandString(10)

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckAWSSfnActivityDestroy,
Steps: []resource.TestStep{
{
Config: testAccAWSSfnActivityBasicConfigTags1(name, "key1", "value1"),
Check: resource.ComposeTestCheckFunc(
testAccCheckAWSSfnActivityExists("aws_sfn_activity.foo"),
resource.TestCheckResourceAttr("aws_sfn_activity.foo", "tags.%", "1"),
resource.TestCheckResourceAttr("aws_sfn_activity.foo", "tags.key1", "value1"),
),
},
{
Config: testAccAWSSfnActivityBasicConfigTags2(name, "key1", "value1updated", "key2", "value2"),
Check: resource.ComposeTestCheckFunc(
testAccCheckAWSSfnActivityExists("aws_sfn_activity.foo"),
resource.TestCheckResourceAttr("aws_sfn_activity.foo", "tags.%", "2"),
resource.TestCheckResourceAttr("aws_sfn_activity.foo", "tags.key1", "value1updated"),
resource.TestCheckResourceAttr("aws_sfn_activity.foo", "tags.key2", "value2"),
),
},
{
Config: testAccAWSSfnActivityBasicConfigTags1(name, "key2", "value2"),
Check: resource.ComposeTestCheckFunc(
testAccCheckAWSSfnActivityExists("aws_sfn_activity.foo"),
resource.TestCheckResourceAttr("aws_sfn_activity.foo", "tags.%", "1"),
resource.TestCheckResourceAttr("aws_sfn_activity.foo", "tags.key2", "value2"),
),
},
},
})
}

func testAccCheckAWSSfnActivityExists(n string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
Expand Down Expand Up @@ -126,3 +163,26 @@ resource "aws_sfn_activity" "foo" {
}
`, rName)
}

func testAccAWSSfnActivityBasicConfigTags1(rName, tag1Key, tag1Value string) string {
return fmt.Sprintf(`
resource "aws_sfn_activity" "foo" {
name = "%s"
tags = {
%q = %q
}
}
`, rName, tag1Key, tag1Value)
}

func testAccAWSSfnActivityBasicConfigTags2(rName, tag1Key, tag1Value, tag2Key, tag2Value string) string {
return fmt.Sprintf(`
resource "aws_sfn_activity" "foo" {
name = "%s"
tags = {
%q = %q
%q = %q
}
}
`, rName, tag1Key, tag1Value, tag2Key, tag2Value)
}
59 changes: 59 additions & 0 deletions aws/resource_aws_sfn_state_machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ func resourceAwsSfnStateMachine() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"tags": tagsSchema(),
},
}
}
Expand Down Expand Up @@ -92,6 +93,17 @@ func resourceAwsSfnStateMachineCreate(d *schema.ResourceData, meta interface{})

d.SetId(*activity.StateMachineArn)

if v, ok := d.GetOk("tags"); ok {
input := &sfn.TagResourceInput{
ResourceArn: aws.String(d.Id()),
Tags: tagsFromMapSfn(v.(map[string]interface{})),
}
log.Printf("[DEBUG] Tagging SFN State Machine: %s", input)
_, err := conn.TagResource(input)
if err != nil {
return fmt.Errorf("error tagging SFN State Machine (%s): %s", d.Id(), input)
}
}
return resourceAwsSfnStateMachineRead(d, meta)
}

Expand Down Expand Up @@ -121,6 +133,17 @@ func resourceAwsSfnStateMachineRead(d *schema.ResourceData, meta interface{}) er
if err := d.Set("creation_date", sm.CreationDate.Format(time.RFC3339)); err != nil {
log.Printf("[DEBUG] Error setting creation_date: %s", err)
}
tagsResp, err := conn.ListTagsForResource(
&sfn.ListTagsForResourceInput{
ResourceArn: aws.String(d.Id()),
},
)
if err != nil {
return fmt.Errorf("error listing SFN Activity (%s) tags: %s", d.Id(), err)
}
if err := d.Set("tags", tagsToMapSfn(tagsResp.Tags)); err != nil {
return fmt.Errorf("error setting tags: %s", err)
}

return nil
}
Expand All @@ -145,6 +168,42 @@ func resourceAwsSfnStateMachineUpdate(d *schema.ResourceData, meta interface{})
return err
}

if d.HasChange("tags") {
oldTagsRaw, newTagsRaw := d.GetChange("tags")
oldTagsMap := oldTagsRaw.(map[string]interface{})
newTagsMap := newTagsRaw.(map[string]interface{})
createTags, removeTags := diffTagsSfn(tagsFromMapSfn(oldTagsMap), tagsFromMapSfn(newTagsMap))

if len(removeTags) > 0 {
removeTagKeys := make([]*string, len(removeTags))
for i, removeTag := range removeTags {
removeTagKeys[i] = removeTag.Key
}

input := &sfn.UntagResourceInput{
ResourceArn: aws.String(d.Id()),
TagKeys: removeTagKeys,
}

log.Printf("[DEBUG] Untagging State Function: %s", input)
if _, err := conn.UntagResource(input); err != nil {
return fmt.Errorf("error untagging State Function (%s): %s", d.Id(), err)
}
}

if len(createTags) > 0 {
input := &sfn.TagResourceInput{
ResourceArn: aws.String(d.Id()),
Tags: createTags,
}

log.Printf("[DEBUG] Tagging State Function: %s", input)
if _, err := conn.TagResource(input); err != nil {
return fmt.Errorf("error tagging State Function (%s): %s", d.Id(), err)
}
}
}

return resourceAwsSfnStateMachineRead(d, meta)
}

Expand Down
Loading

0 comments on commit 0ef5ea2

Please sign in to comment.