Skip to content

Commit 0f57f4e

Browse files
Add access mode to compute region disk (#14358) (#23409)
[upstream:dd465f27fbe6d8e1ea70cd968afee7de13c8a565] Signed-off-by: Modular Magician <[email protected]>
1 parent ebab195 commit 0f57f4e

7 files changed

+150
-8
lines changed

.changelog/14358.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: added `access_mode` field to `google_compute_region_disk` resource
3+
```

google/services/compute/resource_compute_disk.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,11 +385,12 @@ character, which cannot be a dash.`,
385385
Type: schema.TypeString,
386386
Computed: true,
387387
Optional: true,
388-
Description: `The accessMode of the disk.
388+
Description: `The access mode of the disk.
389389
For example:
390-
* READ_WRITE_SINGLE
391-
* READ_WRITE_MANY
392-
* READ_ONLY_SINGLE`,
390+
* READ_WRITE_SINGLE: The default AccessMode, means the disk can be attached to single instance in RW mode.
391+
* READ_WRITE_MANY: The AccessMode means the disk can be attached to multiple instances in RW mode.
392+
* READ_ONLY_SINGLE: The AccessMode means the disk can be attached to multiple instances in RO mode.
393+
The AccessMode is only valid for Hyperdisk disk types.`,
393394
},
394395
"architecture": {
395396
Type: schema.TypeString,

google/services/compute/resource_compute_region_disk.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ character, which cannot be a dash.`,
8686
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
8787
},
8888
},
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+
},
89100
"async_primary_disk": {
90101
Type: schema.TypeList,
91102
Optional: true,
@@ -482,6 +493,12 @@ func resourceComputeRegionDiskCreate(d *schema.ResourceData, meta interface{}) e
482493
} else if v, ok := d.GetOkExists("licenses"); !tpgresource.IsEmptyValue(reflect.ValueOf(licensesProp)) && (ok || !reflect.DeepEqual(v, licensesProp)) {
483494
obj["licenses"] = licensesProp
484495
}
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+
}
485502
labelsProp, err := expandComputeRegionDiskEffectiveLabels(d.Get("effective_labels"), d, config)
486503
if err != nil {
487504
return err
@@ -685,6 +702,9 @@ func resourceComputeRegionDiskRead(d *schema.ResourceData, meta interface{}) err
685702
if err := d.Set("licenses", flattenComputeRegionDiskLicenses(res["licenses"], d, config)); err != nil {
686703
return fmt.Errorf("Error reading RegionDisk: %s", err)
687704
}
705+
if err := d.Set("access_mode", flattenComputeRegionDiskAccessMode(res["accessMode"], d, config)); err != nil {
706+
return fmt.Errorf("Error reading RegionDisk: %s", err)
707+
}
688708
if err := d.Set("terraform_labels", flattenComputeRegionDiskTerraformLabels(res["labels"], d, config)); err != nil {
689709
return fmt.Errorf("Error reading RegionDisk: %s", err)
690710
}
@@ -817,6 +837,51 @@ func resourceComputeRegionDiskUpdate(d *schema.ResourceData, meta interface{}) e
817837
return err
818838
}
819839
}
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+
}
820885

821886
d.Partial(false)
822887

@@ -1270,6 +1335,10 @@ func flattenComputeRegionDiskLicenses(v interface{}, d *schema.ResourceData, con
12701335
return tpgresource.ConvertAndMapStringArr(v.([]interface{}), tpgresource.ConvertSelfLinkToV1)
12711336
}
12721337

1338+
func flattenComputeRegionDiskAccessMode(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1339+
return v
1340+
}
1341+
12731342
func flattenComputeRegionDiskTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
12741343
if v == nil {
12751344
return v
@@ -1507,6 +1576,10 @@ func expandComputeRegionDiskLicenses(v interface{}, d tpgresource.TerraformResou
15071576
return req, nil
15081577
}
15091578

1579+
func expandComputeRegionDiskAccessMode(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1580+
return v, nil
1581+
}
1582+
15101583
func expandComputeRegionDiskEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
15111584
if v == nil {
15121585
return map[string]string{}, nil

google/services/compute/resource_compute_region_disk_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ api_service_name: 'compute.googleapis.com'
55
api_version: 'v1'
66
api_resource_type_kind: 'Disk'
77
fields:
8+
- field: 'access_mode'
89
- field: 'async_primary_disk.disk'
910
- field: 'create_snapshot_before_destroy'
1011
provider_only: true

google/services/compute/resource_compute_region_disk_generated_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,43 @@ resource "google_compute_region_disk" "regiondisk" {
186186
`, context)
187187
}
188188

