@@ -94,6 +94,48 @@ func ResourceComputeRegionInstanceGroupManager() *schema.Resource {
94
94
},
95
95
},
96
96
97
+ {{ if ne $.TargetVersionName `ga` -}}
98
+ "instance_flexibility_policy": {
99
+ Type: schema.TypeList,
100
+ Optional: true,
101
+ MaxItems: 1,
102
+ Description: `The flexibility policy for this managed instance group. Instance flexibility allowing MIG to create VMs from multiple types of machines. Instance flexibility configuration on MIG overrides instance template configuration.`,
103
+ Elem: &schema.Resource{
104
+ Schema: map[string]*schema.Schema{
105
+ "instance_selections": {
106
+ Type: schema.TypeSet,
107
+ Optional: true,
108
+ Description: `Named instance selections configuring properties that the group will use when creating new VMs.`,
109
+ Elem: &schema.Resource{
110
+ Schema: map[string]*schema.Schema{
111
+ "name": {
112
+ Type: schema.TypeString,
113
+ Required: true,
114
+ Description: `Instance selection name.`,
115
+ },
116
+
117
+ "rank": {
118
+ Type: schema.TypeInt,
119
+ Optional: true,
120
+ Description: `Preference of this instance selection. Lower number means higher preference. MIG will first try to create a VM based on the machine-type with lowest rank and fallback to next rank based on availability. Machine types and instance selections with the same rank have the same preference.`,
121
+ },
122
+
123
+ "machine_types": {
124
+ Type: schema.TypeSet,
125
+ Required: true,
126
+ Elem: &schema.Schema{
127
+ Type: schema.TypeString,
128
+ },
129
+ Description: `Full machine-type names, e.g. "n1-standard-16"`,
130
+ },
131
+ },
132
+ },
133
+ },
134
+ },
135
+ },
136
+ },
137
+ {{- end }}
138
+
97
139
"name": {
98
140
Type: schema.TypeString,
99
141
Required: true,
@@ -630,6 +672,9 @@ func resourceComputeRegionInstanceGroupManagerCreate(d *schema.ResourceData, met
630
672
TargetSuspendedSize: int64(d.Get("target_suspended_size").(int)),
631
673
TargetStoppedSize: int64(d.Get("target_stopped_size").(int)),
632
674
{{- end }}
675
+ {{ if ne $.TargetVersionName `ga` -}}
676
+ InstanceFlexibilityPolicy: expandInstanceFlexibilityPolicy(d),
677
+ {{- end }}
633
678
UpdatePolicy: expandRegionUpdatePolicy(d.Get("update_policy").([]interface{})),
634
679
InstanceLifecyclePolicy: expandInstanceLifecyclePolicy(d.Get("instance_lifecycle_policy").([]interface{})),
635
680
AllInstancesConfig: expandAllInstancesConfig(nil, d.Get("all_instances_config").([]interface{})),
@@ -833,6 +878,11 @@ func resourceComputeRegionInstanceGroupManagerRead(d *schema.ResourceData, meta
833
878
return fmt.Errorf("Error setting target_stopped_size: %s", err)
834
879
}
835
880
{{- end }}
881
+ {{ if ne $.TargetVersionName `ga` -}}
882
+ if err := d.Set("instance_flexibility_policy", flattenInstanceFlexibilityPolicy(manager.InstanceFlexibilityPolicy)); err != nil {
883
+ return err
884
+ }
885
+ {{- end }}
836
886
if err := d.Set("update_policy", flattenRegionUpdatePolicy(manager.UpdatePolicy)); err != nil {
837
887
return fmt.Errorf("Error setting update_policy in state: %s", err.Error())
838
888
}
@@ -906,6 +956,21 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met
906
956
change = true
907
957
}
908
958
959
+ {{ if ne $.TargetVersionName `ga` -}}
960
+ var targetSizePatchUpdate bool
961
+ if d.HasChange("instance_flexibility_policy") {
962
+ updatedManager.InstanceFlexibilityPolicy = expandInstanceFlexibilityPolicy(d)
963
+ change = true
964
+
965
+ // target size update should be done by patch instead of using resize
966
+ if d.HasChange("target_size") {
967
+ updatedManager.TargetSize = int64(d.Get("target_size").(int))
968
+ updatedManager.ForceSendFields = append(updatedManager.ForceSendFields, "TargetSize")
969
+ targetSizePatchUpdate = true
970
+ }
971
+ }
972
+ {{- end }}
973
+
909
974
if d.HasChange("distribution_policy_target_shape") {
910
975
updatedManager.DistributionPolicy = expandDistributionPolicyForUpdate(d)
911
976
change = true
@@ -995,7 +1060,7 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met
995
1060
}
996
1061
997
1062
// target size should use resize
998
- if d.HasChange("target_size") {
1063
+ if d.HasChange("target_size") {{ if ne $.TargetVersionName `ga` -}} && !targetSizePatchUpdate {{- end}} {
999
1064
d.Partial(true)
1000
1065
targetSize := int64(d.Get("target_size").(int))
1001
1066
op, err := config.NewComputeClient(userAgent).RegionInstanceGroupManagers.Resize(
@@ -1145,6 +1210,42 @@ func flattenRegionUpdatePolicy(updatePolicy *compute.InstanceGroupManagerUpdateP
1145
1210
return results
1146
1211
}
1147
1212
1213
+ {{ if ne $.TargetVersionName `ga` -}}
1214
+ func expandInstanceFlexibilityPolicy(d *schema.ResourceData) *compute.InstanceGroupManagerInstanceFlexibilityPolicy {
1215
+ instanceFlexibilityPolicy := &compute.InstanceGroupManagerInstanceFlexibilityPolicy{}
1216
+ oldFlexibilityPolicy, newFlexibilityPolicy := d.GetChange("instance_flexibility_policy")
1217
+ for _, flexibilityPolicy := range newFlexibilityPolicy.([]any) {
1218
+ flexibilityPolicyData := flexibilityPolicy.(map[string]any)
1219
+ instanceFlexibilityPolicy.InstanceSelections = expandInstanceSelections(flexibilityPolicyData["instance_selections"].(*schema.Set).List())
1220
+ }
1221
+ for _, flexibilityPolicy := range oldFlexibilityPolicy.([]any) {
1222
+ flexibilityPolicyData := flexibilityPolicy.(map[string]any)
1223
+ for _, instanceSelection := range flexibilityPolicyData["instance_selections"].(*schema.Set).List() {
1224
+ instanceSelectionData := instanceSelection.(map[string] any)
1225
+ name := instanceSelectionData["name"].(string)
1226
+ if _, exist := instanceFlexibilityPolicy.InstanceSelections[name]; !exist {
1227
+ instanceFlexibilityPolicy.NullFields = append(instanceFlexibilityPolicy.NullFields, "InstanceSelections." + name)
1228
+ }
1229
+ }
1230
+ instanceFlexibilityPolicy.ForceSendFields = append(instanceFlexibilityPolicy.ForceSendFields, "InstanceSelections")
1231
+ }
1232
+ return instanceFlexibilityPolicy
1233
+ }
1234
+
1235
+ func expandInstanceSelections(instanceSelections []any) map[string]compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection {
1236
+ instanceSelectionsMap := make(map[string]compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection)
1237
+ for _, instanceSelectionRaw := range instanceSelections {
1238
+ instanceSelectionData := instanceSelectionRaw.(map[string]any)
1239
+ instanceSelection := compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection{
1240
+ Rank: int64(instanceSelectionData["rank"].(int)),
1241
+ MachineTypes: tpgresource.ConvertStringSet(instanceSelectionData["machine_types"].(*schema.Set)),
1242
+ }
1243
+ instanceSelectionsMap[instanceSelectionData["name"].(string)] = instanceSelection
1244
+ }
1245
+ return instanceSelectionsMap
1246
+ }
1247
+ {{- end }}
1248
+
1148
1249
func expandDistributionPolicyForUpdate(d *schema.ResourceData) *compute.DistributionPolicy {
1149
1250
dpts := d.Get("distribution_policy_target_shape").(string)
1150
1251
if dpts == "" {
@@ -1180,6 +1281,30 @@ func expandDistributionPolicyForCreate(d *schema.ResourceData) *compute.Distribu
1180
1281
return distributionPolicy
1181
1282
}
1182
1283
1284
+ {{ if ne $.TargetVersionName `ga` -}}
1285
+ func flattenInstanceFlexibilityPolicy(instanceFlexibilityPolicy *compute.InstanceGroupManagerInstanceFlexibilityPolicy) []map[string]any {
1286
+ flattenedInstanceFlexibilityPolicy := []map[string]any{}
1287
+ if instanceFlexibilityPolicy != nil {
1288
+ instanceSelectionsMap := map[string]any{}
1289
+ instanceSelectionsMap["instance_selections"] = flattenInstanceSelections(instanceFlexibilityPolicy.InstanceSelections)
1290
+ flattenedInstanceFlexibilityPolicy = append(flattenedInstanceFlexibilityPolicy, instanceSelectionsMap)
1291
+ }
1292
+ return flattenedInstanceFlexibilityPolicy
1293
+ }
1294
+
1295
+ func flattenInstanceSelections(instanceSelections map[string]compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection) []map[string]any {
1296
+ instanceSelectionsMap := make([]map[string]any, 0, len(instanceSelections))
1297
+ for instanceSelectionName, instanceSelection := range instanceSelections {
1298
+ instanceSelectionData := make(map[string]any)
1299
+ instanceSelectionData["name"] = instanceSelectionName
1300
+ instanceSelectionData["rank"] = instanceSelection.Rank
1301
+ instanceSelectionData["machine_types"] = instanceSelection.MachineTypes
1302
+ instanceSelectionsMap = append(instanceSelectionsMap, instanceSelectionData)
1303
+ }
1304
+ return instanceSelectionsMap
1305
+ }
1306
+ {{- end }}
1307
+
1183
1308
func flattenDistributionPolicy(distributionPolicy *compute.DistributionPolicy) []string {
1184
1309
zones := make([]string, 0)
1185
1310
0 commit comments