Skip to content

Commit

Permalink
Merge pull request #39761 from hashicorp/td-ignore-tags-config-function
Browse files Browse the repository at this point in the history
provider: Converts `conns.AWSClient` `IgnoreTagsConfig` to function and adds transparent tagging to several data sources
  • Loading branch information
gdavison authored Oct 18, 2024
2 parents 5842279 + 0783fd0 commit 86856ac
Show file tree
Hide file tree
Showing 220 changed files with 15,213 additions and 762 deletions.
2 changes: 1 addition & 1 deletion .ci/providerlint/passes/AWSR002/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ d.Set("tags", keyvaluetags.Ec2KeyValueTags(subnet.Tags).IgnoreAws().Map())
## Passing Code

```go
ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig
ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig(ctx)

d.Set("tags", keyvaluetags.Ec2KeyValueTags(subnet.Tags).IgnoreAws().IgnoreConfig(ignoreTagsConfig).Map())
```
Expand Down
4 changes: 2 additions & 2 deletions docs/resource-tagging.md
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ In the resource `Read` operation, implement the logic to convert the service tag
```go
// Typically declared near conn := /*...*/
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig(ctx)
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig(ctx)

/* ... other d.Set(...) logic ... */

Expand All @@ -429,7 +429,7 @@ use the generated `listTags` function, e.g., with Athena Workgroups:
```go
// Typically declared near conn := /*...*/
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig(ctx)
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig(ctx)

/* ... other d.Set(...) logic ... */

