Skip to content

Commit e894a44

Browse files
Add tags to Secret Manager Secret TagsR2401 (#14408) (#10360)
[upstream:ab5de21a39118626e749a1aa70dc828aab6ebf32] Signed-off-by: Modular Magician <[email protected]>
1 parent 67d8e5f commit e894a44

File tree

6 files changed

+124
-4
lines changed

6 files changed

+124
-4
lines changed

.changelog/14408.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
secretmanager: added `tags` field to `google_secret_manager_secret` to allow setting tags for secrets at creation time
3+
```

google-beta/services/secretmanager/resource_secret_manager_secret.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,15 @@ If rotationPeriod is set, 'next_rotation_time' must be set. 'next_rotation_time'
253253
},
254254
RequiredWith: []string{"topics"},
255255
},
256+
"tags": {
257+
Type: schema.TypeMap,
258+
Optional: true,
259+
ForceNew: true,
260+
Description: `A map of resource manager tags.
261+
Resource manager tag keys and values have the same definition as resource manager tags.
262+
Keys must be in the format tagKeys/{tag_key_id}, and values are in the format tagValues/{tag_value_id}.`,
263+
Elem: &schema.Schema{Type: schema.TypeString},
264+
},
256265
"topics": {
257266
Type: schema.TypeList,
258267
Optional: true,
@@ -397,6 +406,12 @@ func resourceSecretManagerSecretCreate(d *schema.ResourceData, meta interface{})
397406
} else if v, ok := d.GetOkExists("rotation"); !tpgresource.IsEmptyValue(reflect.ValueOf(rotationProp)) && (ok || !reflect.DeepEqual(v, rotationProp)) {
398407
obj["rotation"] = rotationProp
399408
}
409+
tagsProp, err := expandSecretManagerSecretTags(d.Get("tags"), d, config)
410+
if err != nil {
411+
return err
412+
} else if v, ok := d.GetOkExists("tags"); !tpgresource.IsEmptyValue(reflect.ValueOf(tagsProp)) && (ok || !reflect.DeepEqual(v, tagsProp)) {
413+
obj["tags"] = tagsProp
414+
}
400415
labelsProp, err := expandSecretManagerSecretEffectiveLabels(d.Get("effective_labels"), d, config)
401416
if err != nil {
402417
return err
@@ -1231,6 +1246,17 @@ func expandSecretManagerSecretRotationRotationPeriod(v interface{}, d tpgresourc
12311246
return v, nil
12321247
}
12331248

1249+
func expandSecretManagerSecretTags(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
1250+
if v == nil {
1251+
return map[string]string{}, nil
1252+
}
1253+
m := make(map[string]string)
1254+
for k, val := range v.(map[string]interface{}) {
1255+
m[k] = val.(string)
1256+
}
1257+
return m, nil
1258+
}
1259+
12341260
func expandSecretManagerSecretEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
12351261
if v == nil {
12361262
return map[string]string{}, nil

google-beta/services/secretmanager/resource_secret_manager_secret_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ fields:
2626
- field: 'rotation.rotation_period'
2727
- field: 'secret_id'
2828
provider_only: true
29+
- field: 'tags'
2930
- field: 'terraform_labels'
3031
provider_only: true
3132
- field: 'topics.name'

google-beta/services/secretmanager/resource_secret_manager_secret_generated_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestAccSecretManagerSecret_secretConfigBasicExample(t *testing.T) {
4949
ResourceName: "google_secret_manager_secret.secret-basic",
5050
ImportState: true,
5151
ImportStateVerify: true,
52-
ImportStateVerifyIgnore: []string{"annotations", "deletion_protection", "labels", "secret_id", "terraform_labels", "ttl"},
52+
ImportStateVerifyIgnore: []string{"annotations", "deletion_protection", "labels", "secret_id", "tags", "terraform_labels", "ttl"},
5353
},
5454
},
5555
})
@@ -98,7 +98,7 @@ func TestAccSecretManagerSecret_secretWithAnnotationsExample(t *testing.T) {
9898
ResourceName: "google_secret_manager_secret.secret-with-annotations",
9999
ImportState: true,
100100
ImportStateVerify: true,
101-
ImportStateVerifyIgnore: []string{"annotations", "labels", "secret_id", "terraform_labels", "ttl"},
101+
ImportStateVerifyIgnore: []string{"annotations", "labels", "secret_id", "tags", "terraform_labels", "ttl"},
102102
},
103103
},
104104
})
@@ -147,7 +147,7 @@ func TestAccSecretManagerSecret_secretWithVersionDestroyTtlExample(t *testing.T)
147147
ResourceName: "google_secret_manager_secret.secret-with-version-destroy-ttl",
148148
ImportState: true,
149149
ImportStateVerify: true,
150-
ImportStateVerifyIgnore: []string{"annotations", "labels", "secret_id", "terraform_labels", "ttl"},
150+
ImportStateVerifyIgnore: []string{"annotations", "labels", "secret_id", "tags", "terraform_labels", "ttl"},
151151
},
152152
},
153153
})
@@ -187,7 +187,7 @@ func TestAccSecretManagerSecret_secretWithAutomaticCmekExample(t *testing.T) {
187187
ResourceName: "google_secret_manager_secret.secret-with-automatic-cmek",
188188
ImportState: true,
189189
ImportStateVerify: true,
190-
ImportStateVerifyIgnore: []string{"annotations", "labels", "secret_id", "terraform_labels", "ttl"},
190+
ImportStateVerifyIgnore: []string{"annotations", "labels", "secret_id", "tags", "terraform_labels", "ttl"},
191191
},
192192
},
193193
})

google-beta/services/secretmanager/resource_secret_manager_secret_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,39 @@ func TestAccSecretManagerSecret_DeletionProtection(t *testing.T) {
507507
})
508508
}
509509

510+
func TestAccSecretManagerSecret_tags(t *testing.T) {
511+
t.Parallel()
512+
513+
tagKey := acctest.BootstrapSharedTestOrganizationTagKey(t, "secret_manager_secret-tagkey", map[string]interface{}{})
514+
515+
context := map[string]interface{}{
516+
"org": envvar.GetTestOrgFromEnv(t),
517+
"tagKey": tagKey,
518+
"tagValue": acctest.BootstrapSharedTestOrganizationTagValue(t, "secret_manager_secret-tagvalue", tagKey),
519+
"random_suffix": acctest.RandString(t, 10),
520+
}
521+
522+
acctest.VcrTest(t, resource.TestCase{
523+
PreCheck: func() { acctest.AccTestPreCheck(t) },
524+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
525+
CheckDestroy: testAccCheckSecretManagerSecretDestroyProducer(t),
526+
Steps: []resource.TestStep{
527+
{
528+
Config: testAccSecretManagerSecretTags(context),
529+
},
530+
{
531+
ResourceName: "google_secret_manager_secret.secret-tags",
532+
ImportState: true,
533+
ImportStateVerify: true,
534+
ImportStateVerifyIgnore: []string{"ttl", "labels", "terraform_labels", "deletion_protection", "tags"},
535+
},
536+
{
537+
Config: testAccSecretManagerSecretTagsDeletionProtection(context),
538+
},
539+
},
540+
})
541+
}
542+
510543
func testAccSecretManagerSecret_basic(context map[string]interface{}) string {
511544
return acctest.Nprintf(`
512545
resource "google_secret_manager_secret" "secret-basic" {
@@ -1317,3 +1350,54 @@ resource "google_secret_manager_secret" "secret-deletionprotection" {
13171350
}
13181351
`, context)
13191352
}
1353+
1354+
func testAccSecretManagerSecretTags(context map[string]interface{}) string {
1355+
return acctest.Nprintf(`
1356+
resource "google_secret_manager_secret" "secret-tags" {
1357+
secret_id = "tf-test-secret-%{random_suffix}"
1358+
labels = {
1359+
label = "my-label"
1360+
}
1361+
replication {
1362+
user_managed {
1363+
replicas {
1364+
location = "us-central1"
1365+
}
1366+
replicas {
1367+
location = "us-east1"
1368+
}
1369+
}
1370+
}
1371+
ttl = "3600s"
1372+
tags = {
1373+
"%{org}/%{tagKey}" = "%{tagValue}"
1374+
}
1375+
}
1376+
`, context)
1377+
}
1378+
1379+
func testAccSecretManagerSecretTagsDeletionProtection(context map[string]interface{}) string {
1380+
return acctest.Nprintf(`
1381+
resource "google_secret_manager_secret" "secret-tags" {
1382+
secret_id = "tf-test-secret-%{random_suffix}"
1383+
labels = {
1384+
label = "my-label"
1385+
}
1386+
replication {
1387+
user_managed {
1388+
replicas {
1389+
location = "us-central1"
1390+
}
1391+
replicas {
1392+
location = "us-east1"
1393+
}
1394+
}
1395+
}
1396+
ttl = "3600s"
1397+
tags = {
1398+
"%{org}/%{tagKey}" = "%{tagValue}"
1399+
}
1400+
deletion_protection = false
1401+
}
1402+
`, context)
1403+
}

website/docs/r/secret_manager_secret.html.markdown

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,12 @@ The following arguments are supported:
225225
The rotation time and period for a Secret. At `next_rotation_time`, Secret Manager will send a Pub/Sub notification to the topics configured on the Secret. `topics` must be set to configure rotation.
226226
Structure is [documented below](#nested_rotation).
227227

228+
* `tags` -
229+
(Optional)
230+
A map of resource manager tags.
231+
Resource manager tag keys and values have the same definition as resource manager tags.
232+
Keys must be in the format tagKeys/{tag_key_id}, and values are in the format tagValues/{tag_value_id}.
233+
228234
* `project` - (Optional) The ID of the project in which the resource belongs.
229235
If it is not provided, the provider project is used.
230236

0 commit comments

Comments
 (0)