From cd494efb639f06b3517819ad0084a8015b08e6e6 Mon Sep 17 00:00:00 2001 From: Cody Bond Date: Fri, 23 Dec 2022 16:17:55 -0500 Subject: [PATCH 1/5] Add function to find AMP workspace by alias --- internal/service/amp/find.go | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/internal/service/amp/find.go b/internal/service/amp/find.go index f3eb5f6cb101..07c54ce341a1 100644 --- a/internal/service/amp/find.go +++ b/internal/service/amp/find.go @@ -101,6 +101,43 @@ func FindWorkspaceByID(ctx context.Context, conn *prometheusservice.PrometheusSe return output.Workspace, nil } +func FindWorkspaceByAlias(ctx context.Context, conn *prometheusservice.PrometheusService, alias string) (*prometheusservice.WorkspaceDescription, error) { + input := &prometheusservice.ListWorkspacesInput{ + Alias: aws.String(alias), + } + + var result *prometheusservice.WorkspaceSummary + err := conn.ListWorkspacesPages(input, func(page *prometheusservice.ListWorkspacesOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, w := range page.Workspaces { + if w == nil { + continue + } + + // ListWorkspaces returns all workspaces that begin with the given alias, so + // we need to return the result that matches the alias exactly. + if aws.StringValue(w.Alias) == alias { + result = w + return false + } + } + return !lastPage + }) + + if err != nil { + return nil, err + } + if result == nil { + return nil, tfresource.NewEmptyResultError(nil) + } + + // Call FindWorkspaceByID so that we can return a WorkspaceDescription instead of a WorkspaceSummary. + return FindWorkspaceByID(ctx, conn, aws.StringValue(result.WorkspaceId)) +} + func FindLoggingConfigurationByWorkspaceID(ctx context.Context, conn *prometheusservice.PrometheusService, id string) (*prometheusservice.LoggingConfigurationMetadata, error) { input := &prometheusservice.DescribeLoggingConfigurationInput{ WorkspaceId: aws.String(id), From 976ce2162f477f6dd87db0757ad00b801e58c8b5 Mon Sep 17 00:00:00 2001 From: Cody Bond Date: Fri, 23 Dec 2022 16:19:41 -0500 Subject: [PATCH 2/5] Update workspace data source to lookup by workspace_id or alias --- internal/service/amp/workspace_data_source.go | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/internal/service/amp/workspace_data_source.go b/internal/service/amp/workspace_data_source.go index 4865ccb2b6f0..c25ff05ba0b2 100644 --- a/internal/service/amp/workspace_data_source.go +++ b/internal/service/amp/workspace_data_source.go @@ -4,6 +4,8 @@ import ( "context" "time" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/prometheusservice" "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" @@ -16,8 +18,10 @@ func DataSourceWorkspace() *schema.Resource { Schema: map[string]*schema.Schema{ "alias": { - Type: schema.TypeString, - Computed: true, + Type: schema.TypeString, + Optional: true, + Computed: true, + ConflictsWith: []string{"workspace_id"}, }, "arn": { Type: schema.TypeString, @@ -37,8 +41,10 @@ func DataSourceWorkspace() *schema.Resource { }, "tags": tftags.TagsSchemaComputed(), "workspace_id": { - Type: schema.TypeString, - Required: true, + Type: schema.TypeString, + Optional: true, + Computed: true, + ConflictsWith: []string{"alias"}, }, }, } @@ -49,13 +55,26 @@ func dataSourceWorkspaceRead(ctx context.Context, d *schema.ResourceData, meta i ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig workspaceID := d.Get("workspace_id").(string) - workspace, err := FindWorkspaceByID(ctx, conn, workspaceID) + workspaceAlias := d.Get("alias").(string) + + var workspace *prometheusservice.WorkspaceDescription + var err error + + if workspaceID != "" { + workspace, err = FindWorkspaceByID(ctx, conn, workspaceID) + } else if workspaceAlias != "" { + workspace, err = FindWorkspaceByAlias(ctx, conn, workspaceAlias) + } if err != nil { - return diag.Errorf("reading AMP Workspace (%s): %s", workspaceID, err) + if workspaceID != "" { + return diag.Errorf("reading AMP Workspace by ID (%s): %s", workspaceID, err) + } else { + return diag.Errorf("reading AMP Workspace by alias (%s): %s", workspaceAlias, err) + } } - d.SetId(workspaceID) + d.SetId(aws.StringValue(workspace.WorkspaceId)) d.Set("alias", workspace.Alias) d.Set("arn", workspace.Arn) From 0be7b9dd0a0b7e4135cdb4e1c0d3461e4b068a37 Mon Sep 17 00:00:00 2001 From: Cody Bond Date: Fri, 23 Dec 2022 16:19:59 -0500 Subject: [PATCH 3/5] Add acceptance test for workspace lookup by alias --- .../service/amp/workspace_data_source_test.go | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/internal/service/amp/workspace_data_source_test.go b/internal/service/amp/workspace_data_source_test.go index b1f9f93baa31..7f8607de6bc9 100644 --- a/internal/service/amp/workspace_data_source_test.go +++ b/internal/service/amp/workspace_data_source_test.go @@ -10,7 +10,33 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/acctest" ) -func TestAccAMPWorkspaceDataSource_basic(t *testing.T) { +func TestAccAMPWorkspaceDataSource_workspace_id(t *testing.T) { + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + resourceName := "aws_prometheus_workspace.test" + dataSourceName := "data.aws_prometheus_workspace.test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t); acctest.PreCheckPartitionHasService(prometheusservice.EndpointsID, t) }, + ErrorCheck: acctest.ErrorCheck(t, prometheusservice.EndpointsID), + CheckDestroy: nil, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccWorkspaceDataSourceConfig_workspace_id(rName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(resourceName, "alias", dataSourceName, "alias"), + resource.TestCheckResourceAttrPair(resourceName, "arn", dataSourceName, "arn"), + resource.TestCheckResourceAttrSet(dataSourceName, "created_date"), + resource.TestCheckResourceAttrPair(resourceName, "prometheus_endpoint", dataSourceName, "prometheus_endpoint"), + resource.TestCheckResourceAttrSet(dataSourceName, "status"), + resource.TestCheckResourceAttrPair(resourceName, "tags.%", dataSourceName, "tags.%"), + ), + }, + }, + }) +} + +func TestAccAMPWorkspaceDataSource_alias(t *testing.T) { rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resourceName := "aws_prometheus_workspace.test" dataSourceName := "data.aws_prometheus_workspace.test" @@ -36,14 +62,28 @@ func TestAccAMPWorkspaceDataSource_basic(t *testing.T) { }) } -func testAccWorkspaceDataSourceConfig_alias(rName string) string { +func testAccWorkspaceBaseDataSourceConfig(rName string) string { return fmt.Sprintf(` resource "aws_prometheus_workspace" "test" { alias = %[1]q } +`, rName) +} +func testAccWorkspaceDataSourceConfig_workspace_id(rName string) string { + return acctest.ConfigCompose( + testAccWorkspaceBaseDataSourceConfig(rName), ` data "aws_prometheus_workspace" "test" { workspace_id = aws_prometheus_workspace.test.id } -`, rName) +`) +} + +func testAccWorkspaceDataSourceConfig_alias(rName string) string { + return acctest.ConfigCompose( + testAccWorkspaceBaseDataSourceConfig(rName), ` +data "aws_prometheus_workspace" "test" { + alias = aws_prometheus_workspace.test.alias +} +`) } From 90b46d7b075d34db1eb012df7a08d909a91c3112 Mon Sep 17 00:00:00 2001 From: Cody Bond Date: Fri, 23 Dec 2022 16:34:37 -0500 Subject: [PATCH 4/5] add changelog --- .changelog/28568.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/28568.txt diff --git a/.changelog/28568.txt b/.changelog/28568.txt new file mode 100644 index 000000000000..8b1e75b96108 --- /dev/null +++ b/.changelog/28568.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +datasource/aws_prometheus_workspace: Add ability to query by workspace alias +``` From d92027306ac9dbee08d5c0768dd74c01c20a9ad5 Mon Sep 17 00:00:00 2001 From: Cody Bond Date: Fri, 23 Dec 2022 16:42:59 -0500 Subject: [PATCH 5/5] Update documentation --- .../docs/d/prometheus_workspace.html.markdown | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/website/docs/d/prometheus_workspace.html.markdown b/website/docs/d/prometheus_workspace.html.markdown index 0821aab9fe71..9f3458729f30 100644 --- a/website/docs/d/prometheus_workspace.html.markdown +++ b/website/docs/d/prometheus_workspace.html.markdown @@ -12,7 +12,15 @@ Provides an Amazon Managed Prometheus workspace data source. ## Example Usage -### Basic configuration +### By Workspace Alias + +```terraform +data "aws_prometheus_workspace" "example" { + alias = "example" +} +``` + +### By Workspace ID ```terraform data "aws_prometheus_workspace" "example" { @@ -20,11 +28,11 @@ data "aws_prometheus_workspace" "example" { } ``` -## Argument Reference -The following arguments are required: +## Argument Reference -* `workspace_id` - (Required) Prometheus workspace ID. +* `alias` - (Optional) Prometheus workspace alias. Conflicts with `workspace_id`. +* `workspace_id` - (Optional) Prometheus workspace ID. Conflicts with `alias`. ## Attributes Reference @@ -33,6 +41,5 @@ In addition to all arguments above, the following attributes are exported: * `arn` - ARN of the Prometheus workspace. * `created_date` - Creation date of the Prometheus workspace. * `prometheus_endpoint` - Endpoint of the Prometheus workspace. -* `alias` - Prometheus workspace alias. * `status` - Status of the Prometheus workspace. * `tags` - Tags assigned to the resource.