Skip to content

Commit 8459beb

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

File tree

2 files changed

+129
-2
lines changed

2 files changed

+129
-2
lines changed

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

+62-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,37 @@ func ResourceDataprocCluster() *schema.Resource {
12271228
},
12281229
},
12291230
},
1231+
"provisioning_model_mix": {
1232+
Type: schema.TypeList,
1233+
Optional: true,
1234+
Computed: true,
1235+
AtLeastOneOf: []string{
1236+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix.0.standard_capacity_base",
1237+
"cluster_config.0.preemptible_worker_config.0.instance_flexibility_policy.0.provisioning_model_mix.0.standard_capacity_percent_above_base",
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+
Computed: 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+
Computed: true,
1255+
Description: `The percentage of target capacity that should use Standard VM. The remaining percentage will use Spot VMs.`,
1256+
ForceNew: true,
1257+
ValidateFunc: validation.IntBetween(0, 100),
1258+
},
1259+
},
1260+
},
1261+
},
12301262
},
12311263
},
12321264
},
@@ -2413,6 +2445,9 @@ func expandPreemptibleInstanceGroupConfig(cfg map[string]interface{}) *dataproc.
24132445
if v, ok := flexibilityPolicy["instance_selection_list"]; ok {
24142446
icg.InstanceFlexibilityPolicy.InstanceSelectionList = expandInstanceSelectionList(v)
24152447
}
2448+
if v, ok := flexibilityPolicy["provisioning_model_mix"]; ok {
2449+
icg.InstanceFlexibilityPolicy.ProvisioningModelMix = expandProvisioningModelMix(v)
2450+
}
24162451
}
24172452

24182453
}
@@ -2444,6 +2479,18 @@ func expandInstanceSelectionList(v interface{}) []*dataproc.InstanceSelection {
24442479
return instanceSelections
24452480
}
24462481

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

@@ -3184,8 +3231,13 @@ func flattenPreemptibleInstanceGroupConfig(d *schema.ResourceData, icg *dataproc
31843231
disk["local_ssd_interface"] = icg.DiskConfig.LocalSsdInterface
31853232
}
31863233
if icg.InstanceFlexibilityPolicy != nil {
3187-
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3188-
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3234+
if icg.InstanceFlexibilityPolicy.InstanceSelectionList != nil {
3235+
instanceFlexibilityPolicy["instance_selection_list"] = flattenInstanceSelectionList(icg.InstanceFlexibilityPolicy.InstanceSelectionList)
3236+
instanceFlexibilityPolicy["instance_selection_results"] = flattenInstanceSelectionResults(icg.InstanceFlexibilityPolicy.InstanceSelectionResults)
3237+
}
3238+
if icg.InstanceFlexibilityPolicy.ProvisioningModelMix != nil {
3239+
instanceFlexibilityPolicy["provisioning_model_mix"] = flattenProvisioningModelMix(icg.InstanceFlexibilityPolicy.ProvisioningModelMix)
3240+
}
31893241
}
31903242
}
31913243

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

32233275
}
32243276

3277+
func flattenProvisioningModelMix(pmm *dataproc.ProvisioningModelMix) []map[string]interface{} {
3278+
provisioningModelMix := map[string]interface{}{}
3279+
provisioningModelMix["standard_capacity_base"] = pmm.StandardCapacityBase
3280+
provisioningModelMix["standard_capacity_percent_above_base"] = pmm.StandardCapacityPercentAboveBase
3281+
3282+
return []map[string]interface{}{provisioningModelMix}
3283+
}
3284+
32253285
func flattenMasterInstanceGroupConfig(d *schema.ResourceData, icg *dataproc.InstanceGroupConfig) []map[string]interface{} {
32263286
disk := map[string]interface{}{}
32273287
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)