Skip to content

Commit e2d8b84

Browse files
feat(spanner): add instance asymmetric autoscaling options support in spanner instance resource (#12100) (#8503)
[upstream:1cc98977a16d522af827806470546b4580eb3d20] Signed-off-by: Modular Magician <[email protected]>
1 parent 02b3238 commit e2d8b84

File tree

4 files changed

+422
-1
lines changed

4 files changed

+422
-1
lines changed

Diff for: .changelog/12100.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
spanner: added `asymmetric_autoscaling_options` field to `google_spanner_instance`
3+
```

Diff for: google-beta/services/spanner/resource_spanner_instance.go

+269
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,60 @@ the instance.`,
154154
MaxItems: 1,
155155
Elem: &schema.Resource{
156156
Schema: map[string]*schema.Schema{
157+
"asymmetric_autoscaling_options": {
158+
Type: schema.TypeList,
159+
Optional: true,
160+
Description: `Asymmetric autoscaling options for specific replicas.`,
161+
Elem: &schema.Resource{
162+
Schema: map[string]*schema.Schema{
163+
"overrides": {
164+
Type: schema.TypeList,
165+
Required: true,
166+
Description: `A nested object resource`,
167+
MaxItems: 1,
168+
Elem: &schema.Resource{
169+
Schema: map[string]*schema.Schema{
170+
"autoscaling_limits": {
171+
Type: schema.TypeList,
172+
Required: true,
173+
Description: `A nested object resource`,
174+
MaxItems: 1,
175+
Elem: &schema.Resource{
176+
Schema: map[string]*schema.Schema{
177+
"max_nodes": {
178+
Type: schema.TypeInt,
179+
Required: true,
180+
Description: `The maximum number of nodes for this specific replica.`,
181+
},
182+
"min_nodes": {
183+
Type: schema.TypeInt,
184+
Required: true,
185+
Description: `The minimum number of nodes for this specific replica.`,
186+
},
187+
},
188+
},
189+
},
190+
},
191+
},
192+
},
193+
"replica_selection": {
194+
Type: schema.TypeList,
195+
Required: true,
196+
Description: `A nested object resource`,
197+
MaxItems: 1,
198+
Elem: &schema.Resource{
199+
Schema: map[string]*schema.Schema{
200+
"location": {
201+
Type: schema.TypeString,
202+
Required: true,
203+
Description: `The location of the replica to apply asymmetric autoscaling options.`,
204+
},
205+
},
206+
},
207+
},
208+
},
209+
},
210+
},
157211
"autoscaling_limits": {
158212
Type: schema.TypeList,
159213
Optional: true,
@@ -829,6 +883,8 @@ func flattenSpannerInstanceAutoscalingConfig(v interface{}, d *schema.ResourceDa
829883
flattenSpannerInstanceAutoscalingConfigAutoscalingLimits(original["autoscalingLimits"], d, config)
830884
transformed["autoscaling_targets"] =
831885
flattenSpannerInstanceAutoscalingConfigAutoscalingTargets(original["autoscalingTargets"], d, config)
886+
transformed["asymmetric_autoscaling_options"] =
887+
flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptions(original["asymmetricAutoscalingOptions"], d, config)
832888
return []interface{}{transformed}
833889
}
834890
func flattenSpannerInstanceAutoscalingConfigAutoscalingLimits(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
@@ -967,6 +1023,104 @@ func flattenSpannerInstanceAutoscalingConfigAutoscalingTargetsStorageUtilization
9671023
return v // let terraform core handle it otherwise
9681024
}
9691025

1026+
func flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptions(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1027+
if v == nil {
1028+
return v
1029+
}
1030+
l := v.([]interface{})
1031+
transformed := make([]interface{}, 0, len(l))
1032+
for _, raw := range l {
1033+
original := raw.(map[string]interface{})
1034+
if len(original) < 1 {
1035+
// Do not include empty json objects coming back from the api
1036+
continue
1037+
}
1038+
transformed = append(transformed, map[string]interface{}{
1039+
"replica_selection": flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelection(original["replicaSelection"], d, config),
1040+
"overrides": flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverrides(original["overrides"], d, config),
1041+
})
1042+
}
1043+
return transformed
1044+
}
1045+
func flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelection(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1046+
if v == nil {
1047+
return nil
1048+
}
1049+
original := v.(map[string]interface{})
1050+
if len(original) == 0 {
1051+
return nil
1052+
}
1053+
transformed := make(map[string]interface{})
1054+
transformed["location"] =
1055+
flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelectionLocation(original["location"], d, config)
1056+
return []interface{}{transformed}
1057+
}
1058+
func flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelectionLocation(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1059+
return v
1060+
}
1061+
1062+
func flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverrides(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1063+
if v == nil {
1064+
return nil
1065+
}
1066+
original := v.(map[string]interface{})
1067+
if len(original) == 0 {
1068+
return nil
1069+
}
1070+
transformed := make(map[string]interface{})
1071+
transformed["autoscaling_limits"] =
1072+
flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimits(original["autoscalingLimits"], d, config)
1073+
return []interface{}{transformed}
1074+
}
1075+
func flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimits(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1076+
if v == nil {
1077+
return nil
1078+
}
1079+
original := v.(map[string]interface{})
1080+
if len(original) == 0 {
1081+
return nil
1082+
}
1083+
transformed := make(map[string]interface{})
1084+
transformed["min_nodes"] =
1085+
flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMinNodes(original["minNodes"], d, config)
1086+
transformed["max_nodes"] =
1087+
flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMaxNodes(original["maxNodes"], d, config)
1088+
return []interface{}{transformed}
1089+
}
1090+
func flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMinNodes(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1091+
// Handles the string fixed64 format
1092+
if strVal, ok := v.(string); ok {
1093+
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
1094+
return intVal
1095+
}
1096+
}
1097+
1098+
// number values are represented as float64
1099+
if floatVal, ok := v.(float64); ok {
1100+
intVal := int(floatVal)
1101+
return intVal
1102+
}
1103+
1104+
return v // let terraform core handle it otherwise
1105+
}
1106+
1107+
func flattenSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMaxNodes(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1108+
// Handles the string fixed64 format
1109+
if strVal, ok := v.(string); ok {
1110+
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
1111+
return intVal
1112+
}
1113+
}
1114+
1115+
// number values are represented as float64
1116+
if floatVal, ok := v.(float64); ok {
1117+
intVal := int(floatVal)
1118+
return intVal
1119+
}
1120+
1121+
return v // let terraform core handle it otherwise
1122+
}
1123+
9701124
func flattenSpannerInstanceEdition(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
9711125
return v
9721126
}
@@ -1043,6 +1197,13 @@ func expandSpannerInstanceAutoscalingConfig(v interface{}, d tpgresource.Terrafo
10431197
transformed["autoscalingTargets"] = transformedAutoscalingTargets
10441198
}
10451199

1200+
transformedAsymmetricAutoscalingOptions, err := expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptions(original["asymmetric_autoscaling_options"], d, config)
1201+
if err != nil {
1202+
return nil, err
1203+
} else if val := reflect.ValueOf(transformedAsymmetricAutoscalingOptions); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1204+
transformed["asymmetricAutoscalingOptions"] = transformedAsymmetricAutoscalingOptions
1205+
}
1206+
10461207
return transformed, nil
10471208
}
10481209

