Skip to content

Commit 178a9ca

Browse files
abd-googentertvl
authored andcommitted
Add tags field to Folder resource (GoogleCloudPlatform#11424)
1 parent dc0d8d1 commit 178a9ca

File tree

3 files changed

+100
-4
lines changed

3 files changed

+100
-4
lines changed

mmv1/third_party/terraform/services/resourcemanager/resource_google_folder.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,13 @@ func ResourceGoogleFolder() *schema.Resource {
7171
Default: true,
7272
Description: `When the field is set to true or unset in Terraform state, a terraform apply or terraform destroy that would delete the instance will fail. When the field is set to false, deleting the instance is allowed.`,
7373
},
74+
"tags": {
75+
Type: schema.TypeMap,
76+
Optional: true,
77+
ForceNew: true,
78+
Elem: &schema.Schema{Type: schema.TypeString},
79+
Description: `A map of resource manager tags. Resource manager tag keys and values have the same definition as resource manager tags. Keys must be in the format tagKeys/{tag_key_id}, and values are in the format tagValues/456. The field is ignored when empty.`,
80+
},
7481
},
7582
UseJSONNumber: true,
7683
}
@@ -86,14 +93,19 @@ func resourceGoogleFolderCreate(d *schema.ResourceData, meta interface{}) error
8693
displayName := d.Get("display_name").(string)
8794
parent := d.Get("parent").(string)
8895

96+
folder := &resourceManagerV3.Folder{
97+
DisplayName: displayName,
98+
Parent: parent,
99+
}
100+
if _, ok := d.GetOk("tags"); ok {
101+
folder.Tags = tpgresource.ExpandStringMap(d, "tags")
102+
}
103+
89104
var op *resourceManagerV3.Operation
90105
err = transport_tpg.Retry(transport_tpg.RetryOptions{
91106
RetryFunc: func() error {
92107
var reqErr error
93-
op, reqErr = config.NewResourceManagerV3Client(userAgent).Folders.Create(&resourceManagerV3.Folder{
94-
DisplayName: displayName,
95-
Parent: parent,
96-
}).Do()
108+
op, reqErr = config.NewResourceManagerV3Client(userAgent).Folders.Create(folder).Do()
97109
return reqErr
98110
},
99111
Timeout: d.Timeout(schema.TimeoutCreate),

mmv1/third_party/terraform/services/resourcemanager/resource_google_folder_test.go

+73
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package resourcemanager_test
22

33
import (
44
"fmt"
5+
"regexp"
56
"testing"
67

78
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
@@ -88,6 +89,45 @@ func TestAccFolder_moveParent(t *testing.T) {
8889
})
8990
}
9091

92+
// Test that a Folder resource can be created with tags
93+
func TestAccFolder_tags(t *testing.T) {
94+
t.Parallel()
95+
96+
org := envvar.GetTestOrgFromEnv(t)
97+
parent := "organizations/" + org
98+
folderDisplayName := "tf-test-" + acctest.RandString(t, 10)
99+
tagKey := acctest.BootstrapSharedTestTagKey(t, "crm-folder-tagkey")
100+
tagValue := acctest.BootstrapSharedTestTagValue(t, "crm-folder-tagvalue", tagKey)
101+
folder_tags := resourceManagerV3.Folder{}
102+
acctest.VcrTest(t, resource.TestCase{
103+
PreCheck: func() { acctest.AccTestPreCheck(t) },
104+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
105+
Steps: []resource.TestStep{
106+
{
107+
Config: testAccFolder_tags(folderDisplayName, parent, map[string]string{org + "/" + tagKey: tagValue}),
108+
Check: resource.ComposeTestCheckFunc(
109+
testAccCheckGoogleFolderExists(t, "google_folder.folder_tags", &folder_tags),
110+
),
111+
},
112+
// Make sure import supports tags
113+
{
114+
ResourceName: "google_folder.folder_tags",
115+
ImportState: true,
116+
ImportStateVerify: true,
117+
ImportStateVerifyIgnore: []string{"tags", "deletion_protection"}, // we don't read tags back
118+
},
119+
// Update tags tries to replace the folder but fails due to deletion protection
120+
{
121+
Config: testAccFolder_tags(folderDisplayName, org, map[string]string{}),
122+
ExpectError: regexp.MustCompile("deletion_protection"),
123+
},
124+
{
125+
Config: testAccFolder_tagsAllowDestroy(folderDisplayName, parent, map[string]string{org + "/" + tagKey: tagValue}),
126+
},
127+
},
128+
})
129+
}
130+
91131
func testAccCheckGoogleFolderDestroyProducer(t *testing.T) func(s *terraform.State) error {
92132
return func(s *terraform.State) error {
93133
config := acctest.GoogleProviderConfig(t)
@@ -159,6 +199,39 @@ resource "google_folder" "folder1" {
159199
`, folder, parent)
160200
}
161201

202+
func testAccFolder_tags(folder, parent string, tags map[string]string) string {
203+
r := fmt.Sprintf(`
204+
resource "google_folder" "folder_tags" {
205+
display_name = "%s"
206+
parent = "%s"
207+
tags = {`, folder, parent)
208+
209+
l := ""
210+
for key, value := range tags {
211+
l += fmt.Sprintf("%q = %q\n", key, value)
212+
}
213+
214+
l += fmt.Sprintf("}\n}")
215+
return r + l
216+
}
217+
218+
func testAccFolder_tagsAllowDestroy(folder, parent string, tags map[string]string) string {
219+
r := fmt.Sprintf(`
220+
resource "google_folder" "folder_tags" {
221+
display_name = "%s"
222+
parent = "%s"
223+
deletion_protection = false
224+
tags = {`, folder, parent)
225+
226+
l := ""
227+
for key, value := range tags {
228+
l += fmt.Sprintf("%q = %q\n", key, value)
229+
}
230+
231+
l += fmt.Sprintf("}\n}")
232+
return r + l
233+
}
234+
162235
func testAccFolder_move(folder1, folder2, parent string) string {
163236
return fmt.Sprintf(`
164237
resource "google_folder" "folder1" {

mmv1/third_party/terraform/website/docs/r/google_folder.html.markdown

+11
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ resource must have `roles/resourcemanager.folderCreator`. See the
2020
[Access Control for Folders Using IAM](https://cloud.google.com/resource-manager/docs/access-control-folders)
2121
doc for more information.
2222

23+
~> It may take a while for the attached tag bindings to be deleted after the folder is scheduled to be deleted.
24+
2325
## Example Usage
2426

2527
```hcl
@@ -34,6 +36,13 @@ resource "google_folder" "team-abc" {
3436
display_name = "Team ABC"
3537
parent = google_folder.department1.name
3638
}
39+
40+
# Folder with a tag
41+
resource "google_folder" "department1" {
42+
display_name = "Department 1"
43+
parent = "organizations/1234567"
44+
tags = {"1234567/env":"staging"}
45+
}
3746
```
3847

3948
## Argument Reference
@@ -46,6 +55,8 @@ The following arguments are supported:
4655
* `parent` - (Required) The resource name of the parent Folder or Organization.
4756
Must be of the form `folders/{folder_id}` or `organizations/{org_id}`.
4857

58+
* `tags` - (Optional) A map of resource manager tags. Resource manager tag keys and values have the same definition as resource manager tags. Keys must be in the format tagKeys/{tag_key_id}, and values are in the format tagValues/456. The field is ignored when empty. The field is immutable and causes resource replacement when mutated.
59+
4960
## Attributes Reference
5061

5162
In addition to the arguments listed above, the following computed attributes are

0 commit comments

Comments
 (0)