Skip to content

Commit 3823f62

Browse files
Add ProvisioningModelMix to InstanceFlexibilityPolicy for Dataproc cluster (#12327) (#8732)
[upstream:d7777055cb7618648725abd16d3b05e5c138fc56] Signed-off-by: Modular Magician <[email protected]>
1 parent d90dbc0 commit 3823f62

File tree

3 files changed

+131
-2
lines changed

3 files changed

+131
-2
lines changed

Diff for: .changelog/12327.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
dataproc: added `cluster_config.preemptible_worker_config.instance_flexibility_policy.provisioning_model_mix` field to `google_dataproc_cluster` resource
3+
```

Diff for: google-beta/services/dataproc/resource_dataproc_cluster.go

+61-2
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,7 @@ func ResourceDataprocCluster() *schema.Resource {
11851185
ForceNew: true,
11861186
AtLeastOneOf: []string{
11871187
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.instance_selection_list",
1188+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix",
11881189
},
11891190
Description: `List of instance selection options that the group will use when creating new VMs.`,
11901191
Elem: &schema.Resource{
@@ -1229,6 +1230,36 @@ func ResourceDataprocCluster() *schema.Resource {
12291230
},
12301231
},
12311232
},
1233+
"provisioning_model_mix": {
1234+
Type: schema.TypeList,
1235+
Optional: true,
1236+
ForceNew: true,
1237+
AtLeastOneOf: []string{
1238+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.instance_selection_list",
1239+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix",
1240+
},
1241+
MaxItems: 1,
1242+
Description: `Defines how Dataproc should create VMs with a mixture of provisioning models.`,
1243+
Elem: &schema.Resource{
1244+
Schema: map[string]*schema.Schema{
1245+
"standard_capacity_base": {
1246+
Type: schema.TypeInt,
1247+
Optional: true,
1248+
ForceNew: true,
1249+
Description: `The base capacity that will always use Standard VMs to avoid risk of more preemption than the minimum capacity you need.`,
1250+
ValidateFunc: validation.IntAtLeast(0),
1251+
},
1252+
1253+
"standard_capacity_percent_above_base": {
1254+
Type: schema.TypeInt,
1255+
Optional: true,
1256+
ForceNew: true,
1257+
Description: `The percentage of target capacity that should use Standard VM. The remaining percentage will use Spot VMs.`,
1258+
ValidateFunc: validation.IntBetween(0, 100),
1259+
},
1260+
},
1261+
},
1262+
},
12321263
},
12331264
},
12341265
},
@@ -2415,6 +2446,9 @@ func expandPreemptibleInstanceGroupConfig(cfg map[string]interface{}) *dataproc.
24152446
if v, ok := flexibilityPolicy["instance_selection_list"]; ok {
24162447
icg.InstanceFlexibilityPolicy.InstanceSelectionList = expandInstanceSelectionList(v)
24172448
}
2449+
if v, ok := flexibilityPolicy["provisioning_model_mix"]; ok {
2450+
icg.InstanceFlexibilityPolicy.ProvisioningModelMix = expandProvisioningModelMix(v)
2451+
}
24182452
}
24192453

24202454
}
@@ -2446,6 +2480,18 @@ func expandInstanceSelectionList(v interface{}) []*dataproc.InstanceSelection {
24462480
return instanceSelections
24472481
}
24482482

2483+
func expandProvisioningModelMix(v interface{}) *dataproc.ProvisioningModelMix {
2484+
pmm := v.([]interface{})
2485+
if len(pmm) > 0 {
2486+
provisioningModelMix := pmm[0].(map[string]interface{})
2487+
return &dataproc.ProvisioningModelMix{
2488+
StandardCapacityBase: int64(provisioningModelMix["standard_capacity_base"].(int)),
2489+
StandardCapacityPercentAboveBase: int64(provisioningModelMix["standard_capacity_percent_above_base"].(int)),
2490+
}
2491+
}
2492+
return nil
2493+
}
2494+
24492495
func expandMasterInstanceGroupConfig(cfg map[string]interface{}) *dataproc.InstanceGroupConfig {
24502496
icg := &dataproc.InstanceGroupConfig{}
24512497

@@ -3186,8 +3232,13 @@ func flattenPreemptibleInstanceGroupConfig(d *schema.ResourceData, icg *dataproc
31863232
disk["local_ssd_interface"] = icg.DiskConfig.LocalSsdInterface
31873233
}
31883234
if icg.InstanceFlexibilityPolicy != nil {
3189-
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3190-
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3235+
if icg.InstanceFlexibilityPolicy.InstanceSelectionList != nil {
3236+
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3237+
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3238+
}
3239+
if icg.InstanceFlexibilityPolicy.ProvisioningModelMix != nil {
3240+
instanceFlexibilityPolicy["provisioning_model_mix"] = flattenProvisioningModelMix(icg.InstanceFlexibilityPolicy.ProvisioningModelMix)
3241+
}
31913242
}
31923243
}
31933244

@@ -3224,6 +3275,14 @@ func flattenInstanceSelectionResults(isr []*dataproc.InstanceSelectionResult) []
32243275

32253276
}
32263277

3278+
func flattenProvisioningModelMix(pmm *dataproc.ProvisioningModelMix) []map[string]interface{} {
3279+
provisioningModelMix := map[string]interface{}{}
3280+
provisioningModelMix["standard_capacity_base"] = pmm.StandardCapacityBase
3281+
provisioningModelMix["standard_capacity_percent_above_base"] = pmm.StandardCapacityPercentAboveBase
3282+
3283+
return []map[string]interface{}{provisioningModelMix}
3284+
}
3285+
32273286
func flattenMasterInstanceGroupConfig(d *schema.ResourceData, icg *dataproc.InstanceGroupConfig) []map[string]interface{} {
32283287
disk := map[string]interface{}{}
32293288
data := map[string]interface{}{}

Diff for: google-beta/services/dataproc/resource_dataproc_cluster_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,29 @@ func TestAccDataprocCluster_spotWithInstanceFlexibilityPolicy(t *testing.T) {
536536
})
537537
}
538538

539+
func TestAccDataprocCluster_spotOnDemandMixing(t *testing.T) {
540+
t.Parallel()
541+
542+
rnd := acctest.RandString(t, 10)
543+
var cluster dataproc.Cluster
544+
acctest.VcrTest(t, resource.TestCase{
545+
PreCheck: func() { acctest.AccTestPreCheck(t) },
546+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
547+
CheckDestroy: testAccCheckDataprocClusterDestroy(t),
548+
Steps: []resource.TestStep{
549+
{
550+
Config: testAccDataprocCluster_spotOnDemandMixing(rnd),
551+
Check: resource.ComposeTestCheckFunc(
552+
testAccCheckDataprocClusterExists(t, "google_dataproc_cluster.spot_mixing", &cluster),
553+
resource.TestCheckResourceAttr("google_dataproc_cluster.spot_mixing", "cluster_config.0.preemptible_worker_config.0.preemptibility", "SPOT"),
554+
resource.TestCheckResourceAttr("google_dataproc_cluster.spot_mixing", "cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix.0.standard_capacity_base", "1"),
555+
resource.TestCheckResourceAttr("google_dataproc_cluster.spot_mixing", "cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix.0.standard_capacity_percent_above_base", "50"),
556+
),
557+
},
558+
},
559+
})
560+
}
561+
539562
func TestAccDataprocCluster_spotWithAuxiliaryNodeGroups(t *testing.T) {
540563
t.Parallel()
541564

@@ -1957,6 +1980,50 @@ resource "google_dataproc_cluster" "spot_with_instance_flexibility_policy" {
19571980
`, rnd)
19581981
}
19591982

