Skip to content

Commit 42c668b

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

File tree

2 files changed

+126
-2
lines changed

2 files changed

+126
-2
lines changed

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

+59-2
Original file line numberDiff line numberDiff line change
@@ -1227,6 +1227,35 @@ func ResourceDataprocCluster() *schema.Resource {
12271227
},
12281228
},
12291229
},
1230+
"provisioning_model_mix": {
1231+
Type: schema.TypeList,
1232+
Optional: true,
1233+
Computed: true,
1234+
AtLeastOneOf: []string{
1235+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix.0.standard_capacity_base",
1236+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix.0.standard_capacity_percent_above_base",
1237+
},
1238+
MaxItems: 1,
1239+
Description: `Defines how Dataproc should create VMs with a mixture of provisioning models.`,
1240+
Elem: &schema.Resource{
1241+
Schema: map[string]*schema.Schema{
1242+
"standard_capacity_base": {
1243+
Type: schema.TypeInt,
1244+
Optional: true,
1245+
Description: `The base capacity that will always use Standard VMs to avoid risk of more preemption than the minimum capacity you need.`,
1246+
ValidateFunc: validation.IntAtLeast(0),
1247+
},
1248+
1249+
"standard_capacity_percent_above_base": {
1250+
Type: schema.TypeInt,
1251+
Optional: true,
1252+
Description: `The percentage of target capacity that should use Standard VM. The remaining percentage will use Spot VMs.`,
1253+
ForceNew: true,
1254+
ValidateFunc: validation.IntBetween(0, 100),
1255+
},
1256+
},
1257+
},
1258+
},
12301259
},
12311260
},
12321261
},
@@ -2413,6 +2442,9 @@ func expandPreemptibleInstanceGroupConfig(cfg map[string]interface{}) *dataproc.
24132442
if v, ok := flexibilityPolicy["instance_selection_list"]; ok {
24142443
icg.InstanceFlexibilityPolicy.InstanceSelectionList = expandInstanceSelectionList(v)
24152444
}
2445+
if v, ok := flexibilityPolicy["provisioning_model_mix"]; ok {
2446+
icg.InstanceFlexibilityPolicy.ProvisioningModelMix = expandProvisioningModelMix(v)
2447+
}
24162448
}
24172449

24182450
}
@@ -2444,6 +2476,18 @@ func expandInstanceSelectionList(v interface{}) []*dataproc.InstanceSelection {
24442476
return instanceSelections
24452477
}
24462478

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

@@ -3184,8 +3228,13 @@ func flattenPreemptibleInstanceGroupConfig(d *schema.ResourceData, icg *dataproc
31843228
disk["local_ssd_interface"] = icg.DiskConfig.LocalSsdInterface
31853229
}
31863230
if icg.InstanceFlexibilityPolicy != nil {
3187-
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3188-
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3231+
if icg.InstanceFlexibilityPolicy.InstanceSelectionList != nil {
3232+
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3233+
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3234+
}
3235+
if icg.InstanceFlexibilityPolicy.ProvisioningModelMix != nil {
3236+
instanceFlexibilityPolicy["provisioning_model_mix"] = flattenProvisioningModelMix(icg.InstanceFlexibilityPolicy.ProvisioningModelMix)
3237+
}
31893238
}
31903239
}
31913240

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

32233272
}
32243273

3274+
func flattenProvisioningModelMix(pmm *dataproc.ProvisioningModelMix) []map[string]interface{} {
3275+
provisioningModelMix := map[string]interface{}{}
3276+
provisioningModelMix["standard_capacity_base"] = pmm.StandardCapacityBase
3277+
provisioningModelMix["standard_capacity_percent_above_base"] = pmm.StandardCapacityPercentAboveBase
3278+
3279+
return []map[string]interface{}{provisioningModelMix}
3280+
}
3281+
32253282
func flattenMasterInstanceGroupConfig(d *schema.ResourceData, icg *dataproc.InstanceGroupConfig) []map[string]interface{} {
32263283
disk := map[string]interface{}{}
32273284
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)