diff --git a/.changelog/23134.txt b/.changelog/23134.txt new file mode 100644 index 00000000000..e588e8537a2 --- /dev/null +++ b/.changelog/23134.txt @@ -0,0 +1,3 @@ +```release-note:new-data-source +aws_imagebuilder_container_recipes +``` diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 39555c85639..bbb4497c3f1 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -629,6 +629,7 @@ func Provider() *schema.Provider { "aws_imagebuilder_component": imagebuilder.DataSourceComponent(), "aws_imagebuilder_components": imagebuilder.DataSourceComponents(), "aws_imagebuilder_container_recipe": imagebuilder.DataSourceContainerRecipe(), + "aws_imagebuilder_container_recipes": imagebuilder.DataSourceContainerRecipes(), "aws_imagebuilder_distribution_configuration": imagebuilder.DataSourceDistributionConfiguration(), "aws_imagebuilder_distribution_configurations": imagebuilder.DataSourceDistributionConfigurations(), "aws_imagebuilder_image": imagebuilder.DataSourceImage(), diff --git a/internal/service/imagebuilder/container_recipes_data_source.go b/internal/service/imagebuilder/container_recipes_data_source.go new file mode 100644 index 00000000000..6850d9c3dd7 --- /dev/null +++ b/internal/service/imagebuilder/container_recipes_data_source.go @@ -0,0 +1,84 @@ +package imagebuilder + +import ( + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/imagebuilder" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/hashicorp/terraform-provider-aws/internal/conns" +) + +func DataSourceContainerRecipes() *schema.Resource { + return &schema.Resource{ + Read: dataSourceContainerRecipesRead, + Schema: map[string]*schema.Schema{ + "arns": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "filter": dataSourceFiltersSchema(), + "names": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "owner": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{"Self", "Shared", "Amazon"}, false), + }, + }, + } +} + +func dataSourceContainerRecipesRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).ImageBuilderConn + + input := &imagebuilder.ListContainerRecipesInput{} + + if v, ok := d.GetOk("owner"); ok { + input.Owner = aws.String(v.(string)) + } + + if v, ok := d.GetOk("filter"); ok { + input.Filters = buildFiltersDataSource(v.(*schema.Set)) + } + + var results []*imagebuilder.ContainerRecipeSummary + + err := conn.ListContainerRecipesPages(input, func(page *imagebuilder.ListContainerRecipesOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, containerRecipeSummary := range page.ContainerRecipeSummaryList { + if containerRecipeSummary == nil { + continue + } + + results = append(results, containerRecipeSummary) + } + + return !lastPage + }) + + if err != nil { + return fmt.Errorf("error reading Image Builder Container Recipes: %w", err) + } + + var arns, names []string + + for _, r := range results { + arns = append(arns, aws.StringValue(r.Arn)) + names = append(names, aws.StringValue(r.Name)) + } + + d.SetId(meta.(*conns.AWSClient).Region) + d.Set("arns", arns) + d.Set("names", names) + + return nil +} diff --git a/internal/service/imagebuilder/container_recipes_data_source_test.go b/internal/service/imagebuilder/container_recipes_data_source_test.go new file mode 100644 index 00000000000..b43f7d68737 --- /dev/null +++ b/internal/service/imagebuilder/container_recipes_data_source_test.go @@ -0,0 +1,74 @@ +package imagebuilder_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/imagebuilder" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" +) + +func TestAccImageBuilderContainerRecipesDataSource_filter(t *testing.T) { + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + dataSourceName := "data.aws_imagebuilder_container_recipes.test" + resourceName := "aws_imagebuilder_container_recipe.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, imagebuilder.EndpointsID), + ProviderFactories: acctest.ProviderFactories, + CheckDestroy: testAccCheckContainerRecipeDestroy, + Steps: []resource.TestStep{ + { + Config: testAccContainerRecipesFilterDataSourceConfig(rName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(dataSourceName, "names.#", "1"), + resource.TestCheckResourceAttrPair(dataSourceName, "names.0", resourceName, "name"), + ), + }, + }, + }) +} + +func testAccContainerRecipesFilterDataSourceConfig(rName string) string { + return fmt.Sprintf(` +data "aws_region" "current" {} + +data "aws_partition" "current" {} + +resource "aws_ecr_repository" "test" { + name = %[1]q +} + +resource "aws_imagebuilder_container_recipe" "test" { + name = %[1]q + container_type = "DOCKER" + parent_image = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:image/amazon-linux-x86-2/x.x.x" + version = "1.0.0" + + component { + component_arn = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:component/update-linux/x.x.x" + } + + dockerfile_template_data = <