Skip to content

Commit 6c79405

Browse files
added encryption_config field to google_backup_dr_backup_vault (#15583) (#11086)
[upstream:5425dbd16171e0c67ab67cea073ca18d9b35d001] Signed-off-by: Modular Magician <magic-modules@google.com>
1 parent 3fa044d commit 6c79405

File tree

5 files changed

+191
-4
lines changed

5 files changed

+191
-4
lines changed

.changelog/15583.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
unknown: added `encryption_config` field to `google_backup_dr_backup_vault`

google-beta/services/backupdr/resource_backup_dr_backup_vault.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,21 @@ Please refer to the field 'effective_annotations' for all of the annotations pre
167167
Optional: true,
168168
Description: `Optional. Time after which the BackupVault resource is locked.`,
169169
},
170+
"encryption_config": {
171+
Type: schema.TypeList,
172+
Optional: true,
173+
Description: `Encryption configuration for the backup vault.`,
174+
MaxItems: 1,
175+
Elem: &schema.Resource{
176+
Schema: map[string]*schema.Schema{
177+
"kms_key_name": {
178+
Type: schema.TypeString,
179+
Optional: true,
180+
Description: `The Resource name of the Cloud KMS key to be used to encrypt new backups. The key must be in the same location as the backup vault. The key must be a Cloud KMS CryptoKey.`,
181+
},
182+
},
183+
},
184+
},
170185
"force_delete": {
171186
Type: schema.TypeBool,
172187
Optional: true,
@@ -334,6 +349,12 @@ func resourceBackupDRBackupVaultCreate(d *schema.ResourceData, meta interface{})
334349
} else if v, ok := d.GetOkExists("backup_retention_inheritance"); !tpgresource.IsEmptyValue(reflect.ValueOf(backupRetentionInheritanceProp)) && (ok || !reflect.DeepEqual(v, backupRetentionInheritanceProp)) {
335350
obj["backupRetentionInheritance"] = backupRetentionInheritanceProp
336351
}
352+
encryptionConfigProp, err := expandBackupDRBackupVaultEncryptionConfig(d.Get("encryption_config"), d, config)
353+
if err != nil {
354+
return err
355+
} else if v, ok := d.GetOkExists("encryption_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(encryptionConfigProp)) && (ok || !reflect.DeepEqual(v, encryptionConfigProp)) {
356+
obj["encryptionConfig"] = encryptionConfigProp
357+
}
337358
effectiveLabelsProp, err := expandBackupDRBackupVaultEffectiveLabels(d.Get("effective_labels"), d, config)
338359
if err != nil {
339360
return err
@@ -493,6 +514,9 @@ func resourceBackupDRBackupVaultRead(d *schema.ResourceData, meta interface{}) e
493514
if err := d.Set("access_restriction", flattenBackupDRBackupVaultAccessRestriction(res["accessRestriction"], d, config)); err != nil {
494515
return fmt.Errorf("Error reading BackupVault: %s", err)
495516
}
517+
if err := d.Set("encryption_config", flattenBackupDRBackupVaultEncryptionConfig(res["encryptionConfig"], d, config)); err != nil {
518+
return fmt.Errorf("Error reading BackupVault: %s", err)
519+
}
496520
if err := d.Set("terraform_labels", flattenBackupDRBackupVaultTerraformLabels(res["labels"], d, config)); err != nil {
497521
return fmt.Errorf("Error reading BackupVault: %s", err)
498522
}
@@ -546,6 +570,12 @@ func resourceBackupDRBackupVaultUpdate(d *schema.ResourceData, meta interface{})
546570
} else if v, ok := d.GetOkExists("backup_retention_inheritance"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, backupRetentionInheritanceProp)) {
547571
obj["backupRetentionInheritance"] = backupRetentionInheritanceProp
548572
}
573+
encryptionConfigProp, err := expandBackupDRBackupVaultEncryptionConfig(d.Get("encryption_config"), d, config)
574+
if err != nil {
575+
return err
576+
} else if v, ok := d.GetOkExists("encryption_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, encryptionConfigProp)) {
577+
obj["encryptionConfig"] = encryptionConfigProp
578+
}
549579
effectiveLabelsProp, err := expandBackupDRBackupVaultEffectiveLabels(d.Get("effective_labels"), d, config)
550580
if err != nil {
551581
return err
@@ -584,6 +614,10 @@ func resourceBackupDRBackupVaultUpdate(d *schema.ResourceData, meta interface{})
584614
updateMask = append(updateMask, "backupRetentionInheritance")
585615
}
586616

617+
if d.HasChange("encryption_config") {
618+
updateMask = append(updateMask, "encryptionConfig")
619+
}
620+
587621
if d.HasChange("effective_labels") {
588622
updateMask = append(updateMask, "labels")
589623
}
@@ -820,6 +854,23 @@ func flattenBackupDRBackupVaultAccessRestriction(v interface{}, d *schema.Resour
820854
return v
821855
}
822856

