Skip to content

Commit 3ad4a48

Browse files
Add deletion_protection field to Secret Manager Secret (#14394) (#23480)
[upstream:9bf4df756b3dbdf754d974383513bcbf5a0a8c47] Signed-off-by: Modular Magician <[email protected]>
1 parent fb4e83d commit 3ad4a48

8 files changed

+125
-227
lines changed

.changelog/14394.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 `deletion_protection` field to `google_secret_manager_secret` resource to make deleting them require an explicit intent. `google_active_directory_domain` resources now cannot be destroyed unless `deletion_protection = false` is set for the resource.
3+
```

google/services/secretmanager/iam_secret_manager_secret_generated_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ resource "google_secret_manager_secret" "secret-basic" {
349349
}
350350
}
351351
}
352+
deletion_protection = false
352353
}
353354
354355
resource "google_secret_manager_secret_iam_member" "foo" {
@@ -379,6 +380,7 @@ resource "google_secret_manager_secret" "secret-basic" {
379380
}
380381
}
381382
}
383+
deletion_protection = false
382384
}
383385
384386
data "google_iam_policy" "foo" {
@@ -423,6 +425,7 @@ resource "google_secret_manager_secret" "secret-basic" {
423425
}
424426
}
425427
}
428+
deletion_protection = false
426429
}
427430
428431
data "google_iam_policy" "foo" {
@@ -455,6 +458,7 @@ resource "google_secret_manager_secret" "secret-basic" {
455458
}
456459
}
457460
}
461+
deletion_protection = false
458462
}
459463
460464
resource "google_secret_manager_secret_iam_binding" "foo" {
@@ -485,6 +489,7 @@ resource "google_secret_manager_secret" "secret-basic" {
485489
}
486490
}
487491
}
492+
deletion_protection = false
488493
}
489494
490495
resource "google_secret_manager_secret_iam_binding" "foo" {
@@ -515,6 +520,7 @@ resource "google_secret_manager_secret" "secret-basic" {
515520
}
516521
}
517522
}
523+
deletion_protection = false
518524
}
519525
520526
resource "google_secret_manager_secret_iam_binding" "foo" {
@@ -550,6 +556,7 @@ resource "google_secret_manager_secret" "secret-basic" {
550556
}
551557
}
552558
}
559+
deletion_protection = false
553560
}
554561
555562
resource "google_secret_manager_secret_iam_binding" "foo" {
@@ -605,6 +612,7 @@ resource "google_secret_manager_secret" "secret-basic" {
605612
}
606613
}
607614
}
615+
deletion_protection = false
608616
}
609617
610618
resource "google_secret_manager_secret_iam_member" "foo" {
@@ -640,6 +648,7 @@ resource "google_secret_manager_secret" "secret-basic" {
640648
}
641649
}
642650
}
651+
deletion_protection = false
643652
}
644653
645654
resource "google_secret_manager_secret_iam_member" "foo" {
@@ -695,6 +704,7 @@ resource "google_secret_manager_secret" "secret-basic" {
695704
}
696705
}
697706
}
707+
deletion_protection = false
698708
}
699709
700710
data "google_iam_policy" "foo" {

google/services/secretmanager/resource_secret_manager_secret.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,14 @@ the actual destruction happens after this TTL expires.`,
328328
and default labels configured on the provider.`,
329329
Elem: &schema.Schema{Type: schema.TypeString},
330330
},
331+
"deletion_protection": {
332+
Type: schema.TypeBool,
333+
Optional: true,
334+
Description: `Whether Terraform will be prevented from destroying the secret. Defaults to false.
335+
When the field is set to true in Terraform state, a 'terraform apply'
336+
or 'terraform destroy' that would delete the secret will fail.`,
337+
Default: false,
338+
},
331339
"project": {
332340
Type: schema.TypeString,
333341
Optional: true,
@@ -486,6 +494,12 @@ func resourceSecretManagerSecretRead(d *schema.ResourceData, meta interface{}) e
486494
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("SecretManagerSecret %q", d.Id()))
487495
}
488496

497+
// Explicitly set virtual fields to default values if unset
498+
if _, ok := d.GetOkExists("deletion_protection"); !ok {
499+
if err := d.Set("deletion_protection", false); err != nil {
500+
return fmt.Errorf("Error setting deletion_protection: %s", err)
501+
}
502+
}
489503
if err := d.Set("project", project); err != nil {
490504
return fmt.Errorf("Error reading Secret: %s", err)
491505
}
@@ -725,6 +739,9 @@ func resourceSecretManagerSecretDelete(d *schema.ResourceData, meta interface{})
725739
}
726740

727741
headers := make(http.Header)
742+
if d.Get("deletion_protection").(bool) {
743+
return fmt.Errorf("cannot destroy secret manager secret without setting deletion_protection=false and running `terraform apply`")
744+
}
728745

729746
log.Printf("[DEBUG] Deleting Secret %q", d.Id())
730747
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
@@ -762,6 +779,11 @@ func resourceSecretManagerSecretImport(d *schema.ResourceData, meta interface{})
762779
}
763780
d.SetId(id)
764781

782+
// Explicitly set virtual fields to default values on import
783+
if err := d.Set("deletion_protection", false); err != nil {
784+
return nil, fmt.Errorf("Error setting deletion_protection: %s", err)
785+
}
786+
765787
return []*schema.ResourceData{d}, nil
766788
}
767789

google/services/secretmanager/resource_secret_manager_secret_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ api_variant_patterns:
99
fields:
1010
- field: 'annotations'
1111
- field: 'create_time'
12+
- field: 'deletion_protection'
13+
provider_only: true
1214
- field: 'effective_annotations'
1315
provider_only: true
1416
- field: 'effective_labels'

google/services/secretmanager/resource_secret_manager_secret_generated_test.go

Lines changed: 2 additions & 1 deletion
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", "labels", "secret_id", "terraform_labels", "ttl"},
52+
ImportStateVerifyIgnore: []string{"annotations", "deletion_protection", "labels", "secret_id", "terraform_labels", "ttl"},
5353
},
5454
},
5555
})
@@ -74,6 +74,7 @@ resource "google_secret_manager_secret" "secret-basic" {
7474
}
7575
}
7676
}
77+
deletion_protection = false
7778
}
7879
`, context)
7980
}

google/services/secretmanager/resource_secret_manager_secret_sweeper.go

Lines changed: 0 additions & 226 deletions
This file was deleted.

0 commit comments

Comments
 (0)