Skip to content

Commit 3b94d69

Browse files
authored
Merge pull request #26057 from yktakaha4/f-aws_ecrpublic_repository-add-tags
Add `tags` and `tags_all` argument to `aws_ecrpublic_repository`
2 parents 6758ce5 + 054f7ac commit 3b94d69

File tree

6 files changed

+223
-3
lines changed

6 files changed

+223
-3
lines changed

.changelog/26057.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/aws_ecrpublic_repository: Add `tags` argument and `tags_all` attribute to support resource tagging
3+
```
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
//go:generate go run ../../generate/tags/main.go -ListTags -ServiceTagsSlice -UpdateTags
2+
// ONLY generate directives and package declaration! Do not add anything else to this file.
3+
4+
package ecrpublic

internal/service/ecrpublic/repository.go

+37
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1616
"github.com/hashicorp/terraform-provider-aws/internal/conns"
1717
"github.com/hashicorp/terraform-provider-aws/internal/flex"
18+
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
1819
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
1920
"github.com/hashicorp/terraform-provider-aws/internal/verify"
2021
)
@@ -29,6 +30,8 @@ func ResourceRepository() *schema.Resource {
2930
State: schema.ImportStatePassthrough,
3031
},
3132

33+
CustomizeDiff: verify.SetTagsDiff,
34+
3235
Timeouts: &schema.ResourceTimeout{
3336
Delete: schema.DefaultTimeout(20 * time.Minute),
3437
},
@@ -106,12 +109,16 @@ func ResourceRepository() *schema.Resource {
106109
Type: schema.TypeString,
107110
Computed: true,
108111
},
112+
"tags": tftags.TagsSchema(),
113+
"tags_all": tftags.TagsSchemaComputed(),
109114
},
110115
}
111116
}
112117

113118
func resourceRepositoryCreate(d *schema.ResourceData, meta interface{}) error {
114119
conn := meta.(*conns.AWSClient).ECRPublicConn
120+
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
121+
tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{})))
115122

116123
input := ecrpublic.CreateRepositoryInput{
117124
RepositoryName: aws.String(d.Get("repository_name").(string)),
@@ -121,6 +128,10 @@ func resourceRepositoryCreate(d *schema.ResourceData, meta interface{}) error {
121128
input.CatalogData = expandRepositoryCatalogData(v.([]interface{})[0].(map[string]interface{}))
122129
}
123130

131+
if len(tags) > 0 {
132+
input.Tags = Tags(tags.IgnoreAWS())
133+
}
134+
124135
log.Printf("[DEBUG] Creating ECR Public repository: %#v", input)
125136

126137
out, err := conn.CreateRepository(&input)
@@ -143,6 +154,8 @@ func resourceRepositoryCreate(d *schema.ResourceData, meta interface{}) error {
143154

144155
func resourceRepositoryRead(d *schema.ResourceData, meta interface{}) error {
145156
conn := meta.(*conns.AWSClient).ECRPublicConn
157+
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
158+
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
146159

147160
log.Printf("[DEBUG] Reading ECR Public repository %s", d.Id())
148161
var out *ecrpublic.DescribeRepositoriesOutput
@@ -218,6 +231,19 @@ func resourceRepositoryRead(d *schema.ResourceData, meta interface{}) error {
218231
d.Set("catalog_data", nil)
219232
}
220233

234+
tags, err := ListTags(conn, aws.StringValue(repository.RepositoryArn))
235+
236+
tags = tags.IgnoreAWS().IgnoreConfig(ignoreTagsConfig)
237+
238+
//lintignore:AWSR002
239+
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
240+
return fmt.Errorf("error setting tags: %w", err)
241+
}
242+
243+
if err := d.Set("tags_all", tags.Map()); err != nil {
244+
return fmt.Errorf("error setting tags_all: %w", err)
245+
}
246+
221247
return nil
222248
}
223249

@@ -276,6 +302,7 @@ func resourceRepositoryDelete(d *schema.ResourceData, meta interface{}) error {
276302
}
277303

278304
func resourceRepositoryUpdate(d *schema.ResourceData, meta interface{}) error {
305+
arn := d.Get("arn").(string)
279306
conn := meta.(*conns.AWSClient).ECRPublicConn
280307

281308
if d.HasChange("catalog_data") {
@@ -284,6 +311,16 @@ func resourceRepositoryUpdate(d *schema.ResourceData, meta interface{}) error {
284311
}
285312
}
286313

314+
if d.HasChange("tags_all") {
315+
o, n := d.GetChange("tags_all")
316+
317+
err := UpdateTags(conn, arn, o, n)
318+
319+
if err != nil {
320+
return fmt.Errorf("failed updating tags for ECR Public Repository (%s): %w", d.Id(), err)
321+
}
322+
}
323+
287324
return resourceRepositoryRead(d, meta)
288325
}
289326

internal/service/ecrpublic/repository_test.go

+72-2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,51 @@ func TestAccECRPublicRepository_basic(t *testing.T) {
4545
})
4646
}
4747

48+
func TestAccECRPublicRepository_tags(t *testing.T) {
49+
var v ecrpublic.Repository
50+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
51+
resourceName := "aws_ecrpublic_repository.test"
52+
53+
resource.ParallelTest(t, resource.TestCase{
54+
PreCheck: func() { acctest.PreCheck(t); testAccPreCheck(t) },
55+
ErrorCheck: acctest.ErrorCheck(t, ecrpublic.EndpointsID),
56+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
57+
CheckDestroy: testAccCheckRepositoryDestroy,
58+
Steps: []resource.TestStep{
59+
{
60+
Config: testAccRepositoryConfig_tags1(rName, "key1", "value1"),
61+
Check: resource.ComposeTestCheckFunc(
62+
testAccCheckRepositoryExists(resourceName, &v),
63+
resource.TestCheckResourceAttr(resourceName, "tags.%", "1"),
64+
resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1"),
65+
),
66+
},
67+
{
68+
ResourceName: resourceName,
69+
ImportState: true,
70+
ImportStateVerify: true,
71+
},
72+
{
73+
Config: testAccRepositoryConfig_tags2(rName, "key1", "value1updated", "key2", "value2"),
74+
Check: resource.ComposeTestCheckFunc(
75+
testAccCheckRepositoryExists(resourceName, &v),
76+
resource.TestCheckResourceAttr(resourceName, "tags.%", "2"),
77+
resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1updated"),
78+
resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"),
79+
),
80+
},
81+
{
82+
Config: testAccRepositoryConfig_tags1(rName, "key2", "value2"),
83+
Check: resource.ComposeTestCheckFunc(
84+
testAccCheckRepositoryExists(resourceName, &v),
85+
resource.TestCheckResourceAttr(resourceName, "tags.%", "1"),
86+
resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"),
87+
),
88+
},
89+
},
90+
})
91+
}
92+
4893
func TestAccECRPublicRepository_CatalogData_aboutText(t *testing.T) {
4994
var v ecrpublic.Repository
5095
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
@@ -371,15 +416,40 @@ func testAccCheckRepositoryDestroy(s *terraform.State) error {
371416
func testAccRepositoryConfig_basic(rName string) string {
372417
return fmt.Sprintf(`
373418
resource "aws_ecrpublic_repository" "test" {
374-
repository_name = %q
419+
repository_name = %[1]q
375420
}
376421
`, rName)
377422
}
378423

424+
func testAccRepositoryConfig_tags1(rName, tagKey1, tagValue1 string) string {
425+
return fmt.Sprintf(`
426+
resource "aws_ecrpublic_repository" "test" {
427+
repository_name = %[1]q
428+
429+
tags = {
430+
%[2]q = %[3]q
431+
}
432+
}
433+
`, rName, tagKey1, tagValue1)
434+
}
435+
436+
func testAccRepositoryConfig_tags2(rName, tagKey1, tagValue1, tagKey2, tagValue2 string) string {
437+
return fmt.Sprintf(`
438+
resource "aws_ecrpublic_repository" "test" {
439+
repository_name = %[1]q
440+
441+
tags = {
442+
%[2]q = %[3]q
443+
%[4]q = %[5]q
444+
}
445+
}
446+
`, rName, tagKey1, tagValue1, tagKey2, tagValue2)
447+
}
448+
379449
func testAccRepositoryConfig_forceDestroy(rName string) string {
380450
return fmt.Sprintf(`
381451
resource "aws_ecrpublic_repository" "test" {
382-
repository_name = %q
452+
repository_name = %[1]q
383453
force_destroy = true
384454
}
385455
`, rName)

internal/service/ecrpublic/tags_gen.go

+101
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/docs/r/ecrpublic_repository.html.markdown

+6-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ resource "aws_ecrpublic_repository" "foo" {
3333
operating_systems = ["Linux"]
3434
usage_text = "Usage Text"
3535
}
36+
37+
tags = {
38+
env = "production"
39+
}
3640
}
3741
```
3842

@@ -42,7 +46,7 @@ The following arguments are supported:
4246

4347
* `repository_name` - (Required) Name of the repository.
4448
* `catalog_data` - (Optional) Catalog data configuration for the repository. See [below for schema](#catalog_data).
45-
49+
* `tags` - (Optional) Key-value mapping of resource tags. If configured with a provider [`default_tags` configuration block](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#default_tags-configuration-block) present, tags with matching keys will overwrite those defined at the provider-level.
4650

4751
### catalog_data
4852

@@ -61,6 +65,7 @@ In addition to all arguments above, the following attributes are exported:
6165
* `id` - The repository name.
6266
* `registry_id` - The registry ID where the repository was created.
6367
* `repository_uri` - The URI of the repository.
68+
* `tags_all` - Map of tags assigned to the resource, including those inherited from the provider [`default_tags` configuration block](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#default_tags-configuration-block).
6469

6570
## Timeouts
6671

0 commit comments

Comments
 (0)