1983+
func testAccDataprocCluster_spotOnDemandMixing(rnd string) string {
1984+
return fmt.Sprintf(`
1985+
resource "google_dataproc_cluster" "spot_mixing" {
1986+
name = "tf-test-dproc-%s"
1987+
region = "us-central1"
1988+
1989+
cluster_config {
1990+
gce_cluster_config {
1991+
internal_ip_only = false
1992+
}
1993+
master_config {
1994+
num_instances = "1"
1995+
machine_type = "e2-medium"
1996+
disk_config {
1997+
boot_disk_size_gb = 35
1998+
}
1999+
}
2000+
2001+
worker_config {
2002+
num_instances = "2"
2003+
machine_type = "e2-medium"
2004+
disk_config {
2005+
boot_disk_size_gb = 35
2006+
}
2007+
}
2008+
2009+
preemptible_worker_config {
2010+
num_instances = "3"
2011+
preemptibility = "SPOT"
2012+
disk_config {
2013+
boot_disk_size_gb = 35
2014+
}
2015+
instance_flexibility_policy {
2016+
provisioning_model_mix {
2017+
standard_capacity_base = 1
2018+
standard_capacity_percent_above_base = 50
2019+
}
2020+
}
2021+
}
2022+
}
2023+
}
2024+
`, rnd)
2025+
}
2026+
19602027
func testAccDataprocCluster_withAuxiliaryNodeGroups(rnd string) string {
19612028
return fmt.Sprintf(`
19622029
resource "google_dataproc_cluster" "with_auxiliary_node_groups" {

0 commit comments

Comments
 (0)