@@ -53,6 +53,12 @@ first character must be a lowercase letter, and all following characters
5353must be a dash, lowercase letter, or digit, except the last character,
5454which 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+
504599func 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+
773935func 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+
784950func 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+
11071378func 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