Skip to content

Commit f7c8bb7

Browse files
authored
fix(spanner): prevent forceNew when kmsKeyName and kmsKeyNames are same (#15726)
1 parent 4113c98 commit f7c8bb7

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

mmv1/products/spanner/Database.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ custom_code:
6060
pre_delete: 'templates/terraform/pre_delete/resource_spanner_database.go.tmpl'
6161
custom_diff:
6262
- 'resourceSpannerDBDdlCustomDiff'
63+
- 'resourceSpannerEncryptionConfigCustomDiff'
6364
# Sweeper skipped as this resource has customized deletion.
6465
exclude_sweeper: true
6566
examples:
@@ -167,6 +168,7 @@ properties:
167168
Fully qualified name of the KMS keys to use to encrypt this database. The keys must exist
168169
in the same locations as the Spanner Database.
169170
immutable: true
171+
default_from_api: true
170172
custom_flatten: templates/terraform/custom_flatten/spanner_database_kms_key_names.go.tmpl
171173
item_type:
172174
type: String

mmv1/templates/terraform/constants/spanner_database.go.tmpl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,31 @@ func resourceSpannerDBVirtualUpdate(d *schema.ResourceData, resourceSchema map[s
5656
return true
5757
}
5858
return false
59+
}
60+
61+
func resourceSpannerEncryptionConfigCustomDiffFunc(diff tpgresource.TerraformResourceDiff) error {
62+
if diff.HasChange("encryption_config.0.kms_key_names") {
63+
kmsKeyName := diff.Get("encryption_config.0.kms_key_name")
64+
if kmsKeyName == "" {
65+
return nil
66+
}
67+
old, new := diff.GetChange("encryption_config.0.kms_key_names")
68+
if old == nil {
69+
old = []interface{}{}
70+
}
71+
if new == nil {
72+
new = []interface{}{}
73+
}
74+
oldKeys := old.([]interface{})
75+
newKeys := new.([]interface{})
76+
if len(newKeys) == 0 && len(oldKeys) == 1 && oldKeys[0] == kmsKeyName {
77+
return diff.Clear("encryption_config.0.kms_key_names")
78+
}
79+
return diff.ForceNew("encryption_config.0.kms_key_names")
80+
}
81+
return nil
82+
}
83+
84+
func resourceSpannerEncryptionConfigCustomDiff(_ context.Context, diff *schema.ResourceDiff, meta interface{}) error {
85+
return resourceSpannerEncryptionConfigCustomDiffFunc(diff)
5986
}

mmv1/third_party/terraform/services/spanner/resource_spanner_database_internal_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,48 @@ func TestDatabaseNameForApi(t *testing.T) {
9595
expected := "projects/project123/instances/instance456/databases/db789"
9696
expectEquals(t, expected, actual)
9797
}
98+
99+
func TestSpannerDatabase_resourceSpannerEncryptionConfigCustomDiffFuncForceNew(t *testing.T) {
100+
t.Parallel()
101+
102+
cases := map[string]struct {
103+
before map[string]interface{}
104+
after map[string]interface{}
105+
forcenew bool
106+
}{
107+
"kms_key_name_and_kms_key_names_are_same": {
108+
before: map[string]interface{}{
109+
"encryption_config.0.kms_key_name": "key1",
110+
"encryption_config.0.kms_key_names": []interface{}{"key1"},
111+
},
112+
after: map[string]interface{}{
113+
"encryption_config.0.kms_key_name": "key1",
114+
},
115+
forcenew: false,
116+
},
117+
"kms_key_name_and_kms_key_names_are_different": {
118+
before: map[string]interface{}{
119+
"encryption_config.0.kms_key_name": "key1",
120+
},
121+
after: map[string]interface{}{
122+
"encryption_config.0.kms_key_name": "key1",
123+
"encryption_config.0.kms_key_names": []interface{}{"key2"},
124+
},
125+
forcenew: true,
126+
},
127+
}
128+
129+
for tn, tc := range cases {
130+
d := &tpgresource.ResourceDiffMock{
131+
Before: tc.before,
132+
After: tc.after,
133+
}
134+
err := resourceSpannerEncryptionConfigCustomDiffFunc(d)
135+
if err != nil {
136+
t.Errorf("failed, expected no error but received - %s for the condition %s", err, tn)
137+
}
138+
if d.IsForceNew != tc.forcenew {
139+
t.Errorf("ForceNew not setup correctly for the condition-'%s', expected:%v;actual:%v", tn, tc.forcenew, d.IsForceNew)
140+
}
141+
}
142+
}

0 commit comments

Comments
 (0)