857+
func flattenBackupDRBackupVaultEncryptionConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
858+
if v == nil {
859+
return nil
860+
}
861+
original := v.(map[string]interface{})
862+
if len(original) == 0 {
863+
return nil
864+
}
865+
transformed := make(map[string]interface{})
866+
transformed["kms_key_name"] =
867+
flattenBackupDRBackupVaultEncryptionConfigKmsKeyName(original["kmsKeyName"], d, config)
868+
return []interface{}{transformed}
869+
}
870+
func flattenBackupDRBackupVaultEncryptionConfigKmsKeyName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
871+
return v
872+
}
873+
823874
func flattenBackupDRBackupVaultTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
824875
if v == nil {
825876
return v
@@ -863,6 +914,32 @@ func expandBackupDRBackupVaultBackupRetentionInheritance(v interface{}, d tpgres
863914
return v, nil
864915
}
865916

917+
func expandBackupDRBackupVaultEncryptionConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
918+
if v == nil {
919+
return nil, nil
920+
}
921+
l := v.([]interface{})
922+
if len(l) == 0 || l[0] == nil {
923+
return nil, nil
924+
}
925+
raw := l[0]
926+
original := raw.(map[string]interface{})
927+
transformed := make(map[string]interface{})
928+
929+
transformedKmsKeyName, err := expandBackupDRBackupVaultEncryptionConfigKmsKeyName(original["kms_key_name"], d, config)
930+
if err != nil {
931+
return nil, err
932+
} else if val := reflect.ValueOf(transformedKmsKeyName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
933+
transformed["kmsKeyName"] = transformedKmsKeyName
934+
}
935+
936+
return transformed, nil
937+
}
938+
939+
func expandBackupDRBackupVaultEncryptionConfigKmsKeyName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
940+
return v, nil
941+
}
942+
866943
func expandBackupDRBackupVaultEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
867944
if v == nil {
868945
return map[string]string{}, nil

google-beta/services/backupdr/resource_backup_dr_backup_vault_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ fields:
2222
- field: 'effective_labels'
2323
provider_only: true
2424
- api_field: 'effectiveTime'
25+
- api_field: 'encryptionConfig.kmsKeyName'
2526
- api_field: 'etag'
2627
- field: 'force_delete'
2728
provider_only: true

google-beta/services/backupdr/resource_backup_dr_backup_vault_generated_test.go

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ var (
5050
_ = googleapi.Error{}
5151
)
5252

53-
func TestAccBackupDRBackupVault_backupDrBackupVaultFullExample(t *testing.T) {
53+
func TestAccBackupDRBackupVault_backupDrBackupVaultSimpleExample(t *testing.T) {
5454
t.Parallel()
5555

5656
context := map[string]interface{}{
@@ -64,7 +64,7 @@ func TestAccBackupDRBackupVault_backupDrBackupVaultFullExample(t *testing.T) {
6464
CheckDestroy: testAccCheckBackupDRBackupVaultDestroyProducer(t),
6565
Steps: []resource.TestStep{
6666
{
67-
Config: testAccBackupDRBackupVault_backupDrBackupVaultFullExample(context),
67+
Config: testAccBackupDRBackupVault_backupDrBackupVaultSimpleExample(context),
6868
},
6969
{
7070
ResourceName: "google_backup_dr_backup_vault.backup-vault-test",
@@ -76,7 +76,7 @@ func TestAccBackupDRBackupVault_backupDrBackupVaultFullExample(t *testing.T) {
7676
})
7777
}
7878

79-
func testAccBackupDRBackupVault_backupDrBackupVaultFullExample(context map[string]interface{}) string {
79+
func testAccBackupDRBackupVault_backupDrBackupVaultSimpleExample(context map[string]interface{}) string {
8080
return acctest.Nprintf(`
8181
resource "google_backup_dr_backup_vault" "backup-vault-test" {
8282
location = "us-central1"
@@ -101,6 +101,71 @@ resource "google_backup_dr_backup_vault" "backup-vault-test" {
101101
`, context)
102102
}
103103

104+
func TestAccBackupDRBackupVault_backupDrBackupVaultCmekExample(t *testing.T) {
105+
t.Parallel()
106+
acctest.BootstrapIamMembers(t, []acctest.IamMember{
107+
{
108+
Member: "serviceAccount:service-{project_number}@gcp-sa-backupdr.iam.gserviceaccount.com",
109+
Role: "roles/cloudkms.cryptoKeyEncrypterDecrypter",
110+
},
111+
})
112+
113+
context := map[string]interface{}{
114+
"project": envvar.GetTestProjectFromEnv(),
115+
"kms_key_name": acctest.BootstrapKMSKeyInLocation(t, "us-central1").CryptoKey.Name,
116+
"random_suffix": acctest.RandString(t, 10),
117+
}
118+
119+
acctest.VcrTest(t, resource.TestCase{
120+
PreCheck: func() { acctest.AccTestPreCheck(t) },
121+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
122+
CheckDestroy: testAccCheckBackupDRBackupVaultDestroyProducer(t),
123+
Steps: []resource.TestStep{
124+
{
125+
Config: testAccBackupDRBackupVault_backupDrBackupVaultCmekExample(context),
126+
},
127+
{
128+
ResourceName: "google_backup_dr_backup_vault.backup-vault-cmek",
129+
ImportState: true,
130+
ImportStateVerify: true,
131+
ImportStateVerifyIgnore: []string{"allow_missing", "annotations", "backup_retention_inheritance", "backup_vault_id", "force_delete", "force_update", "ignore_backup_plan_references", "ignore_inactive_datasources", "labels", "location", "terraform_labels"},
132+
},
133+
},
134+
})
135+
}
136+
137+
func testAccBackupDRBackupVault_backupDrBackupVaultCmekExample(context map[string]interface{}) string {
138+
return acctest.Nprintf(`
139+
data "google_project" "test_project" {
140+
project_id = "%{project}"
141+
}
142+
143+
resource "google_backup_dr_backup_vault" "backup-vault-cmek" {
144+
location = "us-central1"
145+
backup_vault_id = "tf-test-backup-vault-cmek%{random_suffix}"
146+
description = "This is a second backup vault built by Terraform."
147+
backup_minimum_enforced_retention_duration = "100000s"
148+
annotations = {
149+
annotations1 = "bar1"
150+
annotations2 = "baz1"
151+
}
152+
labels = {
153+
foo = "bar1"
154+
bar = "baz1"
155+
}
156+
encryption_config {
157+
kms_key_name = "%{kms_key_name}"
158+
}
159+
force_update = "true"
160+
access_restriction = "WITHIN_ORGANIZATION"
161+
backup_retention_inheritance = "INHERIT_VAULT_RETENTION"
162+
ignore_inactive_datasources = "true"
163+
ignore_backup_plan_references = "true"
164+
allow_missing = "true"
165+
}
166+
`, context)
167+
}
168+
104169
func testAccCheckBackupDRBackupVaultDestroyProducer(t *testing.T) func(s *terraform.State) error {
105170
return func(s *terraform.State) error {
106171
for name, rs := range s.RootModule().Resources {

website/docs/r/backup_dr_backup_vault.html.markdown

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Container to store and organize immutable and indelible backups.
2525

2626

2727

28-
## Example Usage - Backup Dr Backup Vault Full
28+
## Example Usage - Backup Dr Backup Vault Simple
2929

3030

3131
```hcl
@@ -50,6 +50,38 @@ resource "google_backup_dr_backup_vault" "backup-vault-test" {
5050
allow_missing = "true"
5151
}
5252
```
53+
## Example Usage - Backup Dr Backup Vault Cmek
54+
55+
56+
```hcl
57+
data "google_project" "test_project" {
58+
project_id = "my-project-name"
59+
}
60+
61+
resource "google_backup_dr_backup_vault" "backup-vault-cmek" {
62+
location = "us-central1"
63+
backup_vault_id = "backup-vault-cmek"
64+
description = "This is a second backup vault built by Terraform."
65+
backup_minimum_enforced_retention_duration = "100000s"
66+
annotations = {
67+
annotations1 = "bar1"
68+
annotations2 = "baz1"
69+
}
70+
labels = {
71+
foo = "bar1"
72+
bar = "baz1"
73+
}
74+
encryption_config {
75+
kms_key_name = "bkpvault-key"
76+
}
77+
force_update = "true"
78+
access_restriction = "WITHIN_ORGANIZATION"
79+
backup_retention_inheritance = "INHERIT_VAULT_RETENTION"
80+
ignore_inactive_datasources = "true"
81+
ignore_backup_plan_references = "true"
82+
allow_missing = "true"
83+
}
84+
```
5385

5486
## Argument Reference
5587

@@ -101,6 +133,11 @@ The following arguments are supported:
101133
How a backup's enforced retention end time is inherited. Default value is `INHERIT_VAULT_RETENTION` if not provided during creation.
102134
Possible values are: `BACKUP_RETENTION_INHERITANCE_UNSPECIFIED`, `INHERIT_VAULT_RETENTION`, `MATCH_BACKUP_EXPIRE_TIME`.
103135

136+
* `encryption_config` -
137+
(Optional)
138+
Encryption configuration for the backup vault.
139+
Structure is [documented below](#nested_encryption_config).
140+
104141
* `force_update` -
105142
(Optional)
106143
If set, allow update to extend the minimum enforced retention for backup vault. This overrides
@@ -135,6 +172,12 @@ The following arguments are supported:
135172

136173

137174

175+
<a name="nested_encryption_config"></a>The `encryption_config` block supports:
176+
177+
* `kms_key_name` -
178+
(Optional)
179+
The Resource name of the Cloud KMS key to be used to encrypt new backups. The key must be in the same location as the backup vault. The key must be a Cloud KMS CryptoKey.
180+
138181
## Attributes Reference
139182

140183
In addition to the arguments listed above, the following computed attributes are exported:

0 commit comments

Comments
 (0)