Skip to content

Commit 61d356c

Browse files
Add support for boost configs in workstations configs (#10176) (#7122)
* add boostConfig workstationConfig * add boostConfig workstationConfig * link example * remove * update descriptions and add update test * update machine type * fix update test [upstream:676288eca33da129da405db05a0b02f6af61011b] Signed-off-by: Modular Magician <[email protected]>
1 parent e22f0b2 commit 61d356c

File tree

5 files changed

+462
-0
lines changed

5 files changed

+462
-0
lines changed

.changelog/10176.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
workstations: added `host.gceInstance.boostConfig` to `google_workstations_workstation_config` (beta)
3+
```

google-beta/services/workstations/resource_workstations_workstation_config.go

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,44 @@ Updating 'source_snapshot' will update content in the ephemeral directory after
263263
},
264264
},
265265
},
266+
"boost_configs": {
267+
Type: schema.TypeList,
268+
Optional: true,
269+
Description: `A list of the boost configurations that workstations created using this workstation configuration are allowed to use.`,
270+
Elem: &schema.Resource{
271+
Schema: map[string]*schema.Schema{
272+
"id": {
273+
Type: schema.TypeString,
274+
Required: true,
275+
Description: `The id to be used for the boost config.`,
276+
},
277+
"accelerators": {
278+
Type: schema.TypeList,
279+
Optional: true,
280+
Description: `An accelerator card attached to the boost instance.`,
281+
Elem: &schema.Resource{
282+
Schema: map[string]*schema.Schema{
283+
"count": {
284+
Type: schema.TypeInt,
285+
Required: true,
286+
Description: `Number of accelerator cards exposed to the instance.`,
287+
},
288+
"type": {
289+
Type: schema.TypeString,
290+
Required: true,
291+
Description: `Type of accelerator resource to attach to the instance, for example, "nvidia-tesla-p100".`,
292+
},
293+
},
294+
},
295+
},
296+
"machine_type": {
297+
Type: schema.TypeString,
298+
Optional: true,
299+
Description: `The type of machine that boosted VM instances will use—for example, e2-standard-4. For more information about machine types that Cloud Workstations supports, see the list of available machine types https://cloud.google.com/workstations/docs/available-machine-types. Defaults to e2-standard-4.`,
300+
},
301+
},
302+
},
303+
},
266304
"boot_disk_size_gb": {
267305
Type: schema.TypeInt,
268306
Computed: true,
@@ -966,6 +1004,7 @@ func resourceWorkstationsWorkstationConfigUpdate(d *schema.ResourceData, meta in
9661004
"host.gceInstance.shieldedInstanceConfig.enableIntegrityMonitoring",
9671005
"host.gceInstance.confidentialInstanceConfig.enableConfidentialCompute",
9681006
"host.gceInstance.accelerators",
1007+
"host.gceInstance.boostConfigs",
9691008
"host.gceInstance.disableSsh")
9701009
}
9711010

@@ -1224,6 +1263,8 @@ func flattenWorkstationsWorkstationConfigHostGceInstance(v interface{}, d *schem
12241263
flattenWorkstationsWorkstationConfigHostGceInstanceConfidentialInstanceConfig(original["confidentialInstanceConfig"], d, config)
12251264
transformed["accelerators"] =
12261265
flattenWorkstationsWorkstationConfigHostGceInstanceAccelerators(original["accelerators"], d, config)
1266+
transformed["boost_configs"] =
1267+
flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigs(original["boostConfigs"], d, config)
12271268
return []interface{}{transformed}
12281269
}
12291270
func flattenWorkstationsWorkstationConfigHostGceInstanceMachineType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
@@ -1372,6 +1413,74 @@ func flattenWorkstationsWorkstationConfigHostGceInstanceAcceleratorsCount(v inte
13721413
return v // let terraform core handle it otherwise
13731414
}
13741415

