Skip to content

Commit ddbc8ee

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

File tree

3 files changed

+368
-1
lines changed

3 files changed

+368
-1
lines changed

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

+128-1
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,
@@ -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,6 +956,21 @@ 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
@@ -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 == false {{- end}} {
9991064
d.Partial(true)
10001065
targetSize := int64(d.Get("target_size").(int))
10011066
op, err := config.NewComputeClient(userAgent).RegionInstanceGroupManagers.Resize(
@@ -1145,6 +1210,44 @@ 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+
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+
11481251
func expandDistributionPolicyForUpdate(d *schema.ResourceData) *compute.DistributionPolicy {
11491252
dpts := d.Get("distribution_policy_target_shape").(string)
11501253
if dpts == "" {
@@ -1180,6 +1283,30 @@ func expandDistributionPolicyForCreate(d *schema.ResourceData) *compute.Distribu
11801283
return distributionPolicy
11811284
}
11821285

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

0 commit comments

Comments
 (0)