Skip to content

Commit 02609a0

Browse files
committed
Add ProvisioningModelMix to InstanceFlexibilityPolicy to support mixing of spot and on-demands instances for Dataproc cluster
1 parent b27a58f commit 02609a0

File tree

2 files changed

+128
-2
lines changed

2 files changed

+128
-2
lines changed

mmv1/third_party/terraform/services/dataproc/resource_dataproc_cluster.go

+61-2
Original file line numberDiff line numberDiff line change
@@ -1183,6 +1183,7 @@ func ResourceDataprocCluster() *schema.Resource {
11831183
ForceNew: true,
11841184
AtLeastOneOf: []string{
11851185
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.instance_selection_list",
1186+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix",
11861187
},
11871188
Description: `List of instance selection options that the group will use when creating new VMs.`,
11881189
Elem: &schema.Resource{
@@ -1227,6 +1228,36 @@ func ResourceDataprocCluster() *schema.Resource {
12271228
},
12281229
},
12291230
},
1231+
"provisioning_model_mix": {
1232+
Type: schema.TypeList,
1233+
Optional: true,
1234+
ForceNew: true,
1235+
AtLeastOneOf: []string{
1236+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.instance_selection_list",
1237+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix",
1238+
},
1239+
MaxItems: 1,
1240+
Description: `Defines how Dataproc should create VMs with a mixture of provisioning models.`,
1241+
Elem: &schema.Resource{
1242+
Schema: map[string]*schema.Schema{
1243+
"standard_capacity_base": {
1244+
Type: schema.TypeInt,
1245+
Optional: true,
1246+
ForceNew: true,
1247+
Description: `The base capacity that will always use Standard VMs to avoid risk of more preemption than the minimum capacity you need.`,
1248+
ValidateFunc: validation.IntAtLeast(0),
1249+
},
1250+
1251+
"standard_capacity_percent_above_base": {
1252+
Type: schema.TypeInt,
1253+
Optional: true,
1254+
ForceNew: true,
1255+
Description: `The percentage of target capacity that should use Standard VM. The remaining percentage will use Spot VMs.`,
1256+
ValidateFunc: validation.IntBetween(0, 100),
1257+
},
1258+
},
1259+
},
1260+
},
12301261
},
12311262
},
12321263
},
@@ -2413,6 +2444,9 @@ func expandPreemptibleInstanceGroupConfig(cfg map[string]interface{}) *dataproc.
24132444
if v, ok := flexibilityPolicy["instance_selection_list"]; ok {
24142445
icg.InstanceFlexibilityPolicy.InstanceSelectionList = expandInstanceSelectionList(v)
24152446
}
2447+
if v, ok := flexibilityPolicy["provisioning_model_mix"]; ok {
2448+
icg.InstanceFlexibilityPolicy.ProvisioningModelMix = expandProvisioningModelMix(v)
2449+
}
24162450
}
24172451

24182452
}
@@ -2444,6 +2478,18 @@ func expandInstanceSelectionList(v interface{}) []*dataproc.InstanceSelection {
24442478
return instanceSelections
24452479
}
24462480

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

@@ -3184,8 +3230,13 @@ func flattenPreemptibleInstanceGroupConfig(d *schema.ResourceData, icg *dataproc
31843230
disk["local_ssd_interface"] = icg.DiskConfig.LocalSsdInterface
31853231
}
31863232
if icg.InstanceFlexibilityPolicy != nil {
3187-
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3188-
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3233+
if icg.InstanceFlexibilityPolicy.InstanceSelectionList != nil {
3234+
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3235+
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3236+
}
3237+
if icg.InstanceFlexibilityPolicy.ProvisioningModelMix != nil {
3238+
instanceFlexibilityPolicy["provisioning_model_mix"] = flattenProvisioningModelMix(icg.InstanceFlexibilityPolicy.ProvisioningModelMix)
3239+
}
31893240
}
31903241
}
31913242

@@ -3222,6 +3273,14 @@ func flattenInstanceSelectionResults(isr []*dataproc.InstanceSelectionResult) []
32223273

32233274
}
32243275

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

mmv1/third_party/terraform/services/dataproc/resource_dataproc_cluster_test.go.tmpl

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

537+
func TestAccDataprocCluster_spotOnDemandMixing(t *testing.T) {
538+
t.Parallel()
539+
540+
rnd := acctest.RandString(t, 10)
541+
var cluster dataproc.Cluster
542+
acctest.VcrTest(t, resource.TestCase{
543+
PreCheck: func() { acctest.AccTestPreCheck(t) },
544+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
545+
CheckDestroy: testAccCheckDataprocClusterDestroy(t),
546+
Steps: []resource.TestStep{
547+
{
548+
Config: testAccDataprocCluster_spotOnDemandMixing(rnd),
549+
Check: resource.ComposeTestCheckFunc(
550+
testAccCheckDataprocClusterExists(t, "google_dataproc_cluster.spot_mixing", &cluster),
551+
resource.TestCheckResourceAttr("google_dataproc_cluster.spot_mixing", "cluster_config.0.preemptible_worker_config.0.preemptibility", "SPOT"),
552+
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"),
553+
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"),
554+
),
555+
},
556+
},
557+
})
558+
}
559+
537560
func TestAccDataprocCluster_spotWithAuxiliaryNodeGroups(t *testing.T) {
538561
t.Parallel()
539562

@@ -1955,6 +1978,50 @@ resource "google_dataproc_cluster" "spot_with_instance_flexibility_policy" {
19551978
`, rnd)
19561979
}
19571980

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

0 commit comments

Comments
 (0)