Expand Down
6 changes: 5 additions & 1 deletion internal/conns/awsclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import (
type AWSClient struct {
AccountID string
defaultTagsConfig *tftags.DefaultConfig
IgnoreTagsConfig *tftags.IgnoreConfig
ignoreTagsConfig *tftags.IgnoreConfig
Partition string
Region string
ServicePackages map[string]ServicePackage
Expand Down Expand Up @@ -59,6 +59,10 @@ func (c *AWSClient) DefaultTagsConfig(context.Context) *tftags.DefaultConfig {
return c.defaultTagsConfig
}

func (c *AWSClient) IgnoreTagsConfig(context.Context) *tftags.IgnoreConfig {
return c.ignoreTagsConfig
}

func (c *AWSClient) AwsConfig(context.Context) aws_sdkv2.Config { // nosemgrep:ci.aws-in-func-name
return c.awsConfig.Copy()
}
Expand Down
2 changes: 1 addition & 1 deletion internal/conns/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ func (c *Config) ConfigureProvider(ctx context.Context, client *AWSClient) (*AWS
client.AccountID = accountID
client.defaultTagsConfig = c.DefaultTagsConfig
client.dnsSuffix = dnsSuffix
client.IgnoreTagsConfig = c.IgnoreTagsConfig
client.ignoreTagsConfig = c.IgnoreTagsConfig
client.Partition = partition
client.Region = c.Region
client.SetHTTPClient(ctx, session.Config.HTTPClient) // Must be called while client.Session is nil.
Expand Down
5 changes: 5 additions & 0 deletions internal/conns/testing.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,8 @@ import (
func SetDefaultTagsConfig(client *AWSClient, d *tftags.DefaultConfig) {
client.defaultTagsConfig = d
}

// SetIgnoreTagsConfig is only intended for use in tests
func SetIgnoreTagsConfig(client *AWSClient, i *tftags.IgnoreConfig) {
client.ignoreTagsConfig = i
}
2 changes: 1 addition & 1 deletion internal/framework/resource_with_configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func (r *ResourceWithConfigure) SetTagsAll(ctx context.Context, request resource
}

defaultTagsConfig := r.Meta().DefaultTagsConfig(ctx)
ignoreTagsConfig := r.Meta().IgnoreTagsConfig
ignoreTagsConfig := r.Meta().IgnoreTagsConfig(ctx)

var planTags tftags.Map

Expand Down
4 changes: 4 additions & 0 deletions internal/generate/tagstests/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -777,6 +777,10 @@ func (v *visitor) processFuncDecl(funcDecl *ast.FuncDecl) {

if tagged {
if !skip {
if d.Name == "" {
v.errs = append(v.errs, fmt.Errorf("no name parameter set: %s", fmt.Sprintf("%s.%s", v.packageName, v.functionName)))
return
}
if !hasIdentifierAttribute && len(d.overrideIdentifierAttribute) == 0 {
v.errs = append(v.errs, fmt.Errorf("@Tags specification for %s does not use identifierAttribute. Missing @Testing(tagsIdentifierAttribute) and possibly tagsResourceType", fmt.Sprintf("%s.%s", v.packageName, v.functionName)))
return
Expand Down
4 changes: 2 additions & 2 deletions internal/provider/fwprovider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ func (p *fwprovider) DataSources(ctx context.Context) []func() datasource.DataSo
bootstrapContext := func(ctx context.Context, meta *conns.AWSClient) context.Context {
ctx = conns.NewDataSourceContext(ctx, servicePackageName, v.Name)
if meta != nil {
ctx = tftags.NewContext(ctx, meta.DefaultTagsConfig(ctx), meta.IgnoreTagsConfig)
ctx = tftags.NewContext(ctx, meta.DefaultTagsConfig(ctx), meta.IgnoreTagsConfig(ctx))
ctx = meta.RegisterLogger(ctx)
}

Expand Down Expand Up @@ -405,7 +405,7 @@ func (p *fwprovider) Resources(ctx context.Context) []func() resource.Resource {
bootstrapContext := func(ctx context.Context, meta *conns.AWSClient) context.Context {
ctx = conns.NewResourceContext(ctx, servicePackageName, v.Name)
if meta != nil {
ctx = tftags.NewContext(ctx, meta.DefaultTagsConfig(ctx), meta.IgnoreTagsConfig)
ctx = tftags.NewContext(ctx, meta.DefaultTagsConfig(ctx), meta.IgnoreTagsConfig(ctx))
ctx = meta.RegisterLogger(ctx)
ctx = flex.RegisterLogger(ctx)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ func New(ctx context.Context) (*schema.Provider, error) {
bootstrapContext := func(ctx context.Context, meta any) context.Context {
ctx = conns.NewDataSourceContext(ctx, servicePackageName, v.Name)
if v, ok := meta.(*conns.AWSClient); ok {
ctx = tftags.NewContext(ctx, v.DefaultTagsConfig(ctx), v.IgnoreTagsConfig)
ctx = tftags.NewContext(ctx, v.DefaultTagsConfig(ctx), v.IgnoreTagsConfig(ctx))
ctx = v.RegisterLogger(ctx)
}

Expand Down Expand Up @@ -371,7 +371,7 @@ func New(ctx context.Context) (*schema.Provider, error) {
bootstrapContext := func(ctx context.Context, meta any) context.Context {
ctx = conns.NewResourceContext(ctx, servicePackageName, v.Name)
if v, ok := meta.(*conns.AWSClient); ok {
ctx = tftags.NewContext(ctx, v.DefaultTagsConfig(ctx), v.IgnoreTagsConfig)
ctx = tftags.NewContext(ctx, v.DefaultTagsConfig(ctx), v.IgnoreTagsConfig(ctx))
ctx = v.RegisterLogger(ctx)
}

Expand Down
4 changes: 2 additions & 2 deletions internal/provider/provider_acc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -817,7 +817,7 @@ func testAccCheckIgnoreTagsKeyPrefixes(ctx context.Context, t *testing.T, p **sc
}

providerClient := (*p).Meta().(*conns.AWSClient)
ignoreTagsConfig := providerClient.IgnoreTagsConfig
ignoreTagsConfig := providerClient.IgnoreTagsConfig(ctx)

if ignoreTagsConfig == nil || ignoreTagsConfig.KeyPrefixes == nil {
if len(expectedKeyPrefixes) != 0 {
Expand Down Expand Up @@ -874,7 +874,7 @@ func testAccCheckIgnoreTagsKeys(ctx context.Context, t *testing.T, p **schema.Pr
}

providerClient := (*p).Meta().(*conns.AWSClient)
ignoreTagsConfig := providerClient.IgnoreTagsConfig
ignoreTagsConfig := providerClient.IgnoreTagsConfig(ctx)

if ignoreTagsConfig == nil || ignoreTagsConfig.Keys == nil {
if len(expectedKeys) != 0 {
Expand Down
8 changes: 4 additions & 4 deletions internal/provider/tags_interceptor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,18 @@ func TestTagsResourceInterceptor(t *testing.T) {
ServicePackages: map[string]conns.ServicePackage{
"Test": &mockService{},
},
IgnoreTagsConfig: expandIgnoreTags(context.Background(), map[string]interface{}{
"tag2": "tag",
}),
}
conns.SetDefaultTagsConfig(conn, expandDefaultTags(context.Background(), map[string]interface{}{
"tag": "",
}))
conns.SetIgnoreTagsConfig(conn, expandIgnoreTags(context.Background(), map[string]interface{}{
"tag2": "tag",
}))

bootstrapContext := func(ctx context.Context, meta any) context.Context {
ctx = conns.NewResourceContext(ctx, "Test", "aws_test")
if v, ok := meta.(*conns.AWSClient); ok {
ctx = tftags.NewContext(ctx, v.DefaultTagsConfig(ctx), v.IgnoreTagsConfig)
ctx = tftags.NewContext(ctx, v.DefaultTagsConfig(ctx), v.IgnoreTagsConfig(ctx))
}

return ctx
Expand Down
11 changes: 0 additions & 11 deletions internal/service/acm/certificate_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ func dataSourceCertificate() *schema.Resource {
func dataSourceCertificateRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).ACMClient(ctx)
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

input := &acm.ListCertificatesInput{}

Expand Down Expand Up @@ -221,16 +220,6 @@ func dataSourceCertificateRead(ctx context.Context, d *schema.ResourceData, meta
d.Set(names.AttrDomain, matchedCertificate.DomainName)
d.Set(names.AttrStatus, matchedCertificate.Status)

tags, err := listTags(ctx, conn, aws.ToString(matchedCertificate.CertificateArn))

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

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

return diags
}

Expand Down
2 changes: 1 addition & 1 deletion internal/service/apigatewayv2/apis_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func dataSourceAPIs() *schema.Resource {
func dataSourceAPIsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).APIGatewayV2Client(ctx)
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig(ctx)

tagsToMatch := tftags.New(ctx, d.Get(names.AttrTags).(map[string]interface{})).IgnoreAWS().IgnoreConfig(ignoreTagsConfig)

Expand Down
2 changes: 1 addition & 1 deletion internal/service/auditmanager/control_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ func (rd *dataSourceControlData) refreshFromOutput(ctx context.Context, meta *co
rd.ARN = flex.StringToFramework(ctx, out.Arn)
rd.Type = types.StringValue(string(out.Type))

ignoreTagsConfig := meta.IgnoreTagsConfig
ignoreTagsConfig := meta.IgnoreTagsConfig(ctx)
tags := KeyValueTags(ctx, out.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig)
rd.Tags = tftags.FlattenStringValueMap(ctx, tags.Map())

Expand Down
2 changes: 1 addition & 1 deletion internal/service/auditmanager/framework_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ func (rd *dataSourceFrameworkData) refreshFromOutput(ctx context.Context, meta *
rd.FrameworkType = flex.StringValueToFramework(ctx, out.Type)
rd.ARN = flex.StringToFramework(ctx, out.Arn)

ignoreTagsConfig := meta.IgnoreTagsConfig
ignoreTagsConfig := meta.IgnoreTagsConfig(ctx)
tags := KeyValueTags(ctx, out.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig)
rd.Tags = tftags.FlattenStringValueMap(ctx, tags.Map())

Expand Down
2 changes: 1 addition & 1 deletion internal/service/autoscaling/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -1258,7 +1258,7 @@ func resourceGroupCreate(ctx context.Context, d *schema.ResourceData, meta inter
func resourceGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).AutoScalingClient(ctx)
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig(ctx)

g, err := findGroupByName(ctx, conn, d.Id())

Expand Down
2 changes: 1 addition & 1 deletion internal/service/autoscaling/group_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -567,7 +567,7 @@ func dataSourceGroup() *schema.Resource {
func dataSourceGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).AutoScalingClient(ctx)
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig(ctx)

groupName := d.Get(names.AttrName).(string)
group, err := findGroupByName(ctx, conn, groupName)
Expand Down
20 changes: 20 additions & 0 deletions internal/service/backup/backup_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package backup_test

import (
"fmt"

sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest"
)

// randomFrameworkName returns a resource name that matches the pattern for Framework names
func randomFrameworkName() string {
return fmt.Sprintf("tf_acc_test_%s", sdkacctest.RandString(7))
}

// randomReportPlanName returns a resource name that matches the pattern for Report Plan names
func randomReportPlanName() string {
return fmt.Sprintf("tf_acc_test_%s", sdkacctest.RandString(7))
}
3 changes: 3 additions & 0 deletions internal/service/backup/framework.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ import (

// @SDKResource("aws_backup_framework", name="Framework")
// @Tags(identifierAttribute="arn")
// @Testing(serialize=true)
// @Testing(existsType="github.com/aws/aws-sdk-go-v2/service/backup;backup.DescribeFrameworkOutput")
// @Testing(generator="randomFrameworkName()")
func resourceFramework() *schema.Resource {
return &schema.Resource{
CreateWithoutTimeout: resourceFrameworkCreate,
Expand Down
14 changes: 3 additions & 11 deletions internal/service/backup/framework_data_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ import (
)

// @SDKDataSource("aws_backup_framework", name="Framework")
// @Tags(identifierAttribute="arn")
// @Testing(serialize=true)
// @Testing(generator="randomFrameworkName()")
func dataSourceFramework() *schema.Resource {
return &schema.Resource{
ReadWithoutTimeout: dataSourceFrameworkRead,
Expand Down Expand Up @@ -104,7 +107,6 @@ func dataSourceFramework() *schema.Resource {
func dataSourceFrameworkRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var diags diag.Diagnostics
conn := meta.(*conns.AWSClient).BackupClient(ctx)
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig

name := d.Get(names.AttrName).(string)
output, err := findFrameworkByName(ctx, conn, name)
Expand All @@ -124,15 +126,5 @@ func dataSourceFrameworkRead(ctx context.Context, d *schema.ResourceData, meta i
d.Set(names.AttrName, output.FrameworkName)
d.Set(names.AttrStatus, output.FrameworkStatus)

tags, err := listTags(ctx, conn, d.Get(names.AttrARN).(string))

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

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

return diags
}
Loading

0 comments on commit 86856ac

Please sign in to comment.