@@ -80,6 +80,50 @@ projects/{projectId}/locations/{locationId}/clusters/{clusterId}`,
80
80
Description : `Optional. The authorization mode of the Redis cluster. If not provided, auth feature is disabled for the cluster. Default value: "AUTH_MODE_DISABLED" Possible values: ["AUTH_MODE_UNSPECIFIED", "AUTH_MODE_IAM_AUTH", "AUTH_MODE_DISABLED"]` ,
81
81
Default : "AUTH_MODE_DISABLED" ,
82
82
},
83
+ "automated_backup_config" : {
84
+ Type : schema .TypeList ,
85
+ Optional : true ,
86
+ Description : `The automated backup config for a instance.` ,
87
+ MaxItems : 1 ,
88
+ Elem : & schema.Resource {
89
+ Schema : map [string ]* schema.Schema {
90
+ "fixed_frequency_schedule" : {
91
+ Type : schema .TypeList ,
92
+ Required : true ,
93
+ Description : `Trigger automated backups at a fixed frequency.` ,
94
+ MaxItems : 1 ,
95
+ Elem : & schema.Resource {
96
+ Schema : map [string ]* schema.Schema {
97
+ "start_time" : {
98
+ Type : schema .TypeList ,
99
+ Required : true ,
100
+ Description : `The start time of every automated backup in UTC.
101
+ It must be set to the start of an hour. This field is required.` ,
102
+ MaxItems : 1 ,
103
+ Elem : & schema.Resource {
104
+ Schema : map [string ]* schema.Schema {
105
+ "hours" : {
106
+ Type : schema .TypeInt ,
107
+ Required : true ,
108
+ Description : `Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23.
109
+ An API may choose to allow the value "24:00:00" for scenarios like business closing time.` ,
110
+ },
111
+ },
112
+ },
113
+ },
114
+ },
115
+ },
116
+ },
117
+ "retention" : {
118
+ Type : schema .TypeString ,
119
+ Required : true ,
120
+ Description : `How long to keep automated backups before the backups are deleted.
121
+ The value should be between 1 day and 365 days. If not specified, the default value is 35 days.
122
+ A duration in seconds with up to nine fractional digits, ending with 's'. Example: "3.5s".` ,
123
+ },
124
+ },
125
+ },
126
+ },
83
127
"cross_cluster_replication_config" : {
84
128
Type : schema .TypeList ,
85
129
Computed : true ,
@@ -656,6 +700,12 @@ func resourceRedisClusterCreate(d *schema.ResourceData, meta interface{}) error
656
700
}
657
701
658
702
obj := make (map [string ]interface {})
703
+ automatedBackupConfigProp , err := expandRedisClusterAutomatedBackupConfig (d .Get ("automated_backup_config" ), d , config )
704
+ if err != nil {
705
+ return err
706
+ } else if v , ok := d .GetOkExists ("automated_backup_config" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (automatedBackupConfigProp )) && (ok || ! reflect .DeepEqual (v , automatedBackupConfigProp )) {
707
+ obj ["automatedBackupConfig" ] = automatedBackupConfigProp
708
+ }
659
709
authorizationModeProp , err := expandRedisClusterAuthorizationMode (d .Get ("authorization_mode" ), d , config )
660
710
if err != nil {
661
711
return err
@@ -735,6 +785,11 @@ func resourceRedisClusterCreate(d *schema.ResourceData, meta interface{}) error
735
785
obj ["kmsKey" ] = kmsKeyProp
736
786
}
737
787
788
+ obj , err = resourceRedisClusterEncoder (d , meta , obj )
789
+ if err != nil {
790
+ return err
791
+ }
792
+
738
793
url , err := tpgresource .ReplaceVars (d , config , "{{RedisBasePath}}projects/{{project}}/locations/{{region}}/clusters?clusterId={{name}}" )
739
794
if err != nil {
740
795
return err
@@ -850,6 +905,9 @@ func resourceRedisClusterRead(d *schema.ResourceData, meta interface{}) error {
850
905
if err := d .Set ("uid" , flattenRedisClusterUid (res ["uid" ], d , config )); err != nil {
851
906
return fmt .Errorf ("Error reading Cluster: %s" , err )
852
907
}
908
+ if err := d .Set ("automated_backup_config" , flattenRedisClusterAutomatedBackupConfig (res ["automatedBackupConfig" ], d , config )); err != nil {
909
+ return fmt .Errorf ("Error reading Cluster: %s" , err )
910
+ }
853
911
if err := d .Set ("authorization_mode" , flattenRedisClusterAuthorizationMode (res ["authorizationMode" ], d , config )); err != nil {
854
912
return fmt .Errorf ("Error reading Cluster: %s" , err )
855
913
}
@@ -927,6 +985,12 @@ func resourceRedisClusterUpdate(d *schema.ResourceData, meta interface{}) error
927
985
billingProject = project
928
986
929
987
obj := make (map [string ]interface {})
988
+ automatedBackupConfigProp , err := expandRedisClusterAutomatedBackupConfig (d .Get ("automated_backup_config" ), d , config )
989
+ if err != nil {
990
+ return err
991
+ } else if v , ok := d .GetOkExists ("automated_backup_config" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , automatedBackupConfigProp )) {
992
+ obj ["automatedBackupConfig" ] = automatedBackupConfigProp
993
+ }
930
994
nodeTypeProp , err := expandRedisClusterNodeType (d .Get ("node_type" ), d , config )
931
995
if err != nil {
932
996
return err
@@ -988,6 +1052,11 @@ func resourceRedisClusterUpdate(d *schema.ResourceData, meta interface{}) error
988
1052
obj ["kmsKey" ] = kmsKeyProp
989
1053
}
990
1054
1055
+ obj , err = resourceRedisClusterEncoder (d , meta , obj )
1056
+ if err != nil {
1057
+ return err
1058
+ }
1059
+
991
1060
url , err := tpgresource .ReplaceVars (d , config , "{{RedisBasePath}}projects/{{project}}/locations/{{region}}/clusters/{{name}}" )
992
1061
if err != nil {
993
1062
return err
@@ -997,6 +1066,10 @@ func resourceRedisClusterUpdate(d *schema.ResourceData, meta interface{}) error
997
1066
headers := make (http.Header )
998
1067
updateMask := []string {}
999
1068
1069
+ if d .HasChange ("automated_backup_config" ) {
1070
+ updateMask = append (updateMask , "automatedBackupConfig" )
1071
+ }
1072
+
1000
1073
if d .HasChange ("node_type" ) {
1001
1074
updateMask = append (updateMask , "nodeType" )
1002
1075
}
@@ -1168,6 +1241,72 @@ func flattenRedisClusterUid(v interface{}, d *schema.ResourceData, config *trans
1168
1241
return v
1169
1242
}
1170
1243
1244
+ func flattenRedisClusterAutomatedBackupConfig (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1245
+ if v == nil {
1246
+ return nil
1247
+ }
1248
+ original := v .(map [string ]interface {})
1249
+ if len (original ) == 0 {
1250
+ return nil
1251
+ }
1252
+ // if automated_backup_config is not defined
1253
+ if original ["automatedBackupMode" ] == "DISABLED" {
1254
+ return nil
1255
+ }
1256
+ transformed := make (map [string ]interface {})
1257
+ transformed ["fixed_frequency_schedule" ] =
1258
+ flattenRedisClusterAutomatedBackupConfigFixedFrequencySchedule (original ["fixedFrequencySchedule" ], d , config )
1259
+ transformed ["retention" ] =
1260
+ flattenRedisClusterAutomatedBackupConfigRetention (original ["retention" ], d , config )
1261
+ return []interface {}{transformed }
1262
+ }
1263
+ func flattenRedisClusterAutomatedBackupConfigFixedFrequencySchedule (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1264
+ if v == nil {
1265
+ return nil
1266
+ }
1267
+ original := v .(map [string ]interface {})
1268
+ if len (original ) == 0 {
1269
+ return nil
1270
+ }
1271
+ transformed := make (map [string ]interface {})
1272
+ transformed ["start_time" ] =
1273
+ flattenRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTime (original ["startTime" ], d , config )
1274
+ return []interface {}{transformed }
1275
+ }
1276
+ func flattenRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTime (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1277
+ if v == nil {
1278
+ return nil
1279
+ }
1280
+ original := v .(map [string ]interface {})
1281
+ if len (original ) == 0 {
1282
+ return nil
1283
+ }
1284
+ transformed := make (map [string ]interface {})
1285
+ transformed ["hours" ] =
1286
+ flattenRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTimeHours (original ["hours" ], d , config )
1287
+ return []interface {}{transformed }
1288
+ }
1289
+ func flattenRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTimeHours (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1290
+ // Handles the string fixed64 format
1291
+ if strVal , ok := v .(string ); ok {
1292
+ if intVal , err := tpgresource .StringToFixed64 (strVal ); err == nil {
1293
+ return intVal
1294
+ }
1295
+ }
1296
+
1297
+ // number values are represented as float64
1298
+ if floatVal , ok := v .(float64 ); ok {
1299
+ intVal := int (floatVal )
1300
+ return intVal
1301
+ }
1302
+
1303
+ return v // let terraform core handle it otherwise
1304
+ }
1305
+
1306
+ func flattenRedisClusterAutomatedBackupConfigRetention (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1307
+ return v
1308
+ }
1309
+
1171
1310
func flattenRedisClusterAuthorizationMode (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1172
1311
return v
1173
1312
}
@@ -1830,6 +1969,85 @@ func flattenRedisClusterKmsKey(v interface{}, d *schema.ResourceData, config *tr
1830
1969
return v
1831
1970
}
1832
1971
1972
+ func expandRedisClusterAutomatedBackupConfig (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
1973
+ l := v .([]interface {})
1974
+ if len (l ) == 0 || l [0 ] == nil {
1975
+ return nil , nil
1976
+ }
1977
+ raw := l [0 ]
1978
+ original := raw .(map [string ]interface {})
1979
+ // The automated_backup_config block is not specified, so automatedBackupMode should be DISABLED
1980
+ transformed := make (map [string ]interface {})
1981
+ if len (d .Get ("automated_backup_config" ).([]interface {})) < 1 {
1982
+ transformed ["automatedBackupMode" ] = "DISABLED"
1983
+ return transformed , nil
1984
+ }
1985
+
1986
+ // The automated_backup_config block is specified, so automatedBackupMode should be ENALBED
1987
+ transformed ["automatedBackupMode" ] = "ENABLED"
1988
+ transformedFixedFrequencySchedule , err := expandRedisClusterAutomatedBackupConfigFixedFrequencySchedule (original ["fixed_frequency_schedule" ], d , config )
1989
+ if err != nil {
1990
+ return nil , err
1991
+ } else if val := reflect .ValueOf (transformedFixedFrequencySchedule ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
1992
+ transformed ["fixedFrequencySchedule" ] = transformedFixedFrequencySchedule
1993
+ }
1994
+
1995
+ transformedRetention , err := expandRedisClusterAutomatedBackupConfigRetention (original ["retention" ], d , config )
1996
+ if err != nil {
1997
+ return nil , err
1998
+ } else if val := reflect .ValueOf (transformedRetention ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
1999
+ transformed ["retention" ] = transformedRetention
2000
+ }
2001
+
2002
+ return transformed , nil
2003
+ }
2004
+
2005
+ func expandRedisClusterAutomatedBackupConfigFixedFrequencySchedule (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
2006
+ l := v .([]interface {})
2007
+ if len (l ) == 0 || l [0 ] == nil {
2008
+ return nil , nil
2009
+ }
2010
+ raw := l [0 ]
2011
+ original := raw .(map [string ]interface {})
2012
+ transformed := make (map [string ]interface {})
2013
+
2014
+ transformedStartTime , err := expandRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTime (original ["start_time" ], d , config )
2015
+ if err != nil {
2016
+ return nil , err
2017
+ } else if val := reflect .ValueOf (transformedStartTime ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
2018
+ transformed ["startTime" ] = transformedStartTime
2019
+ }
2020
+
2021
+ return transformed , nil
2022
+ }
2023
+
2024
+ func expandRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTime (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
2025
+ l := v .([]interface {})
2026
+ if len (l ) == 0 || l [0 ] == nil {
2027
+ return nil , nil
2028
+ }
2029
+ raw := l [0 ]
2030
+ original := raw .(map [string ]interface {})
2031
+ transformed := make (map [string ]interface {})
2032
+
2033
+ transformedHours , err := expandRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTimeHours (original ["hours" ], d , config )
2034
+ if err != nil {
2035
+ return nil , err
2036
+ } else if val := reflect .ValueOf (transformedHours ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
2037
+ transformed ["hours" ] = transformedHours
2038
+ }
2039
+
2040
+ return transformed , nil
2041
+ }
2042
+
2043
+ func expandRedisClusterAutomatedBackupConfigFixedFrequencyScheduleStartTimeHours (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
2044
+ return v , nil
2045
+ }
2046
+
2047
+ func expandRedisClusterAutomatedBackupConfigRetention (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
2048
+ return v , nil
2049
+ }
2050
+
1833
2051
func expandRedisClusterAuthorizationMode (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
1834
2052
return v , nil
1835
2053
}
@@ -2391,3 +2609,15 @@ func expandRedisClusterCrossClusterReplicationConfigUpdateTime(v interface{}, d
2391
2609
func expandRedisClusterKmsKey (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
2392
2610
return v , nil
2393
2611
}
2612
+
2613
+ func resourceRedisClusterEncoder (d * schema.ResourceData , meta interface {}, obj map [string ]interface {}) (map [string ]interface {}, error ) {
2614
+
2615
+ // if the automated_backup_config is not defined, automatedBackupMode needs to be passed and set to DISABLED in the expand
2616
+ if obj ["automatedBackupConfig" ] == nil {
2617
+ config := meta .(* transport_tpg.Config )
2618
+ automatedBackupConfigProp , _ := expandRedisClusterAutomatedBackupConfig (d .Get ("automated_backup_config" ), d , config )
2619
+ obj ["automatedBackupConfig" ] = automatedBackupConfigProp
2620
+ }
2621
+
2622
+ return obj , nil
2623
+ }
0 commit comments