1416+
func flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigs(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1417+
if v == nil {
1418+
return v
1419+
}
1420+
l := v.([]interface{})
1421+
transformed := make([]interface{}, 0, len(l))
1422+
for _, raw := range l {
1423+
original := raw.(map[string]interface{})
1424+
if len(original) < 1 {
1425+
// Do not include empty json objects coming back from the api
1426+
continue
1427+
}
1428+
transformed = append(transformed, map[string]interface{}{
1429+
"id": flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsId(original["id"], d, config),
1430+
"machine_type": flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsMachineType(original["machineType"], d, config),
1431+
"accelerators": flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAccelerators(original["accelerators"], d, config),
1432+
})
1433+
}
1434+
return transformed
1435+
}
1436+
func flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1437+
return v
1438+
}
1439+
1440+
func flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsMachineType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1441+
return v
1442+
}
1443+
1444+
func flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAccelerators(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1445+
if v == nil {
1446+
return v
1447+
}
1448+
l := v.([]interface{})
1449+
transformed := make([]interface{}, 0, len(l))
1450+
for _, raw := range l {
1451+
original := raw.(map[string]interface{})
1452+
if len(original) < 1 {
1453+
// Do not include empty json objects coming back from the api
1454+
continue
1455+
}
1456+
transformed = append(transformed, map[string]interface{}{
1457+
"type": flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsType(original["type"], d, config),
1458+
"count": flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsCount(original["count"], d, config),
1459+
})
1460+
}
1461+
return transformed
1462+
}
1463+
func flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1464+
return v
1465+
}
1466+
1467+
func flattenWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsCount(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1468+
// Handles the string fixed64 format
1469+
if strVal, ok := v.(string); ok {
1470+
if intVal, err := tpgresource.StringToFixed64(strVal); err == nil {
1471+
return intVal
1472+
}
1473+
}
1474+
1475+
// number values are represented as float64
1476+
if floatVal, ok := v.(float64); ok {
1477+
intVal := int(floatVal)
1478+
return intVal
1479+
}
1480+
1481+
return v // let terraform core handle it otherwise
1482+
}
1483+
13751484
func flattenWorkstationsWorkstationConfigPersistentDirectories(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
13761485
if v == nil {
13771486
return v
@@ -1842,6 +1951,13 @@ func expandWorkstationsWorkstationConfigHostGceInstance(v interface{}, d tpgreso
18421951
transformed["accelerators"] = transformedAccelerators
18431952
}
18441953

1954+
transformedBoostConfigs, err := expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigs(original["boost_configs"], d, config)
1955+
if err != nil {
1956+
return nil, err
1957+
} else if val := reflect.ValueOf(transformedBoostConfigs); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1958+
transformed["boostConfigs"] = transformedBoostConfigs
1959+
}
1960+
18451961
return transformed, nil
18461962
}
18471963

@@ -1986,6 +2102,87 @@ func expandWorkstationsWorkstationConfigHostGceInstanceAcceleratorsCount(v inter
19862102
return v, nil
19872103
}
19882104

