@@ -29,6 +29,7 @@ func resourceComputeReservation() *schema.Resource {
2929 return & schema.Resource {
3030 Create : resourceComputeReservationCreate ,
3131 Read : resourceComputeReservationRead ,
32+ Update : resourceComputeReservationUpdate ,
3233 Delete : resourceComputeReservationDelete ,
3334
3435 Importer : & schema.ResourceImporter {
@@ -37,6 +38,7 @@ func resourceComputeReservation() *schema.Resource {
3738
3839 Timeouts : & schema.ResourceTimeout {
3940 Create : schema .DefaultTimeout (4 * time .Minute ),
41+ Update : schema .DefaultTimeout (4 * time .Minute ),
4042 Delete : schema .DefaultTimeout (4 * time .Minute ),
4143 },
4244
@@ -56,16 +58,15 @@ character, which cannot be a dash.`,
5658 "specific_reservation" : {
5759 Type : schema .TypeList ,
5860 Required : true ,
59- ForceNew : true ,
6061 Description : `Reservation for instances with specific machine shapes.` ,
6162 MaxItems : 1 ,
6263 Elem : & schema.Resource {
6364 Schema : map [string ]* schema.Schema {
6465 "count" : {
65- Type : schema .TypeInt ,
66- Required : true ,
67- ForceNew : true ,
68- Description : `The number of resources that are allocated.` ,
66+ Type : schema .TypeInt ,
67+ Required : true ,
68+ ValidateFunc : validation . IntAtLeast ( 1 ) ,
69+ Description : `The number of resources that are allocated.` ,
6970 },
7071 "instance_properties" : {
7172 Type : schema .TypeList ,
@@ -331,6 +332,55 @@ func resourceComputeReservationRead(d *schema.ResourceData, meta interface{}) er
331332 return nil
332333}
333334
335+ func resourceComputeReservationUpdate (d * schema.ResourceData , meta interface {}) error {
336+ config := meta .(* Config )
337+
338+ project , err := getProject (d , config )
339+ if err != nil {
340+ return err
341+ }
342+
343+ d .Partial (true )
344+
345+ if d .HasChange ("specific_reservation" ) {
346+ obj := make (map [string ]interface {})
347+
348+ specificReservationProp , err := expandComputeReservationSpecificReservation (d .Get ("specific_reservation" ), d , config )
349+ if err != nil {
350+ return err
351+ } else if v , ok := d .GetOkExists ("specific_reservation" ); ! isEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , specificReservationProp )) {
352+ obj ["specificReservation" ] = specificReservationProp
353+ }
354+
355+ obj , err = resourceComputeReservationUpdateEncoder (d , meta , obj )
356+ if err != nil {
357+ return err
358+ }
359+
360+ url , err := replaceVars (d , config , "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/reservations/{{name}}/resize" )
361+ if err != nil {
362+ return err
363+ }
364+ res , err := sendRequestWithTimeout (config , "POST" , project , url , obj , d .Timeout (schema .TimeoutUpdate ))
365+ if err != nil {
366+ return fmt .Errorf ("Error updating Reservation %q: %s" , d .Id (), err )
367+ }
368+
369+ err = computeOperationWaitTime (
370+ config , res , project , "Updating Reservation" ,
371+ int (d .Timeout (schema .TimeoutUpdate ).Minutes ()))
372+ if err != nil {
373+ return err
374+ }
375+
376+ d .SetPartial ("specific_reservation" )
377+ }
378+
379+ d .Partial (false )
380+
381+ return resourceComputeReservationRead (d , meta )
382+ }
383+
334384func resourceComputeReservationDelete (d * schema.ResourceData , meta interface {}) error {
335385 config := meta .(* Config )
336386
@@ -756,3 +806,10 @@ func expandComputeReservationZone(v interface{}, d TerraformResourceData, config
756806 }
757807 return f .RelativeLink (), nil
758808}
809+
810+ func resourceComputeReservationUpdateEncoder (d * schema.ResourceData , meta interface {}, obj map [string ]interface {}) (map [string ]interface {}, error ) {
811+ newObj := make (map [string ]interface {})
812+ newObj ["specificSkuCount" ] = obj ["specificReservation" ].(map [string ]interface {})["count" ]
813+
814+ return newObj , nil
815+ }
0 commit comments