diff --git a/aws/data_source_aws_db_cluster_snapshot.go b/aws/data_source_aws_db_cluster_snapshot.go index 60e18afeb61..9b6913baa66 100644 --- a/aws/data_source_aws_db_cluster_snapshot.go +++ b/aws/data_source_aws_db_cluster_snapshot.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/rds" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func dataSourceAwsDbClusterSnapshot() *schema.Resource { @@ -178,9 +179,14 @@ func dataSourceAwsDbClusterSnapshotRead(d *schema.ResourceData, meta interface{} d.Set("storage_encrypted", snapshot.StorageEncrypted) d.Set("vpc_id", snapshot.VpcId) - // Fetch and save tags - if err := saveTagsRDS(conn, d, aws.StringValue(snapshot.DBClusterSnapshotArn)); err != nil { - log.Printf("[WARN] Failed to save tags for RDS DB Cluster Snapshot (%s): %s", aws.StringValue(snapshot.DBClusterSnapshotArn), err) + tags, err := keyvaluetags.RdsListTags(conn, d.Get("db_cluster_snapshot_arn").(string)) + + if err != nil { + return fmt.Errorf("error listing tags for RDS DB Cluster Snapshot (%s): %s", d.Get("db_cluster_snapshot_arn").(string), err) + } + + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } return nil diff --git a/aws/data_source_aws_db_instance.go b/aws/data_source_aws_db_instance.go index acc51f7794c..79f7d69210a 100644 --- a/aws/data_source_aws_db_instance.go +++ b/aws/data_source_aws_db_instance.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/rds" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func dataSourceAwsDbInstance() *schema.Resource { @@ -315,9 +316,14 @@ func dataSourceAwsDbInstanceRead(d *schema.ResourceData, meta interface{}) error return fmt.Errorf("Error setting vpc_security_groups attribute: %#v, error: %#v", vpcSecurityGroups, err) } - // Fetch and save tags - if err := saveTagsRDS(conn, d, aws.StringValue(dbInstance.DBInstanceArn)); err != nil { - log.Printf("[WARN] Failed to save tags for RDS Instance (%s): %s", aws.StringValue(dbInstance.DBInstanceArn), err) + tags, err := keyvaluetags.RdsListTags(conn, d.Get("db_instance_arn").(string)) + + if err != nil { + return fmt.Errorf("error listing tags for RDS DB Instance (%s): %s", d.Get("db_instance_arn").(string), err) + } + + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } return nil diff --git a/aws/resource_aws_db_cluster_snapshot.go b/aws/resource_aws_db_cluster_snapshot.go index 4c88dfa1575..8a0d1d82deb 100644 --- a/aws/resource_aws_db_cluster_snapshot.go +++ b/aws/resource_aws_db_cluster_snapshot.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/rds" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbClusterSnapshot() *schema.Resource { @@ -101,7 +102,7 @@ func resourceAwsDbClusterSnapshotCreate(d *schema.ResourceData, meta interface{} params := &rds.CreateDBClusterSnapshotInput{ DBClusterIdentifier: aws.String(d.Get("db_cluster_identifier").(string)), DBClusterSnapshotIdentifier: aws.String(d.Get("db_cluster_snapshot_identifier").(string)), - Tags: tagsFromMapRDS(d.Get("tags").(map[string]interface{})), + Tags: keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags(), } _, err := conn.CreateDBClusterSnapshot(params) @@ -170,8 +171,14 @@ func resourceAwsDbClusterSnapshotRead(d *schema.ResourceData, meta interface{}) d.Set("storage_encrypted", snapshot.StorageEncrypted) d.Set("vpc_id", snapshot.VpcId) - if err := saveTagsRDS(conn, d, aws.StringValue(snapshot.DBClusterSnapshotArn)); err != nil { - log.Printf("[WARN] Failed to save tags for RDS DB Cluster Snapshot (%s): %s", d.Id(), err) + tags, err := keyvaluetags.RdsListTags(conn, d.Get("db_cluster_snapshot_arn").(string)) + + if err != nil { + return fmt.Errorf("error listing tags for RDS DB Cluster Snapshot (%s): %s", d.Get("db_cluster_snapshot_arn").(string), err) + } + + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } return nil @@ -181,11 +188,13 @@ func resourceAwsdbClusterSnapshotUpdate(d *schema.ResourceData, meta interface{} conn := meta.(*AWSClient).rdsconn if d.HasChange("tags") { - if err := setTagsRDS(conn, d, d.Get("db_cluster_snapshot_arn").(string)); err != nil { - return err - } else { - d.SetPartial("tags") + o, n := d.GetChange("tags") + + if err := keyvaluetags.RdsUpdateTags(conn, d.Get("db_cluster_snapshot_arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS DB Cluster Snapshot (%s) tags: %s", d.Get("db_cluster_snapshot_arn").(string), err) } + + d.SetPartial("tags") } return nil diff --git a/aws/resource_aws_db_event_subscription.go b/aws/resource_aws_db_event_subscription.go index e8f30a824a8..bcb8b1840cc 100644 --- a/aws/resource_aws_db_event_subscription.go +++ b/aws/resource_aws_db_event_subscription.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/rds" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbEventSubscription() *schema.Resource { @@ -92,7 +93,7 @@ func resourceAwsDbEventSubscriptionCreate(d *schema.ResourceData, meta interface name = resource.UniqueId() } - tags := tagsFromMapRDS(d.Get("tags").(map[string]interface{})) + tags := keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags() sourceIdsSet := d.Get("source_ids").(*schema.Set) sourceIds := make([]*string, sourceIdsSet.Len()) @@ -125,10 +126,6 @@ func resourceAwsDbEventSubscriptionCreate(d *schema.ResourceData, meta interface d.SetId(aws.StringValue(output.EventSubscription.CustSubscriptionId)) - if err := setTagsRDS(conn, d, aws.StringValue(output.EventSubscription.EventSubscriptionArn)); err != nil { - return fmt.Errorf("Error creating RDS Event Subscription (%s) tags: %s", d.Id(), err) - } - log.Println( "[INFO] Waiting for RDS Event Subscription to be ready") @@ -194,20 +191,13 @@ func resourceAwsDbEventSubscriptionRead(d *schema.ResourceData, meta interface{} return err } - // list tags for resource - resp, err := conn.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: sub.EventSubscriptionArn, - }) + tags, err := keyvaluetags.RdsListTags(conn, d.Get("arn").(string)) if err != nil { - log.Printf("[DEBUG] Error retrieving tags for ARN: %s", aws.StringValue(sub.EventSubscriptionArn)) + return fmt.Errorf("error listing tags for RDS Event Subscription (%s): %s", d.Get("arn").(string), err) } - var dt []*rds.Tag - if len(resp.TagList) > 0 { - dt = resp.TagList - } - if err := d.Set("tags", tagsToMapRDS(dt)); err != nil { + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { return fmt.Errorf("error setting tags: %s", err) } @@ -309,9 +299,13 @@ func resourceAwsDbEventSubscriptionUpdate(d *schema.ResourceData, meta interface d.SetPartial("source_type") } - if err := setTagsRDS(conn, d, d.Get("arn").(string)); err != nil { - return err - } else { + if d.HasChange("tags") { + o, n := d.GetChange("tags") + + if err := keyvaluetags.RdsUpdateTags(conn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS Event Subscription (%s) tags: %s", d.Get("arn").(string), err) + } + d.SetPartial("tags") } diff --git a/aws/resource_aws_db_instance.go b/aws/resource_aws_db_instance.go index 19186e25475..221f8f86356 100644 --- a/aws/resource_aws_db_instance.go +++ b/aws/resource_aws_db_instance.go @@ -10,10 +10,10 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/rds" - "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbInstance() *schema.Resource { @@ -500,7 +500,7 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error // we expect everything to be in sync before returning completion. var requiresRebootDbInstance bool - tags := tagsFromMapRDS(d.Get("tags").(map[string]interface{})) + tags := keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags() var identifier string if v, ok := d.GetOk("identifier"); ok { @@ -1348,19 +1348,16 @@ func resourceAwsDbInstanceRead(d *schema.ResourceData, meta interface{}) error { arn := aws.StringValue(v.DBInstanceArn) d.Set("arn", arn) - resp, err := conn.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: aws.String(arn), - }) + + tags, err := keyvaluetags.RdsListTags(conn, d.Get("arn").(string)) if err != nil { - return fmt.Errorf("Error retrieving tags for ARN (%s): %s", arn, err) + return fmt.Errorf("error listing tags for RDS DB Instance (%s): %s", d.Get("arn").(string), err) } - var dt []*rds.Tag - if len(resp.TagList) > 0 { - dt = resp.TagList + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } - d.Set("tags", tagsToMapRDS(dt)) // Create an empty schema.Set to hold all vpc security group ids ids := &schema.Set{ @@ -1708,11 +1705,13 @@ func resourceAwsDbInstanceUpdate(d *schema.ResourceData, meta interface{}) error } if d.HasChange("tags") { - if err := setTagsRDS(conn, d, d.Get("arn").(string)); err != nil { - return err - } else { - d.SetPartial("tags") + o, n := d.GetChange("tags") + + if err := keyvaluetags.RdsUpdateTags(conn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS DB Instance (%s) tags: %s", d.Get("arn").(string), err) } + + d.SetPartial("tags") } d.Partial(false) diff --git a/aws/resource_aws_db_option_group.go b/aws/resource_aws_db_option_group.go index 8e394954788..5662c00afee 100644 --- a/aws/resource_aws_db_option_group.go +++ b/aws/resource_aws_db_option_group.go @@ -9,10 +9,10 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/rds" - "github.com/hashicorp/terraform-plugin-sdk/helper/hashcode" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbOptionGroup() *schema.Resource { @@ -124,7 +124,7 @@ func resourceAwsDbOptionGroup() *schema.Resource { func resourceAwsDbOptionGroupCreate(d *schema.ResourceData, meta interface{}) error { rdsconn := meta.(*AWSClient).rdsconn - tags := tagsFromMapRDS(d.Get("tags").(map[string]interface{})) + tags := keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags() var groupName string if v, ok := d.GetOk("name"); ok { @@ -201,15 +201,13 @@ func resourceAwsDbOptionGroupRead(d *schema.ResourceData, meta interface{}) erro return fmt.Errorf("error setting option: %s", err) } - resp, err := rdsconn.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: option.OptionGroupArn, - }) + tags, err := keyvaluetags.RdsListTags(rdsconn, d.Get("arn").(string)) if err != nil { - return fmt.Errorf("error listing tags for RDS Option Group (%s): %s", d.Id(), err) + return fmt.Errorf("error listing tags for RDS Option Group (%s): %s", d.Get("arn").(string), err) } - if err := d.Set("tags", tagsToMapRDS(resp.TagList)); err != nil { + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { return fmt.Errorf("error setting tags: %s", err) } @@ -291,9 +289,13 @@ func resourceAwsDbOptionGroupUpdate(d *schema.ResourceData, meta interface{}) er } } - if err := setTagsRDS(rdsconn, d, d.Get("arn").(string)); err != nil { - return err - } else { + if d.HasChange("tags") { + o, n := d.GetChange("tags") + + if err := keyvaluetags.RdsUpdateTags(rdsconn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS Option Group (%s) tags: %s", d.Get("arn").(string), err) + } + d.SetPartial("tags") } diff --git a/aws/resource_aws_db_parameter_group.go b/aws/resource_aws_db_parameter_group.go index abbf58ebe2a..897ead32611 100644 --- a/aws/resource_aws_db_parameter_group.go +++ b/aws/resource_aws_db_parameter_group.go @@ -7,12 +7,12 @@ import ( "strings" "time" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/rds" "github.com/hashicorp/terraform-plugin-sdk/helper/hashcode" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/rds" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbParameterGroup() *schema.Resource { @@ -88,7 +88,7 @@ func resourceAwsDbParameterGroup() *schema.Resource { func resourceAwsDbParameterGroupCreate(d *schema.ResourceData, meta interface{}) error { rdsconn := meta.(*AWSClient).rdsconn - tags := tagsFromMapRDS(d.Get("tags").(map[string]interface{})) + tags := keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags() var groupName string if v, ok := d.GetOk("name"); ok { @@ -230,19 +230,15 @@ func resourceAwsDbParameterGroupRead(d *schema.ResourceData, meta interface{}) e arn := aws.StringValue(describeResp.DBParameterGroups[0].DBParameterGroupArn) d.Set("arn", arn) - resp, err := rdsconn.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: aws.String(arn), - }) + tags, err := keyvaluetags.RdsListTags(rdsconn, d.Get("arn").(string)) if err != nil { - log.Printf("[DEBUG] Error retrieving tags for ARN: %s", arn) + return fmt.Errorf("error listing tags for RDS DB Parameter Group (%s): %s", d.Get("arn").(string), err) } - var dt []*rds.Tag - if len(resp.TagList) > 0 { - dt = resp.TagList + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } - d.Set("tags", tagsToMapRDS(dt)) return nil } @@ -296,9 +292,13 @@ func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{}) } } - if err := setTagsRDS(rdsconn, d, d.Get("arn").(string)); err != nil { - return err - } else { + if d.HasChange("tags") { + o, n := d.GetChange("tags") + + if err := keyvaluetags.RdsUpdateTags(rdsconn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS DB Parameter Group (%s) tags: %s", d.Get("arn").(string), err) + } + d.SetPartial("tags") } diff --git a/aws/resource_aws_db_security_group.go b/aws/resource_aws_db_security_group.go index 8d3e51183ae..9164ec903a9 100644 --- a/aws/resource_aws_db_security_group.go +++ b/aws/resource_aws_db_security_group.go @@ -8,11 +8,11 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/rds" - "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform-plugin-sdk/helper/hashcode" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbSecurityGroup() *schema.Resource { @@ -83,7 +83,7 @@ func resourceAwsDbSecurityGroup() *schema.Resource { func resourceAwsDbSecurityGroupCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).rdsconn - tags := tagsFromMapRDS(d.Get("tags").(map[string]interface{})) + tags := keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags() var err error var errs []error @@ -179,19 +179,16 @@ func resourceAwsDbSecurityGroupRead(d *schema.ResourceData, meta interface{}) er arn := aws.StringValue(sg.DBSecurityGroupArn) d.Set("arn", arn) - resp, err := conn.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: aws.String(arn), - }) + + tags, err := keyvaluetags.RdsListTags(conn, d.Get("arn").(string)) if err != nil { - log.Printf("[DEBUG] Error retrieving tags for ARN: %s", arn) + return fmt.Errorf("error listing tags for RDS DB Security Group (%s): %s", d.Get("arn").(string), err) } - var dt []*rds.Tag - if len(resp.TagList) > 0 { - dt = resp.TagList + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } - d.Set("tags", tagsToMapRDS(dt)) return nil } @@ -201,9 +198,13 @@ func resourceAwsDbSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) d.Partial(true) - if err := setTagsRDS(conn, d, d.Get("arn").(string)); err != nil { - return err - } else { + if d.HasChange("tags") { + o, n := d.GetChange("tags") + + if err := keyvaluetags.RdsUpdateTags(conn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS DB Security Group (%s) tags: %s", d.Get("arn").(string), err) + } + d.SetPartial("tags") } diff --git a/aws/resource_aws_db_snapshot.go b/aws/resource_aws_db_snapshot.go index 3fc9746e1f9..62ec2beca68 100644 --- a/aws/resource_aws_db_snapshot.go +++ b/aws/resource_aws_db_snapshot.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/service/rds" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbSnapshot() *schema.Resource { @@ -109,7 +110,7 @@ func resourceAwsDbSnapshot() *schema.Resource { func resourceAwsDbSnapshotCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).rdsconn - tags := tagsFromMapRDS(d.Get("tags").(map[string]interface{})) + tags := keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags() dBInstanceIdentifier := d.Get("db_instance_identifier").(string) params := &rds.CreateDBSnapshotInput{ @@ -178,8 +179,15 @@ func resourceAwsDbSnapshotRead(d *schema.ResourceData, meta interface{}) error { d.Set("snapshot_type", snapshot.SnapshotType) d.Set("status", snapshot.Status) d.Set("vpc_id", snapshot.VpcId) - if err := saveTagsRDS(conn, d, aws.StringValue(snapshot.DBSnapshotArn)); err != nil { - log.Printf("[WARN] Failed to save tags for RDS Snapshot (%s): %s", d.Id(), err) + + tags, err := keyvaluetags.RdsListTags(conn, d.Get("db_snapshot_arn").(string)) + + if err != nil { + return fmt.Errorf("error listing tags for RDS DB Snapshot (%s): %s", d.Get("db_snapshot_arn").(string), err) + } + + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } return nil @@ -205,41 +213,15 @@ func resourceAwsDbSnapshotDelete(d *schema.ResourceData, meta interface{}) error func resourceAwsDbSnapshotUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).rdsconn - arn := d.Get("db_snapshot_arn").(string) - if d.HasChange("tags") { - oldTagsRaw, newTagsRaw := d.GetChange("tags") - oldTagsMap := oldTagsRaw.(map[string]interface{}) - newTagsMap := newTagsRaw.(map[string]interface{}) - createTags, removeTags := diffTagsRDS(tagsFromMapRDS(oldTagsMap), tagsFromMapRDS(newTagsMap)) - - if len(removeTags) > 0 { - removeTagKeys := make([]*string, len(removeTags)) - for i, removeTag := range removeTags { - removeTagKeys[i] = removeTag.Key - } - - input := &rds.RemoveTagsFromResourceInput{ - ResourceName: aws.String(arn), - TagKeys: removeTagKeys, - } - - log.Printf("[DEBUG] Untagging DB Snapshot: %s", input) - if _, err := conn.RemoveTagsFromResource(input); err != nil { - return fmt.Errorf("error untagging DB Snapshot (%s): %s", d.Id(), err) - } - } - if len(createTags) > 0 { - input := &rds.AddTagsToResourceInput{ - ResourceName: aws.String(arn), - Tags: createTags, - } + if d.HasChange("tags") { + o, n := d.GetChange("tags") - log.Printf("[DEBUG] Tagging DB Snapshot: %s", input) - if _, err := conn.AddTagsToResource(input); err != nil { - return fmt.Errorf("error tagging DB Snapshot (%s): %s", d.Id(), err) - } + if err := keyvaluetags.RdsUpdateTags(conn, d.Get("db_snapshot_arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS DB Snapshot (%s) tags: %s", d.Get("db_snapshot_arn").(string), err) } + + d.SetPartial("tags") } return nil diff --git a/aws/resource_aws_db_subnet_group.go b/aws/resource_aws_db_subnet_group.go index 3e42cc9d349..80a29a1d320 100644 --- a/aws/resource_aws_db_subnet_group.go +++ b/aws/resource_aws_db_subnet_group.go @@ -9,9 +9,9 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/rds" - "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsDbSubnetGroup() *schema.Resource { @@ -67,7 +67,7 @@ func resourceAwsDbSubnetGroup() *schema.Resource { func resourceAwsDbSubnetGroupCreate(d *schema.ResourceData, meta interface{}) error { rdsconn := meta.(*AWSClient).rdsconn - tags := tagsFromMapRDS(d.Get("tags").(map[string]interface{})) + tags := keyvaluetags.New(d.Get("tags").(map[string]interface{})).IgnoreAws().RdsTags() subnetIdsSet := d.Get("subnet_ids").(*schema.Set) subnetIds := make([]*string, subnetIdsSet.Len()) @@ -146,25 +146,20 @@ func resourceAwsDbSubnetGroupRead(d *schema.ResourceData, meta interface{}) erro } d.Set("subnet_ids", subnets) - // list tags for resource - // set tags conn := meta.(*AWSClient).rdsconn arn := aws.StringValue(subnetGroup.DBSubnetGroupArn) d.Set("arn", arn) - resp, err := conn.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: aws.String(arn), - }) + + tags, err := keyvaluetags.RdsListTags(conn, d.Get("arn").(string)) if err != nil { - log.Printf("[DEBUG] Error retreiving tags for ARN: %s", arn) + return fmt.Errorf("error listing tags for RDS DB Subnet Group (%s): %s", d.Get("arn").(string), err) } - var dt []*rds.Tag - if len(resp.TagList) > 0 { - dt = resp.TagList + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) } - d.Set("tags", tagsToMapRDS(dt)) return nil } @@ -194,10 +189,13 @@ func resourceAwsDbSubnetGroupUpdate(d *schema.ResourceData, meta interface{}) er } } - arn := d.Get("arn").(string) - if err := setTagsRDS(conn, d, arn); err != nil { - return err - } else { + if d.HasChange("tags") { + o, n := d.GetChange("tags") + + if err := keyvaluetags.RdsUpdateTags(conn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating RDS DB Subnet Group (%s) tags: %s", d.Get("arn").(string), err) + } + d.SetPartial("tags") } diff --git a/aws/tagsRDS.go b/aws/tagsRDS.go deleted file mode 100644 index 9ec4206920a..00000000000 --- a/aws/tagsRDS.go +++ /dev/null @@ -1,134 +0,0 @@ -package aws - -import ( - "fmt" - "log" - "regexp" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/rds" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" -) - -// setTags is a helper to set the tags for a resource. It expects the -// tags field to be named "tags" -func setTagsRDS(conn *rds.RDS, d *schema.ResourceData, arn string) error { - if d.HasChange("tags") { - oraw, nraw := d.GetChange("tags") - o := oraw.(map[string]interface{}) - n := nraw.(map[string]interface{}) - create, remove := diffTagsRDS(tagsFromMapRDS(o), tagsFromMapRDS(n)) - - // Set tags - if len(remove) > 0 { - log.Printf("[DEBUG] Removing tags: %s", remove) - k := make([]*string, len(remove)) - for i, t := range remove { - k[i] = t.Key - } - - _, err := conn.RemoveTagsFromResource(&rds.RemoveTagsFromResourceInput{ - ResourceName: aws.String(arn), - TagKeys: k, - }) - if err != nil { - return err - } - } - if len(create) > 0 { - log.Printf("[DEBUG] Creating tags: %s", create) - _, err := conn.AddTagsToResource(&rds.AddTagsToResourceInput{ - ResourceName: aws.String(arn), - Tags: create, - }) - if err != nil { - return err - } - } - } - - return nil -} - -// diffTags takes our tags locally and the ones remotely and returns -// the set of tags that must be created, and the set of tags that must -// be destroyed. -func diffTagsRDS(oldTags, newTags []*rds.Tag) ([]*rds.Tag, []*rds.Tag) { - // First, we're creating everything we have - create := make(map[string]interface{}) - for _, t := range newTags { - create[*t.Key] = *t.Value - } - - // Build the list of what to remove - var remove []*rds.Tag - for _, t := range oldTags { - old, ok := create[*t.Key] - if !ok || old != *t.Value { - // Delete it! - remove = append(remove, t) - } - } - - return tagsFromMapRDS(create), remove -} - -// tagsFromMap returns the tags for the given map of data. -func tagsFromMapRDS(m map[string]interface{}) []*rds.Tag { - result := make([]*rds.Tag, 0, len(m)) - for k, v := range m { - t := &rds.Tag{ - Key: aws.String(k), - Value: aws.String(v.(string)), - } - if !tagIgnoredRDS(t) { - result = append(result, t) - } - } - - return result -} - -// tagsToMap turns the list of tags into a map. -func tagsToMapRDS(ts []*rds.Tag) map[string]string { - result := make(map[string]string) - for _, t := range ts { - if !tagIgnoredRDS(t) { - result[*t.Key] = *t.Value - } - } - - return result -} - -func saveTagsRDS(conn *rds.RDS, d *schema.ResourceData, arn string) error { - resp, err := conn.ListTagsForResource(&rds.ListTagsForResourceInput{ - ResourceName: aws.String(arn), - }) - - if err != nil { - return fmt.Errorf("Error retreiving tags for ARN: %s", arn) - } - - var dt []*rds.Tag - if len(resp.TagList) > 0 { - dt = resp.TagList - } - - return d.Set("tags", tagsToMapRDS(dt)) -} - -// compare a tag against a list of strings and checks if it should -// be ignored or not -func tagIgnoredRDS(t *rds.Tag) bool { - filter := []string{"^aws:"} - for _, v := range filter { - log.Printf("[DEBUG] Matching %v with %v\n", v, *t.Key) - r, _ := regexp.MatchString(v, *t.Key) - if r { - log.Printf("[DEBUG] Found AWS specific tag %s (val: %s), ignoring.\n", *t.Key, *t.Value) - return true - } - } - return false -} diff --git a/aws/tagsRDS_test.go b/aws/tagsRDS_test.go deleted file mode 100644 index 9eceb271792..00000000000 --- a/aws/tagsRDS_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package aws - -import ( - "reflect" - "testing" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/rds" -) - -func TestDiffRDSTags(t *testing.T) { - cases := []struct { - Old, New map[string]interface{} - Create, Remove map[string]string - }{ - // Basic add/remove - { - Old: map[string]interface{}{ - "foo": "bar", - }, - New: map[string]interface{}{ - "bar": "baz", - }, - Create: map[string]string{ - "bar": "baz", - }, - Remove: map[string]string{ - "foo": "bar", - }, - }, - - // Modify - { - Old: map[string]interface{}{ - "foo": "bar", - }, - New: map[string]interface{}{ - "foo": "baz", - }, - Create: map[string]string{ - "foo": "baz", - }, - Remove: map[string]string{ - "foo": "bar", - }, - }, - } - - for i, tc := range cases { - c, r := diffTagsRDS(tagsFromMapRDS(tc.Old), tagsFromMapRDS(tc.New)) - cm := tagsToMapRDS(c) - rm := tagsToMapRDS(r) - if !reflect.DeepEqual(cm, tc.Create) { - t.Fatalf("%d: bad create: %#v", i, cm) - } - if !reflect.DeepEqual(rm, tc.Remove) { - t.Fatalf("%d: bad remove: %#v", i, rm) - } - } -} - -func TestIgnoringTagsRDS(t *testing.T) { - var ignoredTags []*rds.Tag - ignoredTags = append(ignoredTags, &rds.Tag{ - Key: aws.String("aws:cloudformation:logical-id"), - Value: aws.String("foo"), - }) - ignoredTags = append(ignoredTags, &rds.Tag{ - Key: aws.String("aws:foo:bar"), - Value: aws.String("baz"), - }) - for _, tag := range ignoredTags { - if !tagIgnoredRDS(tag) { - t.Fatalf("Tag %v with value %v not ignored, but should be!", *tag.Key, *tag.Value) - } - } -}