Skip to content

Commit 36b5fb7

Browse files
Support Post sart up script on runtime templates (#12929) (#21200)
[upstream:0500297dde9a16e181d0e2228e06b835d72ad325] Signed-off-by: Modular Magician <[email protected]>
1 parent dd8578f commit 36b5fb7

File tree

5 files changed

+329
-0
lines changed

5 files changed

+329
-0
lines changed

.changelog/12929.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
colab: added `software_config.post_startup_script_config` field to `google_colab_runtime_template`
3+
```

google/services/colab/resource_colab_runtime_template.go

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929

3030
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
3131
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
32+
"github.com/hashicorp/terraform-provider-google/google/verify"
3233
)
3334

3435
func ResourceColabRuntimeTemplate() *schema.Resource {
@@ -258,6 +259,69 @@ Please refer to the field 'effective_labels' for all of the labels present on th
258259
},
259260
},
260261
},
262+
"software_config": {
263+
Type: schema.TypeList,
264+
Optional: true,
265+
ForceNew: true,
266+
Description: `The notebook software configuration of the notebook runtime.`,
267+
MaxItems: 1,
268+
Elem: &schema.Resource{
269+
Schema: map[string]*schema.Schema{
270+
"env": {
271+
Type: schema.TypeList,
272+
Optional: true,
273+
ForceNew: true,
274+
Description: `Environment variables to be passed to the container.`,
275+
Elem: &schema.Resource{
276+
Schema: map[string]*schema.Schema{
277+
"name": {
278+
Type: schema.TypeString,
279+
Optional: true,
280+
ForceNew: true,
281+
Description: `Name of the environment variable. Must be a valid C identifier.`,
282+
},
283+
"value": {
284+
Type: schema.TypeString,
285+
Optional: true,
286+
ForceNew: true,
287+
Description: `Variables that reference a $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not.`,
288+
},
289+
},
290+
},
291+
},
292+
"post_startup_script_config": {
293+
Type: schema.TypeList,
294+
Optional: true,
295+
ForceNew: true,
296+
Description: `Post startup script config.`,
297+
MaxItems: 1,
298+
Elem: &schema.Resource{
299+
Schema: map[string]*schema.Schema{
300+
"post_startup_script": {
301+
Type: schema.TypeString,
302+
Optional: true,
303+
ForceNew: true,
304+
Description: `Post startup script to run after runtime is started.`,
305+
},
306+
"post_startup_script_behavior": {
307+
Type: schema.TypeString,
308+
Optional: true,
309+
ForceNew: true,
310+
ValidateFunc: verify.ValidateEnum([]string{"RUN_ONCE", "RUN_EVERY_START", "DOWNLOAD_AND_RUN_EVERY_START", ""}),
311+
Description: `Post startup script behavior that defines download and execution behavior. Possible values: ["RUN_ONCE", "RUN_EVERY_START", "DOWNLOAD_AND_RUN_EVERY_START"]`,
312+
},
313+
"post_startup_script_url": {
314+
Type: schema.TypeString,
315+
Optional: true,
316+
ForceNew: true,
317+
Description: `Post startup script url to download. Example: https://bucket/script.sh.`,
318+
},
319+
},
320+
},
321+
},
322+
},
323+
},
324+
},
261325
"effective_labels": {
262326
Type: schema.TypeMap,
263327
Computed: true,
@@ -357,6 +421,12 @@ func resourceColabRuntimeTemplateCreate(d *schema.ResourceData, meta interface{}
357421
} else if v, ok := d.GetOkExists("encryption_spec"); !tpgresource.IsEmptyValue(reflect.ValueOf(encryptionSpecProp)) && (ok || !reflect.DeepEqual(v, encryptionSpecProp)) {
358422
obj["encryptionSpec"] = encryptionSpecProp
359423
}
424+
softwareConfigProp, err := expandColabRuntimeTemplateSoftwareConfig(d.Get("software_config"), d, config)
425+
if err != nil {
426+
return err
427+
} else if v, ok := d.GetOkExists("software_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(softwareConfigProp)) && (ok || !reflect.DeepEqual(v, softwareConfigProp)) {
428+
obj["softwareConfig"] = softwareConfigProp
429+
}
360430
labelsProp, err := expandColabRuntimeTemplateEffectiveLabels(d.Get("effective_labels"), d, config)
361431
if err != nil {
362432
return err
@@ -509,6 +579,9 @@ func resourceColabRuntimeTemplateRead(d *schema.ResourceData, meta interface{})
509579
if err := d.Set("encryption_spec", flattenColabRuntimeTemplateEncryptionSpec(res["encryptionSpec"], d, config)); err != nil {
510580
return fmt.Errorf("Error reading RuntimeTemplate: %s", err)
511581
}
582+
if err := d.Set("software_config", flattenColabRuntimeTemplateSoftwareConfig(res["softwareConfig"], d, config)); err != nil {
583+
return fmt.Errorf("Error reading RuntimeTemplate: %s", err)
584+
}
512585
if err := d.Set("terraform_labels", flattenColabRuntimeTemplateTerraformLabels(res["labels"], d, config)); err != nil {
513586
return fmt.Errorf("Error reading RuntimeTemplate: %s", err)
514587
}
@@ -796,6 +869,77 @@ func flattenColabRuntimeTemplateEncryptionSpecKmsKeyName(v interface{}, d *schem
796869
return v
797870
}
798871

872+
func flattenColabRuntimeTemplateSoftwareConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
873+
if v == nil {
874+
return nil
875+
}
876+
original := v.(map[string]interface{})
877+
if len(original) == 0 {
878+
return nil
879+
}
880+
transformed := make(map[string]interface{})
881+
transformed["env"] =
882+
flattenColabRuntimeTemplateSoftwareConfigEnv(original["env"], d, config)
883+
transformed["post_startup_script_config"] =
884+
flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfig(original["postStartupScriptConfig"], d, config)
885+
return []interface{}{transformed}
886+
}
887+
func flattenColabRuntimeTemplateSoftwareConfigEnv(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
888+
if v == nil {
889+
return v
890+
}
891+
l := v.([]interface{})
892+
transformed := make([]interface{}, 0, len(l))
893+
for _, raw := range l {
894+
original := raw.(map[string]interface{})
895+
if len(original) < 1 {
896+
// Do not include empty json objects coming back from the api
897+
continue
898+
}
899+
transformed = append(transformed, map[string]interface{}{
900+
"name": flattenColabRuntimeTemplateSoftwareConfigEnvName(original["name"], d, config),
901+
"value": flattenColabRuntimeTemplateSoftwareConfigEnvValue(original["value"], d, config),
902+
})
903+
}
904+
return transformed
905+
}
906+
func flattenColabRuntimeTemplateSoftwareConfigEnvName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
907+
return v
908+
}
909+
910+
func flattenColabRuntimeTemplateSoftwareConfigEnvValue(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
911+
return v
912+
}
913+
914+
func flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
915+
if v == nil {
916+
return nil
917+
}
918+
original := v.(map[string]interface{})
919+
if len(original) == 0 {
920+
return nil
921+
}
922+
transformed := make(map[string]interface{})
923+
transformed["post_startup_script"] =
924+
flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScript(original["postStartupScript"], d, config)
925+
transformed["post_startup_script_url"] =
926+
flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptUrl(original["postStartupScriptUrl"], d, config)
927+
transformed["post_startup_script_behavior"] =
928+
flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptBehavior(original["postStartupScriptBehavior"], d, config)
929+
return []interface{}{transformed}
930+
}
931+
func flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScript(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
932+
return v
933+
}
934+
935+
func flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptUrl(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
936+
return v
937+
}
938+
939+
func flattenColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptBehavior(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
940+
return v
941+
}
942+
799943
func flattenColabRuntimeTemplateTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
800944
if v == nil {
801945
return v
@@ -1047,6 +1191,114 @@ func expandColabRuntimeTemplateEncryptionSpecKmsKeyName(v interface{}, d tpgreso
10471191
return v, nil
10481192
}
10491193

1194+
func expandColabRuntimeTemplateSoftwareConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1195+
l := v.([]interface{})
1196+
if len(l) == 0 || l[0] == nil {
1197+
return nil, nil
1198+
}
1199+
raw := l[0]
1200+
original := raw.(map[string]interface{})
1201+
transformed := make(map[string]interface{})
1202+
1203+
transformedEnv, err := expandColabRuntimeTemplateSoftwareConfigEnv(original["env"], d, config)
1204+
if err != nil {
1205+
return nil, err
1206+
} else if val := reflect.ValueOf(transformedEnv); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1207+
transformed["env"] = transformedEnv
1208+
}
1209+
1210+
transformedPostStartupScriptConfig, err := expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfig(original["post_startup_script_config"], d, config)
1211+
if err != nil {
1212+
return nil, err
1213+
} else if val := reflect.ValueOf(transformedPostStartupScriptConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1214+
transformed["postStartupScriptConfig"] = transformedPostStartupScriptConfig
1215+
}
1216+
1217+
return transformed, nil
1218+
}
1219+
1220+
func expandColabRuntimeTemplateSoftwareConfigEnv(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1221+
l := v.([]interface{})
1222+
req := make([]interface{}, 0, len(l))
1223+
for _, raw := range l {
1224+
if raw == nil {
1225+
continue
1226+
}
1227+
original := raw.(map[string]interface{})
1228+
transformed := make(map[string]interface{})
1229+
1230+
transformedName, err := expandColabRuntimeTemplateSoftwareConfigEnvName(original["name"], d, config)
1231+
if err != nil {
1232+
return nil, err
1233+
} else if val := reflect.ValueOf(transformedName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1234+
transformed["name"] = transformedName
1235+
}
1236+
1237+
transformedValue, err := expandColabRuntimeTemplateSoftwareConfigEnvValue(original["value"], d, config)
1238+
if err != nil {
1239+
return nil, err
1240+
} else if val := reflect.ValueOf(transformedValue); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1241+
transformed["value"] = transformedValue
1242+
}
1243+
1244+
req = append(req, transformed)
1245+
}
1246+
return req, nil
1247+
}
1248+
1249+
func expandColabRuntimeTemplateSoftwareConfigEnvName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1250+
return v, nil
1251+
}
1252+
1253+
func expandColabRuntimeTemplateSoftwareConfigEnvValue(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1254+
return v, nil
1255+
}
1256+
1257+
func expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1258+
l := v.([]interface{})
1259+
if len(l) == 0 || l[0] == nil {
1260+
return nil, nil
1261+
}
1262+
raw := l[0]
1263+
original := raw.(map[string]interface{})
1264+
transformed := make(map[string]interface{})
1265+
1266+
transformedPostStartupScript, err := expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScript(original["post_startup_script"], d, config)
1267+
if err != nil {
1268+
return nil, err
1269+
} else if val := reflect.ValueOf(transformedPostStartupScript); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1270+
transformed["postStartupScript"] = transformedPostStartupScript
1271+
}
1272+
1273+
transformedPostStartupScriptUrl, err := expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptUrl(original["post_startup_script_url"], d, config)
1274+
if err != nil {
1275+
return nil, err
1276+
} else if val := reflect.ValueOf(transformedPostStartupScriptUrl); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1277+
transformed["postStartupScriptUrl"] = transformedPostStartupScriptUrl
1278+
}
1279+
1280+
transformedPostStartupScriptBehavior, err := expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptBehavior(original["post_startup_script_behavior"], d, config)
1281+
if err != nil {
1282+
return nil, err
1283+
} else if val := reflect.ValueOf(transformedPostStartupScriptBehavior); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1284+
transformed["postStartupScriptBehavior"] = transformedPostStartupScriptBehavior
1285+
}
1286+
1287+
return transformed, nil
1288+
}
1289+
1290+
func expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScript(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1291+
return v, nil
1292+
}
1293+
1294+
func expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptUrl(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1295+
return v, nil
1296+
}
1297+
1298+
func expandColabRuntimeTemplateSoftwareConfigPostStartupScriptConfigPostStartupScriptBehavior(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1299+
return v, nil
1300+
}
1301+
10501302
func expandColabRuntimeTemplateEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
10511303
if v == nil {
10521304
return map[string]string{}, nil

google/services/colab/resource_colab_runtime_template_generated_meta.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,10 @@ fields:
2525
- field: 'network_spec.subnetwork'
2626
- field: 'network_tags'
2727
- field: 'shielded_vm_config.enable_secure_boot'
28+
- field: 'software_config.env.name'
29+
- field: 'software_config.env.value'
30+
- field: 'software_config.post_startup_script_config.post_startup_script'
31+
- field: 'software_config.post_startup_script_config.post_startup_script_behavior'
32+
- field: 'software_config.post_startup_script_config.post_startup_script_url'
2833
- field: 'terraform_labels'
2934
provider_only: true

google/services/colab/resource_colab_runtime_template_generated_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,19 @@ resource "google_colab_runtime_template" "runtime-template" {
192192
encryption_spec {
193193
kms_key_name = "%{key_name}"
194194
}
195+
196+
software_config {
197+
env {
198+
name = "TEST"
199+
value = 1
200+
}
201+
202+
post_startup_script_config {
203+
post_startup_script = "echo 'hello world'"
204+
post_startup_script_url = "gs://colab-enterprise-pss-secure/secure_pss.sh"
205+
post_startup_script_behavior = "RUN_ONCE"
206+
}
207+
}
195208
}
196209
`, context)
197210
}

0 commit comments

Comments
 (0)