@@ -1136,6 +1297,111 @@ func expandSpannerInstanceAutoscalingConfigAutoscalingTargetsStorageUtilizationP
11361297
return v, nil
11371298
}
11381299

1300+
func expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1301+
l := v.([]interface{})
1302+
req := make([]interface{}, 0, len(l))
1303+
for _, raw := range l {
1304+
if raw == nil {
1305+
continue
1306+
}
1307+
original := raw.(map[string]interface{})
1308+
transformed := make(map[string]interface{})
1309+
1310+
transformedReplicaSelection, err := expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelection(original["replica_selection"], d, config)
1311+
if err != nil {
1312+
return nil, err
1313+
} else if val := reflect.ValueOf(transformedReplicaSelection); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1314+
transformed["replicaSelection"] = transformedReplicaSelection
1315+
}
1316+
1317+
transformedOverrides, err := expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverrides(original["overrides"], d, config)
1318+
if err != nil {
1319+
return nil, err
1320+
} else if val := reflect.ValueOf(transformedOverrides); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1321+
transformed["overrides"] = transformedOverrides
1322+
}
1323+
1324+
req = append(req, transformed)
1325+
}
1326+
return req, nil
1327+
}
1328+
1329+
func expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelection(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1330+
l := v.([]interface{})
1331+
if len(l) == 0 || l[0] == nil {
1332+
return nil, nil
1333+
}
1334+
raw := l[0]
1335+
original := raw.(map[string]interface{})
1336+
transformed := make(map[string]interface{})
1337+
1338+
transformedLocation, err := expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelectionLocation(original["location"], d, config)
1339+
if err != nil {
1340+
return nil, err
1341+
} else if val := reflect.ValueOf(transformedLocation); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1342+
transformed["location"] = transformedLocation
1343+
}
1344+
1345+
return transformed, nil
1346+
}
1347+
1348+
func expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsReplicaSelectionLocation(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1349+
return v, nil
1350+
}
1351+
1352+
func expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverrides(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1353+
l := v.([]interface{})
1354+
if len(l) == 0 || l[0] == nil {
1355+
return nil, nil
1356+
}
1357+
raw := l[0]
1358+
original := raw.(map[string]interface{})
1359+
transformed := make(map[string]interface{})
1360+
1361+
transformedAutoscalingLimits, err := expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimits(original["autoscaling_limits"], d, config)
1362+
if err != nil {
1363+
return nil, err
1364+
} else if val := reflect.ValueOf(transformedAutoscalingLimits); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1365+
transformed["autoscalingLimits"] = transformedAutoscalingLimits
1366+
}
1367+
1368+
return transformed, nil
1369+
}
1370+
1371+
func expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimits(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1372+
l := v.([]interface{})
1373+
if len(l) == 0 || l[0] == nil {
1374+
return nil, nil
1375+
}
1376+
raw := l[0]
1377+
original := raw.(map[string]interface{})
1378+
transformed := make(map[string]interface{})
1379+
1380+
transformedMinNodes, err := expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMinNodes(original["min_nodes"], d, config)
1381+
if err != nil {
1382+
return nil, err
1383+
} else if val := reflect.ValueOf(transformedMinNodes); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1384+
transformed["minNodes"] = transformedMinNodes
1385+
}
1386+
1387+
transformedMaxNodes, err := expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMaxNodes(original["max_nodes"], d, config)
1388+
if err != nil {
1389+
return nil, err
1390+
} else if val := reflect.ValueOf(transformedMaxNodes); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1391+
transformed["maxNodes"] = transformedMaxNodes
1392+
}
1393+
1394+
return transformed, nil
1395+
}
1396+
1397+
func expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMinNodes(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1398+
return v, nil
1399+
}
1400+
1401+
func expandSpannerInstanceAutoscalingConfigAsymmetricAutoscalingOptionsOverridesAutoscalingLimitsMaxNodes(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1402+
return v, nil
1403+
}
1404+
11391405
func expandSpannerInstanceEdition(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
11401406
return v, nil
11411407
}
@@ -1219,6 +1485,9 @@ func resourceSpannerInstanceUpdateEncoder(d *schema.ResourceData, meta interface
12191485
if d.HasChange("autoscaling_config.0.autoscaling_targets.0.storage_utilization_percent") {
12201486
updateMask = append(updateMask, "autoscalingConfig.autoscalingTargets.storageUtilizationPercent")
12211487
}
1488+
if d.HasChange("autoscaling_config.0.asymmetric_autoscaling_options") {
1489+
updateMask = append(updateMask, "autoscalingConfig.asymmetricAutoscalingOptions")
1490+
}
12221491
}
12231492
}
12241493
newObj["fieldMask"] = strings.Join(updateMask, ",")

0 commit comments

Comments
 (0)