Skip to content

Commit 572785e

Browse files
Add support for Instance schedules to Google compute resource policy (#4779) (#3263)
* Add instance_schedule_policy to google_compute_resource_policy * Add description to google_compute_resource_policy Signed-off-by: Modular Magician <[email protected]>
1 parent 328faec commit 572785e

File tree

4 files changed

+394
-2
lines changed

4 files changed

+394
-2
lines changed

.changelog/4779.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
```release-note:enhancement
2+
compute: added "instance_schedule_policy" field to "google_compute_resource_policy" resource
3+
```
4+
```release-note:enhancement
5+
compute: added "description" field to "google_compute_resource_policy" resource
6+
```

google-beta/resource_compute_resource_policy.go

Lines changed: 273 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ first character must be a lowercase letter, and all following characters
5353
must be a dash, lowercase letter, or digit, except the last character,
5454
which cannot be a dash.`,
5555
},
56+
"description": {
57+
Type: schema.TypeString,
58+
Optional: true,
59+
ForceNew: true,
60+
Description: `An optional description of this resource. Provide this property when you create the resource.`,
61+
},
5662
"group_placement_policy": {
5763
Type: schema.TypeList,
5864
Optional: true,
@@ -88,7 +94,74 @@ attached. Possible values: ["COLLOCATED"]`,
8894
},
8995
},
9096
},
91-
ConflictsWith: []string{"snapshot_schedule_policy"},
97+
ConflictsWith: []string{"snapshot_schedule_policy", "instance_schedule_policy"},
98+
},
99+
"instance_schedule_policy": {
100+
Type: schema.TypeList,
101+
Optional: true,
102+
ForceNew: true,
103+
Description: `Resource policy for scheduling instance operations.`,
104+
MaxItems: 1,
105+
Elem: &schema.Resource{
106+
Schema: map[string]*schema.Schema{
107+
"time_zone": {
108+
Type: schema.TypeString,
109+
Required: true,
110+
ForceNew: true,
111+
Description: `Specifies the time zone to be used in interpreting the schedule. The value of this field must be a time zone name
112+
from the tz database: http://en.wikipedia.org/wiki/Tz_database.`,
113+
},
114+
"expiration_time": {
115+
Type: schema.TypeString,
116+
Optional: true,
117+
ForceNew: true,
118+
Description: `The expiration time of the schedule. The timestamp is an RFC3339 string.`,
119+
},
120+
"start_time": {
121+
Type: schema.TypeString,
122+
Optional: true,
123+
ForceNew: true,
124+
Description: `The start time of the schedule. The timestamp is an RFC3339 string.`,
125+
},
126+
"vm_start_schedule": {
127+
Type: schema.TypeList,
128+
Optional: true,
129+
ForceNew: true,
130+
Description: `Specifies the schedule for starting instances.`,
131+
MaxItems: 1,
132+
Elem: &schema.Resource{
133+
Schema: map[string]*schema.Schema{
134+
"schedule": {
135+
Type: schema.TypeString,
136+
Required: true,
137+
ForceNew: true,
138+
Description: `Specifies the frequency for the operation, using the unix-cron format.`,
139+
},
140+
},
141+
},
142+
AtLeastOneOf: []string{"instance_schedule_policy.0.vm_start_schedule", "instance_schedule_policy.0.vm_stop_schedule"},
143+
},
144+
"vm_stop_schedule": {
145+
Type: schema.TypeList,
146+
Optional: true,
147+
ForceNew: true,
148+
Description: `Specifies the schedule for stopping instances.`,
149+
MaxItems: 1,
150+
Elem: &schema.Resource{
151+
Schema: map[string]*schema.Schema{
152+
"schedule": {
153+
Type: schema.TypeString,
154+
Required: true,
155+
ForceNew: true,
156+
Description: `Specifies the frequency for the operation, using the unix-cron format.`,
157+
},
158+
},
159+
},
160+
AtLeastOneOf: []string{"instance_schedule_policy.0.vm_start_schedule", "instance_schedule_policy.0.vm_stop_schedule"},
161+
},
162+
},
163+
},
164+
ConflictsWith: []string{"snapshot_schedule_policy", "group_placement_policy"},
92165
},
93166
"region": {
94167
Type: schema.TypeString,
@@ -261,7 +334,7 @@ the source disk is deleted. Default value: "KEEP_AUTO_SNAPSHOTS" Possible values
261334
},
262335
},
263336
},
264-
ConflictsWith: []string{"group_placement_policy"},
337+
ConflictsWith: []string{"group_placement_policy", "instance_schedule_policy"},
265338
},
266339
"project": {
267340
Type: schema.TypeString,
@@ -313,6 +386,12 @@ func resourceComputeResourcePolicyCreate(d *schema.ResourceData, meta interface{
313386
} else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) {
314387
obj["name"] = nameProp
315388
}
389+
descriptionProp, err := expandComputeResourcePolicyDescription(d.Get("description"), d, config)
390+
if err != nil {
391+
return err
392+
} else if v, ok := d.GetOkExists("description"); !isEmptyValue(reflect.ValueOf(descriptionProp)) && (ok || !reflect.DeepEqual(v, descriptionProp)) {
393+
obj["description"] = descriptionProp
394+
}
316395
snapshotSchedulePolicyProp, err := expandComputeResourcePolicySnapshotSchedulePolicy(d.Get("snapshot_schedule_policy"), d, config)
317396
if err != nil {
318397
return err
@@ -325,6 +404,12 @@ func resourceComputeResourcePolicyCreate(d *schema.ResourceData, meta interface{
325404
} else if v, ok := d.GetOkExists("group_placement_policy"); !isEmptyValue(reflect.ValueOf(groupPlacementPolicyProp)) && (ok || !reflect.DeepEqual(v, groupPlacementPolicyProp)) {
326405
obj["groupPlacementPolicy"] = groupPlacementPolicyProp
327406
}
407+
instanceSchedulePolicyProp, err := expandComputeResourcePolicyInstanceSchedulePolicy(d.Get("instance_schedule_policy"), d, config)
408+
if err != nil {
409+
return err
410+
} else if v, ok := d.GetOkExists("instance_schedule_policy"); !isEmptyValue(reflect.ValueOf(instanceSchedulePolicyProp)) && (ok || !reflect.DeepEqual(v, instanceSchedulePolicyProp)) {
411+
obj["instanceSchedulePolicy"] = instanceSchedulePolicyProp
412+
}
328413
regionProp, err := expandComputeResourcePolicyRegion(d.Get("region"), d, config)
329414
if err != nil {
330415
return err
@@ -415,12 +500,18 @@ func resourceComputeResourcePolicyRead(d *schema.ResourceData, meta interface{})
415500
if err := d.Set("name", flattenComputeResourcePolicyName(res["name"], d, config)); err != nil {
416501
return fmt.Errorf("Error reading ResourcePolicy: %s", err)
417502
}
503+
if err := d.Set("description", flattenComputeResourcePolicyDescription(res["description"], d, config)); err != nil {
504+
return fmt.Errorf("Error reading ResourcePolicy: %s", err)
505+
}
418506
if err := d.Set("snapshot_schedule_policy", flattenComputeResourcePolicySnapshotSchedulePolicy(res["snapshotSchedulePolicy"], d, config)); err != nil {
419507
return fmt.Errorf("Error reading ResourcePolicy: %s", err)
420508
}
421509
if err := d.Set("group_placement_policy", flattenComputeResourcePolicyGroupPlacementPolicy(res["groupPlacementPolicy"], d, config)); err != nil {
422510
return fmt.Errorf("Error reading ResourcePolicy: %s", err)
423511
}
512+
if err := d.Set("instance_schedule_policy", flattenComputeResourcePolicyInstanceSchedulePolicy(res["instanceSchedulePolicy"], d, config)); err != nil {
513+
return fmt.Errorf("Error reading ResourcePolicy: %s", err)
514+
}
424515
if err := d.Set("region", flattenComputeResourcePolicyRegion(res["region"], d, config)); err != nil {
425516
return fmt.Errorf("Error reading ResourcePolicy: %s", err)
426517
}
@@ -501,6 +592,10 @@ func flattenComputeResourcePolicyName(v interface{}, d *schema.ResourceData, con
501592
return v
502593
}
503594

595+
func flattenComputeResourcePolicyDescription(v interface{}, d *schema.ResourceData, config *Config) interface{} {
596+
return v
597+
}
598+
504599
func flattenComputeResourcePolicySnapshotSchedulePolicy(v interface{}, d *schema.ResourceData, config *Config) interface{} {
505600
if v == nil {
506601
return nil
@@ -770,6 +865,73 @@ func flattenComputeResourcePolicyGroupPlacementPolicyCollocation(v interface{},
770865
return v
771866
}
772867

868+
func flattenComputeResourcePolicyInstanceSchedulePolicy(v interface{}, d *schema.ResourceData, config *Config) interface{} {
869+
if v == nil {
870+
return nil
871+
}
872+
original := v.(map[string]interface{})
873+
if len(original) == 0 {
874+
return nil
875+
}
876+
transformed := make(map[string]interface{})
877+
transformed["vm_start_schedule"] =
878+
flattenComputeResourcePolicyInstanceSchedulePolicyVmStartSchedule(original["vmStartSchedule"], d, config)
879+
transformed["vm_stop_schedule"] =
880+
flattenComputeResourcePolicyInstanceSchedulePolicyVmStopSchedule(original["vmStopSchedule"], d, config)
881+
transformed["time_zone"] =
882+
flattenComputeResourcePolicyInstanceSchedulePolicyTimeZone(original["timeZone"], d, config)
883+
transformed["start_time"] =
884+
flattenComputeResourcePolicyInstanceSchedulePolicyStartTime(original["startTime"], d, config)
885+
transformed["expiration_time"] =
886+
flattenComputeResourcePolicyInstanceSchedulePolicyExpirationTime(original["expirationTime"], d, config)
887+
return []interface{}{transformed}
888+
}
889+
func flattenComputeResourcePolicyInstanceSchedulePolicyVmStartSchedule(v interface{}, d *schema.ResourceData, config *Config) interface{} {
890+
if v == nil {
891+
return nil
892+
}
893+
original := v.(map[string]interface{})
894+
if len(original) == 0 {
895+
return nil
896+
}
897+
transformed := make(map[string]interface{})
898+
transformed["schedule"] =
899+
flattenComputeResourcePolicyInstanceSchedulePolicyVmStartScheduleSchedule(original["schedule"], d, config)
900+
return []interface{}{transformed}
901+
}
902+
func flattenComputeResourcePolicyInstanceSchedulePolicyVmStartScheduleSchedule(v interface{}, d *schema.ResourceData, config *Config) interface{} {
903+
return v
904+
}
905+
906+
func flattenComputeResourcePolicyInstanceSchedulePolicyVmStopSchedule(v interface{}, d *schema.ResourceData, config *Config) interface{} {
907+
if v == nil {
908+
return nil
909+
}
910+
original := v.(map[string]interface{})
911+
if len(original) == 0 {
912+
return nil
913+
}
914+
transformed := make(map[string]interface{})
915+
transformed["schedule"] =
916+
flattenComputeResourcePolicyInstanceSchedulePolicyVmStopScheduleSchedule(original["schedule"], d, config)
917+
return []interface{}{transformed}
918+
}
919+
func flattenComputeResourcePolicyInstanceSchedulePolicyVmStopScheduleSchedule(v interface{}, d *schema.ResourceData, config *Config) interface{} {
920+
return v
921+
}
922+
923+
func flattenComputeResourcePolicyInstanceSchedulePolicyTimeZone(v interface{}, d *schema.ResourceData, config *Config) interface{} {
924+
return v
925+
}
926+
927+
func flattenComputeResourcePolicyInstanceSchedulePolicyStartTime(v interface{}, d *schema.ResourceData, config *Config) interface{} {
928+
return v
929+
}
930+
931+
func flattenComputeResourcePolicyInstanceSchedulePolicyExpirationTime(v interface{}, d *schema.ResourceData, config *Config) interface{} {
932+
return v
933+
}
934+
773935
func flattenComputeResourcePolicyRegion(v interface{}, d *schema.ResourceData, config *Config) interface{} {
774936
if v == nil {
775937
return v
@@ -781,6 +943,10 @@ func expandComputeResourcePolicyName(v interface{}, d TerraformResourceData, con
781943
return v, nil
782944
}
783945

946+
func expandComputeResourcePolicyDescription(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
947+
return v, nil
948+
}
949+
784950
func expandComputeResourcePolicySnapshotSchedulePolicy(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
785951
l := v.([]interface{})
786952
if len(l) == 0 || l[0] == nil {
@@ -1104,6 +1270,111 @@ func expandComputeResourcePolicyGroupPlacementPolicyCollocation(v interface{}, d
11041270
return v, nil
11051271
}
11061272

1273+
func expandComputeResourcePolicyInstanceSchedulePolicy(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1274+
l := v.([]interface{})
1275+
if len(l) == 0 || l[0] == nil {
1276+
return nil, nil
1277+
}
1278+
raw := l[0]
1279+
original := raw.(map[string]interface{})
1280+
transformed := make(map[string]interface{})
1281+
1282+
transformedVmStartSchedule, err := expandComputeResourcePolicyInstanceSchedulePolicyVmStartSchedule(original["vm_start_schedule"], d, config)
1283+
if err != nil {
1284+
return nil, err
1285+
} else if val := reflect.ValueOf(transformedVmStartSchedule); val.IsValid() && !isEmptyValue(val) {
1286+
transformed["vmStartSchedule"] = transformedVmStartSchedule
1287+
}
1288+
1289+
transformedVmStopSchedule, err := expandComputeResourcePolicyInstanceSchedulePolicyVmStopSchedule(original["vm_stop_schedule"], d, config)
1290+
if err != nil {
1291+
return nil, err
1292+
} else if val := reflect.ValueOf(transformedVmStopSchedule); val.IsValid() && !isEmptyValue(val) {
1293+
transformed["vmStopSchedule"] = transformedVmStopSchedule
1294+
}
1295+
1296+
transformedTimeZone, err := expandComputeResourcePolicyInstanceSchedulePolicyTimeZone(original["time_zone"], d, config)
1297+
if err != nil {
1298+
return nil, err
1299+
} else if val := reflect.ValueOf(transformedTimeZone); val.IsValid() && !isEmptyValue(val) {
1300+
transformed["timeZone"] = transformedTimeZone
1301+
}
1302+
1303+
transformedStartTime, err := expandComputeResourcePolicyInstanceSchedulePolicyStartTime(original["start_time"], d, config)
1304+
if err != nil {
1305+
return nil, err
1306+
} else if val := reflect.ValueOf(transformedStartTime); val.IsValid() && !isEmptyValue(val) {
1307+
transformed["startTime"] = transformedStartTime
1308+
}
1309+
1310+
transformedExpirationTime, err := expandComputeResourcePolicyInstanceSchedulePolicyExpirationTime(original["expiration_time"], d, config)
1311+
if err != nil {
1312+
return nil, err
1313+
} else if val := reflect.ValueOf(transformedExpirationTime); val.IsValid() && !isEmptyValue(val) {
1314+
transformed["expirationTime"] = transformedExpirationTime
1315+
}
1316+
1317+
return transformed, nil
1318+
}
1319+
1320+
func expandComputeResourcePolicyInstanceSchedulePolicyVmStartSchedule(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1321+
l := v.([]interface{})
1322+
if len(l) == 0 || l[0] == nil {
1323+
return nil, nil
1324+
}
1325+
raw := l[0]
1326+
original := raw.(map[string]interface{})
1327+
transformed := make(map[string]interface{})
1328+
1329+
transformedSchedule, err := expandComputeResourcePolicyInstanceSchedulePolicyVmStartScheduleSchedule(original["schedule"], d, config)
1330+
if err != nil {
1331+
return nil, err
1332+
} else if val := reflect.ValueOf(transformedSchedule); val.IsValid() && !isEmptyValue(val) {
1333+
transformed["schedule"] = transformedSchedule
1334+
}
1335+
1336+
return transformed, nil
1337+
}
1338+
1339+
func expandComputeResourcePolicyInstanceSchedulePolicyVmStartScheduleSchedule(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1340+
return v, nil
1341+
}
1342+
1343+
func expandComputeResourcePolicyInstanceSchedulePolicyVmStopSchedule(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1344+
l := v.([]interface{})
1345+
if len(l) == 0 || l[0] == nil {
1346+
return nil, nil
1347+
}
1348+
raw := l[0]
1349+
original := raw.(map[string]interface{})
1350+
transformed := make(map[string]interface{})
1351+
1352+
transformedSchedule, err := expandComputeResourcePolicyInstanceSchedulePolicyVmStopScheduleSchedule(original["schedule"], d, config)
1353+
if err != nil {
1354+
return nil, err
1355+
} else if val := reflect.ValueOf(transformedSchedule); val.IsValid() && !isEmptyValue(val) {
1356+
transformed["schedule"] = transformedSchedule
1357+
}
1358+
1359+
return transformed, nil
1360+
}
1361+
1362+
func expandComputeResourcePolicyInstanceSchedulePolicyVmStopScheduleSchedule(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1363+
return v, nil
1364+
}
1365+
1366+
func expandComputeResourcePolicyInstanceSchedulePolicyTimeZone(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1367+
return v, nil
1368+
}
1369+
1370+
func expandComputeResourcePolicyInstanceSchedulePolicyStartTime(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1371+
return v, nil
1372+
}
1373+
1374+
func expandComputeResourcePolicyInstanceSchedulePolicyExpirationTime(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
1375+
return v, nil
1376+
}
1377+
11071378
func expandComputeResourcePolicyRegion(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
11081379
f, err := parseGlobalFieldValue("regions", v.(string), "project", d, config, true)
11091380
if err != nil {

0 commit comments

Comments
 (0)