@@ -162,10 +162,22 @@ whereas setting “enableDropProtection” to true protects the database from de
162162 Schema : map [string ]* schema.Schema {
163163 "kms_key_name" : {
164164 Type : schema .TypeString ,
165- Required : true ,
165+ Optional : true ,
166166 ForceNew : true ,
167167 Description : `Fully qualified name of the KMS key to use to encrypt this database. This key must exist
168168in the same location as the Spanner Database.` ,
169+ ExactlyOneOf : []string {"encryption_config.0.kms_key_name" , "encryption_config.0.kms_key_names" },
170+ },
171+ "kms_key_names" : {
172+ Type : schema .TypeList ,
173+ Optional : true ,
174+ ForceNew : true ,
175+ Description : `Fully qualified name of the KMS keys to use to encrypt this database. The keys must exist
176+ in the same locations as the Spanner Database.` ,
177+ Elem : & schema.Schema {
178+ Type : schema .TypeString ,
179+ },
180+ ExactlyOneOf : []string {"encryption_config.0.kms_key_name" , "encryption_config.0.kms_key_names" },
169181 },
170182 },
171183 },
@@ -821,12 +833,46 @@ func flattenSpannerDatabaseEncryptionConfig(v interface{}, d *schema.ResourceDat
821833 transformed := make (map [string ]interface {})
822834 transformed ["kms_key_name" ] =
823835 flattenSpannerDatabaseEncryptionConfigKmsKeyName (original ["kmsKeyName" ], d , config )
836+ transformed ["kms_key_names" ] =
837+ flattenSpannerDatabaseEncryptionConfigKmsKeyNames (original ["kmsKeyNames" ], d , config )
824838 return []interface {}{transformed }
825839}
826840func flattenSpannerDatabaseEncryptionConfigKmsKeyName (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
827841 return v
828842}
829843
844+ func flattenSpannerDatabaseEncryptionConfigKmsKeyNames (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
845+ // Ignore `kms_key_names` if `kms_key_name` is set, because that field takes precedence.
846+ _ , kmsNameSet := d .GetOk ("encryption_config.0.kms_key_name" )
847+ if kmsNameSet {
848+ return nil
849+ }
850+
851+ rawConfigValue := d .Get ("encryption_config.0.kms_key_names" )
852+
853+ // Convert config value to []string
854+ configValue , err := tpgresource .InterfaceSliceToStringSlice (rawConfigValue )
855+ if err != nil {
856+ log .Printf ("[ERROR] Failed to convert config value: %s" , err )
857+ return v
858+ }
859+
860+ // Convert v to []string
861+ apiStringValue , err := tpgresource .InterfaceSliceToStringSlice (v )
862+ if err != nil {
863+ log .Printf ("[ERROR] Failed to convert API value: %s" , err )
864+ return v
865+ }
866+
867+ sortedStrings , err := tpgresource .SortStringsByConfigOrder (configValue , apiStringValue )
868+ if err != nil {
869+ log .Printf ("[ERROR] Could not sort API response value: %s" , err )
870+ return v
871+ }
872+
873+ return sortedStrings
874+ }
875+
830876func flattenSpannerDatabaseDatabaseDialect (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
831877 return v
832878}
@@ -870,13 +916,24 @@ func expandSpannerDatabaseEncryptionConfig(v interface{}, d tpgresource.Terrafor
870916 transformed ["kmsKeyName" ] = transformedKmsKeyName
871917 }
872918
919+ transformedKmsKeyNames , err := expandSpannerDatabaseEncryptionConfigKmsKeyNames (original ["kms_key_names" ], d , config )
920+ if err != nil {
921+ return nil , err
922+ } else if val := reflect .ValueOf (transformedKmsKeyNames ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
923+ transformed ["kmsKeyNames" ] = transformedKmsKeyNames
924+ }
925+
873926 return transformed , nil
874927}
875928
876929func expandSpannerDatabaseEncryptionConfigKmsKeyName (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
877930 return v , nil
878931}
879932
933+ func expandSpannerDatabaseEncryptionConfigKmsKeyNames (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
934+ return v , nil
935+ }
936+
880937func expandSpannerDatabaseDatabaseDialect (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
881938 return v , nil
882939}
0 commit comments