@@ -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 == false {{- 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,44 @@ 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
+ if d.HasChange("instance_flexibility_policy") {
1217
+ oldFlexibilityPolicy, newFlexibilityPolicy := d.GetChange("instance_flexibility_policy")
1218
+ for _, ifp := range newFlexibilityPolicy.([]any) {
1219
+ ifpData := ifp.(map[string]any)
1220
+ instanceFlexibilityPolicy.InstanceSelections = expandInstanceSelections(ifpData["instance_selections"].(*schema.Set).List())
1221
+ }
1222
+ for _, ifp := range oldFlexibilityPolicy.([]any) {
1223
+ ifpData := ifp.(map[string]any)
1224
+ for _, instSl := range ifpData["instance_selections"].(*schema.Set).List() {
1225
+ instSlData := instSl.(map[string] any)
1226
+ name := instSlData["name"].(string)
1227
+ if _, exist := instanceFlexibilityPolicy.InstanceSelections[name]; !exist {
1228
+ instanceFlexibilityPolicy.NullFields = append(instanceFlexibilityPolicy.NullFields, "InstanceSelections." + name)
1229
+ }
1230
+ }
1231
+ instanceFlexibilityPolicy.ForceSendFields = append(instanceFlexibilityPolicy.ForceSendFields, "InstanceSelections")
1232
+ }
1233
+ }
1234
+ return instanceFlexibilityPolicy
1235
+ }
1236
+
1237
+ func expandInstanceSelections(instanceSelections []any) map[string]compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection {
1238
+ instanceSelectionsMap := make(map[string]compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection)
1239
+ for _, instSl := range instanceSelections {
1240
+ instSlData := instSl.(map[string]any)
1241
+ instanceSelection := compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection{
1242
+ Rank: int64(instSlData["rank"].(int)),
1243
+ MachineTypes: tpgresource.ConvertStringSet(instSlData["machine_types"].(*schema.Set)),
1244
+ }
1245
+ instanceSelectionsMap[instSlData["name"].(string)] = instanceSelection
1246
+ }
1247
+ return instanceSelectionsMap
1248
+ }
1249
+ {{- end }}
1250
+
1148
1251
func expandDistributionPolicyForUpdate(d *schema.ResourceData) *compute.DistributionPolicy {
1149
1252
dpts := d.Get("distribution_policy_target_shape").(string)
1150
1253
if dpts == "" {
@@ -1180,6 +1283,30 @@ func expandDistributionPolicyForCreate(d *schema.ResourceData) *compute.Distribu
1180
1283
return distributionPolicy
1181
1284
}
1182
1285
1286
+ {{ if ne $.TargetVersionName `ga` -}}
1287
+ func flattenInstanceFlexibilityPolicy(instanceFlexibilityPolicy *compute.InstanceGroupManagerInstanceFlexibilityPolicy) []map[string]any {
1288
+ results := []map[string]any{}
1289
+ if instanceFlexibilityPolicy != nil {
1290
+ ifp := map[string]any{}
1291
+ ifp["instance_selections"] = flattenInstanceSelections(instanceFlexibilityPolicy.InstanceSelections)
1292
+ results = append(results, ifp)
1293
+ }
1294
+ return results
1295
+ }
1296
+
1297
+ func flattenInstanceSelections(instanceSelections map[string]compute.InstanceGroupManagerInstanceFlexibilityPolicyInstanceSelection) []map[string]any {
1298
+ results := make([]map[string]any, 0, len(instanceSelections))
1299
+ for instanceSelectionName, instanceSelection := range instanceSelections {
1300
+ instanceSelectionMap := make(map[string]any)
1301
+ instanceSelectionMap["name"] = instanceSelectionName
1302
+ instanceSelectionMap["rank"] = instanceSelection.Rank
1303
+ instanceSelectionMap["machine_types"] = instanceSelection.MachineTypes
1304
+ results = append(results, instanceSelectionMap)
1305
+ }
1306
+ return results
1307
+ }
1308
+ {{- end }}
1309
+
1183
1310
func flattenDistributionPolicy(distributionPolicy *compute.DistributionPolicy) []string {
1184
1311
zones := make([]string, 0)
1185
1312
0 commit comments