2105+
func expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigs(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2106+
l := v.([]interface{})
2107+
req := make([]interface{}, 0, len(l))
2108+
for _, raw := range l {
2109+
if raw == nil {
2110+
continue
2111+
}
2112+
original := raw.(map[string]interface{})
2113+
transformed := make(map[string]interface{})
2114+
2115+
transformedId, err := expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsId(original["id"], d, config)
2116+
if err != nil {
2117+
return nil, err
2118+
} else if val := reflect.ValueOf(transformedId); val.IsValid() && !tpgresource.IsEmptyValue(val) {
2119+
transformed["id"] = transformedId
2120+
}
2121+
2122+
transformedMachineType, err := expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsMachineType(original["machine_type"], d, config)
2123+
if err != nil {
2124+
return nil, err
2125+
} else if val := reflect.ValueOf(transformedMachineType); val.IsValid() && !tpgresource.IsEmptyValue(val) {
2126+
transformed["machineType"] = transformedMachineType
2127+
}
2128+
2129+
transformedAccelerators, err := expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAccelerators(original["accelerators"], d, config)
2130+
if err != nil {
2131+
return nil, err
2132+
} else if val := reflect.ValueOf(transformedAccelerators); val.IsValid() && !tpgresource.IsEmptyValue(val) {
2133+
transformed["accelerators"] = transformedAccelerators
2134+
}
2135+
2136+
req = append(req, transformed)
2137+
}
2138+
return req, nil
2139+
}
2140+
2141+
func expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsId(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2142+
return v, nil
2143+
}
2144+
2145+
func expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsMachineType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2146+
return v, nil
2147+
}
2148+
2149+
func expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAccelerators(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2150+
l := v.([]interface{})
2151+
req := make([]interface{}, 0, len(l))
2152+
for _, raw := range l {
2153+
if raw == nil {
2154+
continue
2155+
}
2156+
original := raw.(map[string]interface{})
2157+
transformed := make(map[string]interface{})
2158+
2159+
transformedType, err := expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsType(original["type"], d, config)
2160+
if err != nil {
2161+
return nil, err
2162+
} else if val := reflect.ValueOf(transformedType); val.IsValid() && !tpgresource.IsEmptyValue(val) {
2163+
transformed["type"] = transformedType
2164+
}
2165+
2166+
transformedCount, err := expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsCount(original["count"], d, config)
2167+
if err != nil {
2168+
return nil, err
2169+
} else if val := reflect.ValueOf(transformedCount); val.IsValid() && !tpgresource.IsEmptyValue(val) {
2170+
transformed["count"] = transformedCount
2171+
}
2172+
2173+
req = append(req, transformed)
2174+
}
2175+
return req, nil
2176+
}
2177+
2178+
func expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2179+
return v, nil
2180+
}
2181+
2182+
func expandWorkstationsWorkstationConfigHostGceInstanceBoostConfigsAcceleratorsCount(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
2183+
return v, nil
2184+
}
2185+
19892186
func expandWorkstationsWorkstationConfigPersistentDirectories(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
19902187
l := v.([]interface{})
19912188
req := make([]interface{}, 0, len(l))

google-beta/services/workstations/resource_workstations_workstation_config_generated_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,92 @@ resource "google_workstations_workstation_config" "default" {
526526
`, context)
527527
}
528528

529+
func TestAccWorkstationsWorkstationConfig_workstationConfigBoostExample(t *testing.T) {
530+
t.Parallel()
531+
532+
context := map[string]interface{}{
533+
"random_suffix": acctest.RandString(t, 10),
534+
}
535+
536+
acctest.VcrTest(t, resource.TestCase{
537+
PreCheck: func() { acctest.AccTestPreCheck(t) },
538+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
539+
CheckDestroy: testAccCheckWorkstationsWorkstationConfigDestroyProducer(t),
540+
Steps: []resource.TestStep{
541+
{
542+
Config: testAccWorkstationsWorkstationConfig_workstationConfigBoostExample(context),
543+
},
544+
{
545+
ResourceName: "google_workstations_workstation_config.default",
546+
ImportState: true,
547+
ImportStateVerify: true,
548+
ImportStateVerifyIgnore: []string{"enable_audit_agent", "workstation_config_id", "workstation_cluster_id", "location", "labels", "annotations", "terraform_labels"},
549+
},
550+
},
551+
})
552+
}
553+
554+
func testAccWorkstationsWorkstationConfig_workstationConfigBoostExample(context map[string]interface{}) string {
555+
return acctest.Nprintf(`
556+
resource "google_compute_network" "default" {
557+
provider = google-beta
558+
name = "tf-test-workstation-cluster%{random_suffix}"
559+
auto_create_subnetworks = false
560+
}
561+
562+
resource "google_compute_subnetwork" "default" {
563+
provider = google-beta
564+
name = "tf-test-workstation-cluster%{random_suffix}"
565+
ip_cidr_range = "10.0.0.0/24"
566+
region = "us-central1"
567+
network = google_compute_network.default.name
568+
}
569+
570+
resource "google_workstations_workstation_cluster" "default" {
571+
provider = google-beta
572+
workstation_cluster_id = "tf-test-workstation-cluster%{random_suffix}"
573+
network = google_compute_network.default.id
574+
subnetwork = google_compute_subnetwork.default.id
575+
location = "us-central1"
576+
577+
labels = {
578+
"label" = "key"
579+
}
580+
581+
annotations = {
582+
label-one = "value-one"
583+
}
584+
}
585+
586+
resource "google_workstations_workstation_config" "default" {
587+
provider = google-beta
588+
workstation_config_id = "tf-test-workstation-config%{random_suffix}"
589+
workstation_cluster_id = google_workstations_workstation_cluster.default.workstation_cluster_id
590+
location = "us-central1"
591+
592+
host {
593+
gce_instance {
594+
machine_type = "e2-standard-4"
595+
boot_disk_size_gb = 35
596+
disable_public_ip_addresses = true
597+
boost_configs {
598+
id = "boost-1"
599+
machine_type = "n1-standard-2"
600+
accelerators {
601+
type = "nvidia-tesla-t4"
602+
count = "1"
603+
}
604+
}
605+
boost_configs {
606+
id = "boost-1"
607+
machine_type = "e2-standard-2"
608+
}
609+
}
610+
}
611+
}
612+
`, context)
613+
}
614+
529615
func TestAccWorkstationsWorkstationConfig_workstationConfigEncryptionKeyExample(t *testing.T) {
530616
t.Parallel()
531617

0 commit comments

Comments
 (0)