@@ -86,6 +86,17 @@ character, which cannot be a dash.`,
86
86
DiffSuppressFunc : tpgresource .CompareSelfLinkOrResourceName ,
87
87
},
88
88
},
89
+ "access_mode" : {
90
+ Type : schema .TypeString ,
91
+ Computed : true ,
92
+ Optional : true ,
93
+ Description : `The access mode of the disk.
94
+ For example:
95
+ * READ_WRITE_SINGLE: The default AccessMode, means the disk can be attached to single instance in RW mode.
96
+ * READ_WRITE_MANY: The AccessMode means the disk can be attached to multiple instances in RW mode.
97
+ * READ_ONLY_SINGLE: The AccessMode means the disk can be attached to multiple instances in RO mode.
98
+ The AccessMode is only valid for Hyperdisk disk types.` ,
99
+ },
89
100
"async_primary_disk" : {
90
101
Type : schema .TypeList ,
91
102
Optional : true ,
@@ -482,6 +493,12 @@ func resourceComputeRegionDiskCreate(d *schema.ResourceData, meta interface{}) e
482
493
} else if v , ok := d .GetOkExists ("licenses" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (licensesProp )) && (ok || ! reflect .DeepEqual (v , licensesProp )) {
483
494
obj ["licenses" ] = licensesProp
484
495
}
496
+ accessModeProp , err := expandComputeRegionDiskAccessMode (d .Get ("access_mode" ), d , config )
497
+ if err != nil {
498
+ return err
499
+ } else if v , ok := d .GetOkExists ("access_mode" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (accessModeProp )) && (ok || ! reflect .DeepEqual (v , accessModeProp )) {
500
+ obj ["accessMode" ] = accessModeProp
501
+ }
485
502
labelsProp , err := expandComputeRegionDiskEffectiveLabels (d .Get ("effective_labels" ), d , config )
486
503
if err != nil {
487
504
return err
@@ -685,6 +702,9 @@ func resourceComputeRegionDiskRead(d *schema.ResourceData, meta interface{}) err
685
702
if err := d .Set ("licenses" , flattenComputeRegionDiskLicenses (res ["licenses" ], d , config )); err != nil {
686
703
return fmt .Errorf ("Error reading RegionDisk: %s" , err )
687
704
}
705
+ if err := d .Set ("access_mode" , flattenComputeRegionDiskAccessMode (res ["accessMode" ], d , config )); err != nil {
706
+ return fmt .Errorf ("Error reading RegionDisk: %s" , err )
707
+ }
688
708
if err := d .Set ("terraform_labels" , flattenComputeRegionDiskTerraformLabels (res ["labels" ], d , config )); err != nil {
689
709
return fmt .Errorf ("Error reading RegionDisk: %s" , err )
690
710
}
@@ -817,6 +837,51 @@ func resourceComputeRegionDiskUpdate(d *schema.ResourceData, meta interface{}) e
817
837
return err
818
838
}
819
839
}
840
+ if d .HasChange ("access_mode" ) {
841
+ obj := make (map [string ]interface {})
842
+
843
+ accessModeProp , err := expandComputeRegionDiskAccessMode (d .Get ("access_mode" ), d , config )
844
+ if err != nil {
845
+ return err
846
+ } else if v , ok := d .GetOkExists ("access_mode" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , accessModeProp )) {
847
+ obj ["accessMode" ] = accessModeProp
848
+ }
849
+
850
+ url , err := tpgresource .ReplaceVars (d , config , "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/disks/{{name}}?paths=accessMode" )
851
+ if err != nil {
852
+ return err
853
+ }
854
+
855
+ headers := make (http.Header )
856
+
857
+ // err == nil indicates that the billing_project value was found
858
+ if bp , err := tpgresource .GetBillingProject (d , config ); err == nil {
859
+ billingProject = bp
860
+ }
861
+
862
+ res , err := transport_tpg .SendRequest (transport_tpg.SendRequestOptions {
863
+ Config : config ,
864
+ Method : "PATCH" ,
865
+ Project : billingProject ,
866
+ RawURL : url ,
867
+ UserAgent : userAgent ,
868
+ Body : obj ,
869
+ Timeout : d .Timeout (schema .TimeoutUpdate ),
870
+ Headers : headers ,
871
+ })
872
+ if err != nil {
873
+ return fmt .Errorf ("Error updating RegionDisk %q: %s" , d .Id (), err )
874
+ } else {
875
+ log .Printf ("[DEBUG] Finished updating RegionDisk %q: %#v" , d .Id (), res )
876
+ }
877
+
878
+ err = ComputeOperationWaitTime (
879
+ config , res , project , "Updating RegionDisk" , userAgent ,
880
+ d .Timeout (schema .TimeoutUpdate ))
881
+ if err != nil {
882
+ return err
883
+ }
884
+ }
820
885
821
886
d .Partial (false )
822
887
@@ -1270,6 +1335,10 @@ func flattenComputeRegionDiskLicenses(v interface{}, d *schema.ResourceData, con
1270
1335
return tpgresource .ConvertAndMapStringArr (v .([]interface {}), tpgresource .ConvertSelfLinkToV1 )
1271
1336
}
1272
1337
1338
+ func flattenComputeRegionDiskAccessMode (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1339
+ return v
1340
+ }
1341
+
1273
1342
func flattenComputeRegionDiskTerraformLabels (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
1274
1343
if v == nil {
1275
1344
return v
@@ -1507,6 +1576,10 @@ func expandComputeRegionDiskLicenses(v interface{}, d tpgresource.TerraformResou
1507
1576
return req , nil
1508
1577
}
1509
1578
1579
+ func expandComputeRegionDiskAccessMode (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
1580
+ return v , nil
1581
+ }
1582
+
1510
1583
func expandComputeRegionDiskEffectiveLabels (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (map [string ]string , error ) {
1511
1584
if v == nil {
1512
1585
return map [string ]string {}, nil
0 commit comments