diff --git a/.changelog/31682.txt b/.changelog/31682.txt new file mode 100644 index 00000000000..817026ff074 --- /dev/null +++ b/.changelog/31682.txt @@ -0,0 +1,3 @@ +```release-note:new-data-source +aws_organizations_policies_for_target +``` \ No newline at end of file diff --git a/internal/service/organizations/policies_data_source.go b/internal/service/organizations/policies_data_source.go index d3e533d7724..c12147403ac 100644 --- a/internal/service/organizations/policies_data_source.go +++ b/internal/service/organizations/policies_data_source.go @@ -35,7 +35,7 @@ func dataSourcePoliciesRead(ctx context.Context, d *schema.ResourceData, meta in conn := meta.(*conns.AWSClient).OrganizationsConn(ctx) filter := d.Get("filter").(string) - policies, err := listPolicies(ctx, conn, filter) + policies, err := findPolicies(ctx, conn, filter) if err != nil { return sdkdiag.AppendErrorf(diags, "listing Organizations Policies (%s): %s", filter, err) @@ -53,7 +53,7 @@ func dataSourcePoliciesRead(ctx context.Context, d *schema.ResourceData, meta in return diags } -func listPolicies(ctx context.Context, conn *organizations.Organizations, filter string) ([]*organizations.PolicySummary, error) { +func findPolicies(ctx context.Context, conn *organizations.Organizations, filter string) ([]*organizations.PolicySummary, error) { input := &organizations.ListPoliciesInput{ Filter: aws.String(filter), } diff --git a/internal/service/organizations/policies_for_target_data_source.go b/internal/service/organizations/policies_for_target_data_source.go new file mode 100644 index 00000000000..50e7fcaecbb --- /dev/null +++ b/internal/service/organizations/policies_for_target_data_source.go @@ -0,0 +1,81 @@ +package organizations + +import ( + "context" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/organizations" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" +) + +// @SDKDataSource("aws_organizations_policies_for_target") +func DataSourcePoliciesForTarget() *schema.Resource { + return &schema.Resource{ + ReadWithoutTimeout: dataSourcePoliciesForTargetRead, + + Schema: map[string]*schema.Schema{ + "filter": { + Type: schema.TypeString, + Required: true, + }, + "ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "target_id": { + Type: schema.TypeString, + Required: true, + }, + }, + } +} + +func dataSourcePoliciesForTargetRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics + + conn := meta.(*conns.AWSClient).OrganizationsConn(ctx) + + targetID := d.Get("target_id").(string) + filter := d.Get("filter").(string) + policies, err := findPoliciesForTarget(ctx, conn, targetID, filter) + + if err != nil { + return sdkdiag.AppendErrorf(diags, "listing Organizations Policies (%s) for target (%s): %s", filter, targetID, err) + } + + var policyIDs []string + + for _, v := range policies { + policyIDs = append(policyIDs, aws.StringValue(v.Id)) + } + + d.SetId(targetID) + + d.Set("ids", policyIDs) + + return diags +} + +func findPoliciesForTarget(ctx context.Context, conn *organizations.Organizations, targetID string, filter string) ([]*organizations.PolicySummary, error) { + input := &organizations.ListPoliciesForTargetInput{ + Filter: aws.String(filter), + TargetId: aws.String(targetID), + } + var output []*organizations.PolicySummary + + err := conn.ListPoliciesForTargetPagesWithContext(ctx, input, func(page *organizations.ListPoliciesForTargetOutput, lastPage bool) bool { + output = append(output, page.Policies...) + + return !lastPage + }) + + if err != nil { + return nil, err + } + + return output, nil +} diff --git a/internal/service/organizations/policies_for_target_data_source_test.go b/internal/service/organizations/policies_for_target_data_source_test.go new file mode 100644 index 00000000000..f368cbe5e8e --- /dev/null +++ b/internal/service/organizations/policies_for_target_data_source_test.go @@ -0,0 +1,81 @@ +package organizations_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/organizations" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" +) + +func TestAccOrganizationsPoliciesForTargetDataSource_basic(t *testing.T) { + ctx := acctest.Context(t) + datasourceName := "data.aws_organizations_policies_for_target.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { + acctest.PreCheck(ctx, t) + acctest.PreCheckOrganizationsAccount(ctx, t) + }, + ErrorCheck: acctest.ErrorCheck(t, organizations.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccPoliciesForTargetDataSourceConfig_AttachQuery(rName), + Check: resource.ComposeTestCheckFunc( + acctest.CheckResourceAttrGreaterThanValue(datasourceName, "ids.#", 0), + ), + }, + }, + }) +} + +func testAccPoliciesForTargetDataSourceConfig_AttachQuery(rName string) string { + return fmt.Sprintf(` +resource "aws_organizations_organization" "test" { + feature_set = "ALL" + enabled_policy_types = ["SERVICE_CONTROL_POLICY", "TAG_POLICY", "BACKUP_POLICY", "AISERVICES_OPT_OUT_POLICY"] +} + +resource "aws_organizations_organizational_unit" "test" { + name = %[1]q + parent_id = aws_organizations_organization.test.roots[0].id +} + +resource "aws_organizations_policy" "test" { + depends_on = [aws_organizations_organization.test] + + content = <