Skip to content

Commit

Permalink
Merge pull request #30533 from hashicorp/td-transparent-tagging-phase…
Browse files Browse the repository at this point in the history
…3c-e

Tech debt: Reduce `tags` boilerplate code - Plugin SDK resources `e*` (Phase 3c)
  • Loading branch information
ewbankkit authored Apr 10, 2023
2 parents 0cc2d9c + f57a4ca commit 95eda84
Show file tree
Hide file tree
Showing 65 changed files with 929 additions and 2,116 deletions.
3 changes: 3 additions & 0 deletions .changelog/30533.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/aws_elasticache_user_group: Change `user_group_id` to [ForceNew](https://developer.hashicorp.com/terraform/plugin/sdkv2/schemas/schema-behaviors#forcenew)
```
23 changes: 10 additions & 13 deletions internal/provider/fwprovider/intercept.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,11 @@ func (r tagsInterceptor) create(ctx context.Context, request resource.CreateRequ
return ctx, diags
}

inContext, ok := conns.FromContext(ctx)
if !ok {
return ctx, diags
}

tagsInContext, ok := tftags.FromContext(ctx)
if !ok {
return ctx, diags
Expand All @@ -312,14 +317,14 @@ func (r tagsInterceptor) create(ctx context.Context, request resource.CreateRequ
// Merge the resource's configured tags with any provider configured default_tags.
tags := tagsInContext.DefaultConfig.MergeTags(tftags.New(ctx, planTags))
// Remove system tags.
tags = tags.IgnoreAWS()
tags = tags.IgnoreSystem(inContext.ServicePackageName)

tagsInContext.TagsIn = types.Some(tags)
case After:
// Set values for unknowns.
// Remove any provider configured ignore_tags and system tags from those passed to the service API.
// Computed tags_all include any provider configured default_tags.
stateTagsAll := flex.FlattenFrameworkStringValueMapLegacy(ctx, tagsInContext.TagsIn.MustUnwrap().IgnoreAWS().IgnoreConfig(tagsInContext.IgnoreConfig).Map())
stateTagsAll := flex.FlattenFrameworkStringValueMapLegacy(ctx, tagsInContext.TagsIn.MustUnwrap().IgnoreSystem(inContext.ServicePackageName).IgnoreConfig(tagsInContext.IgnoreConfig).Map())
diags.Append(response.State.SetAttribute(ctx, path.Root(names.AttrTagsAll), &stateTagsAll)...)

if diags.HasError() {
Expand All @@ -336,25 +341,21 @@ func (r tagsInterceptor) read(ctx context.Context, request resource.ReadRequest,
}

inContext, ok := conns.FromContext(ctx)

if !ok {
return ctx, diags
}

sp, ok := meta.ServicePackages[inContext.ServicePackageName]

if !ok {
return ctx, diags
}

serviceName, err := names.HumanFriendly(inContext.ServicePackageName)

if err != nil {
serviceName = "<service>"
}

resourceName := inContext.ResourceName

if resourceName == "" {
resourceName = "<thing>"
}
Expand Down Expand Up @@ -409,7 +410,7 @@ func (r tagsInterceptor) read(ctx context.Context, request resource.ReadRequest,
stateTags := tftags.Null
// Remove any provider configured ignore_tags and system tags from those returned from the service API.
// The resource's configured tags do not include any provider configured default_tags.
if v := apiTags.IgnoreAWS().IgnoreConfig(tagsInContext.IgnoreConfig).RemoveDefaultConfig(tagsInContext.DefaultConfig).Map(); len(v) > 0 {
if v := apiTags.IgnoreSystem(inContext.ServicePackageName).IgnoreConfig(tagsInContext.IgnoreConfig).RemoveDefaultConfig(tagsInContext.DefaultConfig).Map(); len(v) > 0 {
stateTags = flex.FlattenFrameworkStringValueMapLegacy(ctx, v)
}
diags.Append(response.State.SetAttribute(ctx, path.Root(names.AttrTags), &stateTags)...)
Expand All @@ -419,7 +420,7 @@ func (r tagsInterceptor) read(ctx context.Context, request resource.ReadRequest,
}

// Computed tags_all do.
stateTagsAll := flex.FlattenFrameworkStringValueMapLegacy(ctx, apiTags.IgnoreAWS().IgnoreConfig(tagsInContext.IgnoreConfig).Map())
stateTagsAll := flex.FlattenFrameworkStringValueMapLegacy(ctx, apiTags.IgnoreSystem(inContext.ServicePackageName).IgnoreConfig(tagsInContext.IgnoreConfig).Map())
diags.Append(response.State.SetAttribute(ctx, path.Root(names.AttrTagsAll), &stateTagsAll)...)

if diags.HasError() {
Expand All @@ -436,25 +437,21 @@ func (r tagsInterceptor) update(ctx context.Context, request resource.UpdateRequ
}

inContext, ok := conns.FromContext(ctx)

if !ok {
return ctx, diags
}

sp, ok := meta.ServicePackages[inContext.ServicePackageName]

if !ok {
return ctx, diags
}

serviceName, err := names.HumanFriendly(inContext.ServicePackageName)

if err != nil {
serviceName = "<service>"
}

resourceName := inContext.ResourceName

if resourceName == "" {
resourceName = "<thing>"
}
Expand All @@ -476,7 +473,7 @@ func (r tagsInterceptor) update(ctx context.Context, request resource.UpdateRequ
// Merge the resource's configured tags with any provider configured default_tags.
tags := tagsInContext.DefaultConfig.MergeTags(tftags.New(ctx, planTags))
// Remove system tags.
tags = tags.IgnoreAWS()
tags = tags.IgnoreSystem(inContext.ServicePackageName)

tagsInContext.TagsIn = types.Some(tags)

Expand Down
8 changes: 2 additions & 6 deletions internal/provider/intercept.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,25 +187,21 @@ func (r tagsInterceptor) run(ctx context.Context, d *schema.ResourceData, meta a
}

inContext, ok := conns.FromContext(ctx)

if !ok {
return ctx, diags
}

sp, ok := meta.(*conns.AWSClient).ServicePackages[inContext.ServicePackageName]

if !ok {
return ctx, diags
}

serviceName, err := names.HumanFriendly(inContext.ServicePackageName)

if err != nil {
serviceName = "<service>"
}

resourceName := inContext.ResourceName

if resourceName == "" {
resourceName = "<thing>"
}
Expand All @@ -222,7 +218,7 @@ func (r tagsInterceptor) run(ctx context.Context, d *schema.ResourceData, meta a
// Merge the resource's configured tags with any provider configured default_tags.
tags := tagsInContext.DefaultConfig.MergeTags(tftags.New(ctx, d.Get(names.AttrTags).(map[string]interface{})))
// Remove system tags.
tags = tags.IgnoreAWS()
tags = tags.IgnoreSystem(inContext.ServicePackageName)

tagsInContext.TagsIn = types.Some(tags)

Expand Down Expand Up @@ -321,7 +317,7 @@ func (r tagsInterceptor) run(ctx context.Context, d *schema.ResourceData, meta a
}

// Remove any provider configured ignore_tags and system tags from those returned from the service API.
tags := tagsInContext.TagsOut.UnwrapOrDefault().IgnoreAWS().IgnoreConfig(tagsInContext.IgnoreConfig)
tags := tagsInContext.TagsOut.UnwrapOrDefault().IgnoreSystem(inContext.ServicePackageName).IgnoreConfig(tagsInContext.IgnoreConfig)

// The resource's configured tags do not include any provider configured default_tags.
if err := d.Set(names.AttrTags, tags.RemoveDefaultConfig(tagsInContext.DefaultConfig).Map()); err != nil {
Expand Down
57 changes: 6 additions & 51 deletions internal/service/ecr/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import (
"github.com/hashicorp/terraform-provider-aws/names"
)

// @SDKResource("aws_ecr_repository")
// @SDKResource("aws_ecr_repository", name="Repository")
// @Tags(identifierAttribute="arn")
func ResourceRepository() *schema.Resource {
return &schema.Resource{
CreateWithoutTimeout: resourceRepositoryCreate,
Expand Down Expand Up @@ -106,8 +107,8 @@ func ResourceRepository() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"tags": tftags.TagsSchema(),
"tags_all": tftags.TagsSchemaComputed(),
names.AttrTags: tftags.TagsSchema(),
names.AttrTagsAll: tftags.TagsSchemaComputed(),
},
}
}
Expand All @@ -119,14 +120,13 @@ const (
func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).ECRConn()
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
tags := defaultTagsConfig.MergeTags(tftags.New(ctx, d.Get("tags").(map[string]interface{})))

name := d.Get("name").(string)
input := &ecr.CreateRepositoryInput{
EncryptionConfiguration: expandRepositoryEncryptionConfiguration(d.Get("encryption_configuration").([]interface{})),
ImageTagMutability: aws.String(d.Get("image_tag_mutability").(string)),
RepositoryName: aws.String(name),
Tags: GetTagsIn(ctx),
}

if v, ok := d.GetOk("image_scanning_configuration"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil {
Expand All @@ -136,10 +136,6 @@ func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, meta
}
}

if len(tags) > 0 {
input.Tags = Tags(tags.IgnoreAWS())
}

output, err := conn.CreateRepositoryWithContext(ctx, input)

// Some partitions (i.e., ISO) may not support tag-on-create
Expand All @@ -157,7 +153,7 @@ func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, meta
d.SetId(aws.StringValue(output.Repository.RepositoryName))

// Some partitions (i.e., ISO) may not support tag-on-create, attempt tag after create
if input.Tags == nil && len(tags) > 0 && meta.(*conns.AWSClient).Partition != endpoints.AwsPartitionID {
if tags := KeyValueTags(ctx, GetTagsIn(ctx)); input.Tags == nil && len(tags) > 0 && meta.(*conns.AWSClient).Partition != endpoints.AwsPartitionID {
err := UpdateTags(ctx, conn, aws.StringValue(output.Repository.RepositoryArn), nil, tags)

// If default tags only, log and continue. Otherwise, error.
Expand All @@ -177,8 +173,6 @@ func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, meta
func resourceRepositoryRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).ECRConn()
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

outputRaw, err := tfresource.RetryWhenNewResourceNotFound(ctx, propagationTimeout, func() (interface{}, error) {
return FindRepositoryByName(ctx, conn, d.Id())
Expand Down Expand Up @@ -210,29 +204,6 @@ func resourceRepositoryRead(ctx context.Context, d *schema.ResourceData, meta in
d.Set("registry_id", repository.RegistryId)
d.Set("repository_url", repository.RepositoryUri)

tags, err := ListTags(ctx, conn, arn)

// Some partitions (i.e., ISO) may not support tagging, giving error
if meta.(*conns.AWSClient).Partition != endpoints.AwsPartitionID && verify.ErrorISOUnsupported(conn.PartitionID, err) {
log.Printf("[WARN] failed listing tags for ECR Repository (%s): %s", d.Id(), err)
return diags
}

if err != nil {
return sdkdiag.AppendErrorf(diags, "listing tags for ECR Repository (%s): %s", d.Id(), err)
}

tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig)

//lintignore:AWSR002
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
return sdkdiag.AppendErrorf(diags, "setting tags: %s", err)
}

if err := d.Set("tags_all", tags.Map()); err != nil {
return sdkdiag.AppendErrorf(diags, "setting tags_all: %s", err)
}

return diags
}

Expand Down Expand Up @@ -273,22 +244,6 @@ func resourceRepositoryUpdate(ctx context.Context, d *schema.ResourceData, meta
}
}

if d.HasChange("tags_all") {
o, n := d.GetChange("tags_all")

err := UpdateTags(ctx, conn, d.Get("arn").(string), o, n)

// Some partitions may not support tagging, giving error
if meta.(*conns.AWSClient).Partition != endpoints.AwsPartitionID && verify.ErrorISOUnsupported(conn.PartitionID, err) {
log.Printf("[WARN] failed updating tags for ECR Repository (%s): %s", d.Id(), err)
return append(diags, resourceRepositoryRead(ctx, d, meta)...)
}

if err != nil {
return sdkdiag.AppendErrorf(diags, "updating ECR Repository (%s) tags: %s", d.Id(), err)
}
}

return append(diags, resourceRepositoryRead(ctx, d, meta)...)
}

Expand Down
4 changes: 4 additions & 0 deletions internal/service/ecr/service_package_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 6 additions & 37 deletions internal/service/ecrpublic/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@ import (
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
"github.com/hashicorp/terraform-provider-aws/internal/verify"
"github.com/hashicorp/terraform-provider-aws/names"
)

// @SDKResource("aws_ecrpublic_repository")
// @SDKResource("aws_ecrpublic_repository", name="Repository")
// @Tags(identifierAttribute="arn")
func ResourceRepository() *schema.Resource {
return &schema.Resource{
CreateWithoutTimeout: resourceRepositoryCreate,
Expand Down Expand Up @@ -113,32 +115,25 @@ func ResourceRepository() *schema.Resource {
Type: schema.TypeString,
Computed: true,
},
"tags": tftags.TagsSchema(),
"tags_all": tftags.TagsSchemaComputed(),
names.AttrTags: tftags.TagsSchema(),
names.AttrTagsAll: tftags.TagsSchemaComputed(),
},
}
}

func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).ECRPublicConn()
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
tags := defaultTagsConfig.MergeTags(tftags.New(ctx, d.Get("tags").(map[string]interface{})))

input := ecrpublic.CreateRepositoryInput{
RepositoryName: aws.String(d.Get("repository_name").(string)),
Tags: GetTagsIn(ctx),
}

if v, ok := d.GetOk("catalog_data"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil {
input.CatalogData = expandRepositoryCatalogData(v.([]interface{})[0].(map[string]interface{}))
}

if len(tags) > 0 {
input.Tags = Tags(tags.IgnoreAWS())
}

log.Printf("[DEBUG] Creating ECR Public repository: %#v", input)

out, err := conn.CreateRepositoryWithContext(ctx, &input)
if err != nil {
return sdkdiag.AppendErrorf(diags, "creating ECR Public repository: %s", err)
Expand All @@ -160,8 +155,6 @@ func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, meta
func resourceRepositoryRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).ECRPublicConn()
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

log.Printf("[DEBUG] Reading ECR Public repository %s", d.Id())
var out *ecrpublic.DescribeRepositoriesOutput
Expand Down Expand Up @@ -237,19 +230,6 @@ func resourceRepositoryRead(ctx context.Context, d *schema.ResourceData, meta in
d.Set("catalog_data", nil)
}

tags, err := ListTags(ctx, conn, aws.StringValue(repository.RepositoryArn))

tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig)

//lintignore:AWSR002
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
return sdkdiag.AppendErrorf(diags, "setting tags: %s", err)
}

if err := d.Set("tags_all", tags.Map()); err != nil {
return sdkdiag.AppendErrorf(diags, "setting tags_all: %s", err)
}

return diags
}

Expand Down Expand Up @@ -310,7 +290,6 @@ func resourceRepositoryDelete(ctx context.Context, d *schema.ResourceData, meta

func resourceRepositoryUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
arn := d.Get("arn").(string)
conn := meta.(*conns.AWSClient).ECRPublicConn()

if d.HasChange("catalog_data") {
Expand All @@ -319,16 +298,6 @@ func resourceRepositoryUpdate(ctx context.Context, d *schema.ResourceData, meta
}
}

if d.HasChange("tags_all") {
o, n := d.GetChange("tags_all")

err := UpdateTags(ctx, conn, arn, o, n)

if err != nil {
return sdkdiag.AppendErrorf(diags, "updating tags for ECR Public Repository (%s): %s", d.Id(), err)
}
}

return append(diags, resourceRepositoryRead(ctx, d, meta)...)
}

Expand Down
Loading

0 comments on commit 95eda84

Please sign in to comment.