189+
func TestAccComputeRegionDisk_regionDiskHyperdiskBalancedHaWriteManyExample(t *testing.T) {
190+
t.Parallel()
191+
192+
context := map[string]interface{}{
193+
"random_suffix": acctest.RandString(t, 10),
194+
}
195+
196+
acctest.VcrTest(t, resource.TestCase{
197+
PreCheck: func() { acctest.AccTestPreCheck(t) },
198+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
199+
CheckDestroy: testAccCheckComputeRegionDiskDestroyProducer(t),
200+
Steps: []resource.TestStep{
201+
{
202+
Config: testAccComputeRegionDisk_regionDiskHyperdiskBalancedHaWriteManyExample(context),
203+
},
204+
{
205+
ResourceName: "google_compute_region_disk.primary",
206+
ImportState: true,
207+
ImportStateVerify: true,
208+
ImportStateVerifyIgnore: []string{"labels", "region", "snapshot", "terraform_labels", "type"},
209+
},
210+
},
211+
})
212+
}
213+
214+
func testAccComputeRegionDisk_regionDiskHyperdiskBalancedHaWriteManyExample(context map[string]interface{}) string {
215+
return acctest.Nprintf(`
216+
resource "google_compute_region_disk" "primary" {
217+
name = "tf-test-my-region-hyperdisk%{random_suffix}"
218+
type = "hyperdisk-balanced-high-availability"
219+
region = "us-central1"
220+
replica_zones = ["us-central1-a", "us-central1-f"]
221+
access_mode = "READ_WRITE_MANY"
222+
}
223+
`, context)
224+
}
225+
189226
func testAccCheckComputeRegionDiskDestroyProducer(t *testing.T) func(s *terraform.State) error {
190227
return func(s *terraform.State) error {
191228
for name, rs := range s.RootModule().Resources {

website/docs/r/compute_disk.html.markdown

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -327,11 +327,12 @@ The following arguments are supported:
327327

328328
* `access_mode` -
329329
(Optional)
330-
The accessMode of the disk.
330+
The access mode of the disk.
331331
For example:
332-
* READ_WRITE_SINGLE
333-
* READ_WRITE_MANY
334-
* READ_ONLY_SINGLE
332+
* READ_WRITE_SINGLE: The default AccessMode, means the disk can be attached to single instance in RW mode.
333+
* READ_WRITE_MANY: The AccessMode means the disk can be attached to multiple instances in RW mode.
334+
* READ_ONLY_SINGLE: The AccessMode means the disk can be attached to multiple instances in RO mode.
335+
The AccessMode is only valid for Hyperdisk disk types.
335336

336337
* `zone` -
337338
(Optional)

website/docs/r/compute_region_disk.html.markdown

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,23 @@ resource "google_compute_region_disk" "regiondisk" {
145145
replica_zones = ["us-central1-a", "us-central1-f"]
146146
}
147147
```
148+
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
149+
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=region_disk_hyperdisk_balanced_ha_write_many&open_in_editor=main.tf" target="_blank">
150+
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
151+
</a>
152+
</div>
153+
## Example Usage - Region Disk Hyperdisk Balanced Ha Write Many
154+
155+
156+
```hcl
157+
resource "google_compute_region_disk" "primary" {
158+
name = "my-region-hyperdisk"
159+
type = "hyperdisk-balanced-high-availability"
160+
region = "us-central1"
161+
replica_zones = ["us-central1-a", "us-central1-f"]
162+
access_mode = "READ_WRITE_MANY"
163+
}
164+
```
148165

149166
## Argument Reference
150167

@@ -256,6 +273,15 @@ The following arguments are supported:
256273
(Optional)
257274
Any applicable license URI.
258275

276+
* `access_mode` -
277+
(Optional)
278+
The access mode of the disk.
279+
For example:
280+
* READ_WRITE_SINGLE: The default AccessMode, means the disk can be attached to single instance in RW mode.
281+
* READ_WRITE_MANY: The AccessMode means the disk can be attached to multiple instances in RW mode.
282+
* READ_ONLY_SINGLE: The AccessMode means the disk can be attached to multiple instances in RO mode.
283+
The AccessMode is only valid for Hyperdisk disk types.
284+
259285
* `region` -
260286
(Optional)
261287
A reference to the region where the disk resides.

0 commit comments

Comments
 (0)