Skip to content

Commit 8ab7add

Browse files
Add instanceFlexibilityPolicy to google_compute_region_instance_group_manager to create instances by instanceSelections
1 parent e3afb57 commit 8ab7add

File tree

3 files changed

+377
-8
lines changed

3 files changed

+377
-8
lines changed

mmv1/third_party/terraform/services/compute/resource_compute_region_instance_group_manager.go.tmpl

+129-4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,48 @@ func ResourceComputeRegionInstanceGroupManager() *schema.Resource {
9494
},
9595
},
9696

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+
97139
"name": {
98140
Type: schema.TypeString,
99141
Required: true,
@@ -280,7 +322,7 @@ func ResourceComputeRegionInstanceGroupManager() *schema.Resource {
280322
},
281323
},
282324

283-
{{ if ne $.TargetVersionName `ga` -}}
325+
{{- if ne $.TargetVersionName `ga` }}
284326
"standby_policy": {
285327
Type: schema.TypeList,
286328
Computed: true,
@@ -384,7 +426,7 @@ func ResourceComputeRegionInstanceGroupManager() *schema.Resource {
384426
Description: `Specifies a percentage of instances between 0 to 100%, inclusive. For example, specify 80 for 80%.`,
385427
},
386428

387-
{{ if ne $.TargetVersionName `ga` -}}
429+
{{- if ne $.TargetVersionName `ga` }}
388430
"min_ready_sec": {
389431
Type: schema.TypeInt,
390432
Optional: true,
@@ -630,6 +672,9 @@ func resourceComputeRegionInstanceGroupManagerCreate(d *schema.ResourceData, met
630672
TargetSuspendedSize: int64(d.Get("target_suspended_size").(int)),
631673
TargetStoppedSize: int64(d.Get("target_stopped_size").(int)),
632674
{{- end }}
675+
{{- if ne $.TargetVersionName `ga` }}
676+
InstanceFlexibilityPolicy: expandInstanceFlexibilityPolicy(d),
677+
{{- end }}
633678
UpdatePolicy: expandRegionUpdatePolicy(d.Get("update_policy").([]interface{})),
634679
InstanceLifecyclePolicy: expandInstanceLifecyclePolicy(d.Get("instance_lifecycle_policy").([]interface{})),
635680
AllInstancesConfig: expandAllInstancesConfig(nil, d.Get("all_instances_config").([]interface{})),
@@ -833,6 +878,11 @@ func resourceComputeRegionInstanceGroupManagerRead(d *schema.ResourceData, meta
833878
return fmt.Errorf("Error setting target_stopped_size: %s", err)
834879
}
835880
{{- 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 }}
836886
if err := d.Set("update_policy", flattenRegionUpdatePolicy(manager.UpdatePolicy)); err != nil {
837887
return fmt.Errorf("Error setting update_policy in state: %s", err.Error())
838888
}
@@ -906,12 +956,27 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met
906956
change = true
907957
}
908958

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+
909974
if d.HasChange("distribution_policy_target_shape") {
910975
updatedManager.DistributionPolicy = expandDistributionPolicyForUpdate(d)
911976
change = true
912977
}
913978

914-
{{ if ne $.TargetVersionName `ga` -}}
979+
{{- if ne $.TargetVersionName `ga` }}
915980
if d.HasChange("standby_policy") {
916981
updatedManager.StandbyPolicy = expandStandbyPolicy(d)
917982
change = true
@@ -995,7 +1060,7 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met
9951060
}
9961061

9971062
// target size should use resize
998-
if d.HasChange("target_size") {
1063+
if d.HasChange("target_size") {{- if ne $.TargetVersionName `ga` }} && !targetSizePatchUpdate {{- end}} {
9991064
d.Partial(true)
10001065
targetSize := int64(d.Get("target_size").(int))
10011066
op, err := config.NewComputeClient(userAgent).RegionInstanceGroupManagers.Resize(
@@ -1145,6 +1210,42 @@ func flattenRegionUpdatePolicy(updatePolicy *compute.InstanceGroupManagerUpdateP
11451210
return results
11461211
}
11471212

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+
11481249
func expandDistributionPolicyForUpdate(d *schema.ResourceData) *compute.DistributionPolicy {
11491250
dpts := d.Get("distribution_policy_target_shape").(string)
11501251
if dpts == "" {
@@ -1180,6 +1281,30 @@ func expandDistributionPolicyForCreate(d *schema.ResourceData) *compute.Distribu
11801281
return distributionPolicy
11811282
}
11821283

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+
11831308
func flattenDistributionPolicy(distributionPolicy *compute.DistributionPolicy) []string {
11841309
zones := make([]string, 0)
11851310

0 commit comments

Comments
 (0)