diff --git a/google/resource_compute_disk.go b/google/resource_compute_disk.go index a5178f33..f6af314e 100644 --- a/google/resource_compute_disk.go +++ b/google/resource_compute_disk.go @@ -299,6 +299,12 @@ func resourceComputeDisk() *schema.Resource { Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, + "physical_block_size_bytes": { + Type: schema.TypeInt, + Computed: true, + Optional: true, + ForceNew: true, + }, "size": { Type: schema.TypeInt, Computed: true, @@ -467,6 +473,12 @@ func resourceComputeDiskCreate(d *schema.ResourceData, meta interface{}) error { } else if v, ok := d.GetOkExists("size"); !isEmptyValue(reflect.ValueOf(sizeGbProp)) && (ok || !reflect.DeepEqual(v, sizeGbProp)) { obj["sizeGb"] = sizeGbProp } + physicalBlockSizeBytesProp, err := expandComputeDiskPhysicalBlockSizeBytes(d.Get("physical_block_size_bytes"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("physical_block_size_bytes"); !isEmptyValue(reflect.ValueOf(physicalBlockSizeBytesProp)) && (ok || !reflect.DeepEqual(v, physicalBlockSizeBytesProp)) { + obj["physicalBlockSizeBytes"] = physicalBlockSizeBytesProp + } typeProp, err := expandComputeDiskType(d.Get("type"), d, config) if err != nil { return err @@ -611,6 +623,9 @@ func resourceComputeDiskRead(d *schema.ResourceData, meta interface{}) error { if err := d.Set("users", flattenComputeDiskUsers(res["users"], d)); err != nil { return fmt.Errorf("Error reading Disk: %s", err) } + if err := d.Set("physical_block_size_bytes", flattenComputeDiskPhysicalBlockSizeBytes(res["physicalBlockSizeBytes"], d)); err != nil { + return fmt.Errorf("Error reading Disk: %s", err) + } if err := d.Set("type", flattenComputeDiskType(res["type"], d)); err != nil { return fmt.Errorf("Error reading Disk: %s", err) } @@ -893,6 +908,16 @@ func flattenComputeDiskUsers(v interface{}, d *schema.ResourceData) interface{} return convertAndMapStringArr(v.([]interface{}), ConvertSelfLinkToV1) } +func flattenComputeDiskPhysicalBlockSizeBytes(v interface{}, d *schema.ResourceData) interface{} { + // Handles the string fixed64 format + if strVal, ok := v.(string); ok { + if intVal, err := strconv.ParseInt(strVal, 10, 64); err == nil { + return intVal + } // let terraform core handle it if we can't convert the string to an int. + } + return v +} + func flattenComputeDiskType(v interface{}, d *schema.ResourceData) interface{} { if v == nil { return v @@ -1040,6 +1065,10 @@ func expandComputeDiskSize(v interface{}, d TerraformResourceData, config *Confi return v, nil } +func expandComputeDiskPhysicalBlockSizeBytes(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + func expandComputeDiskType(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { f, err := parseZonalFieldValue("diskTypes", v.(string), "project", "zone", d, config, true) if err != nil { diff --git a/google/resource_compute_disk_generated_test.go b/google/resource_compute_disk_generated_test.go index 0faea95e..49ff3bf8 100644 --- a/google/resource_compute_disk_generated_test.go +++ b/google/resource_compute_disk_generated_test.go @@ -58,6 +58,7 @@ resource "google_compute_disk" "default" { labels = { environment = "dev" } + physical_block_size_bytes = 4096 } `, context) } diff --git a/google/resource_compute_region_disk.go b/google/resource_compute_region_disk.go index a4979cf6..147be175 100644 --- a/google/resource_compute_region_disk.go +++ b/google/resource_compute_region_disk.go @@ -94,6 +94,12 @@ func resourceComputeRegionDisk() *schema.Resource { Optional: true, Elem: &schema.Schema{Type: schema.TypeString}, }, + "physical_block_size_bytes": { + Type: schema.TypeInt, + Computed: true, + Optional: true, + ForceNew: true, + }, "region": { Type: schema.TypeString, Computed: true, @@ -214,6 +220,12 @@ func resourceComputeRegionDiskCreate(d *schema.ResourceData, meta interface{}) e } else if v, ok := d.GetOkExists("size"); !isEmptyValue(reflect.ValueOf(sizeGbProp)) && (ok || !reflect.DeepEqual(v, sizeGbProp)) { obj["sizeGb"] = sizeGbProp } + physicalBlockSizeBytesProp, err := expandComputeRegionDiskPhysicalBlockSizeBytes(d.Get("physical_block_size_bytes"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("physical_block_size_bytes"); !isEmptyValue(reflect.ValueOf(physicalBlockSizeBytesProp)) && (ok || !reflect.DeepEqual(v, physicalBlockSizeBytesProp)) { + obj["physicalBlockSizeBytes"] = physicalBlockSizeBytesProp + } replicaZonesProp, err := expandComputeRegionDiskReplicaZones(d.Get("replica_zones"), d, config) if err != nil { return err @@ -352,6 +364,9 @@ func resourceComputeRegionDiskRead(d *schema.ResourceData, meta interface{}) err if err := d.Set("users", flattenComputeRegionDiskUsers(res["users"], d)); err != nil { return fmt.Errorf("Error reading RegionDisk: %s", err) } + if err := d.Set("physical_block_size_bytes", flattenComputeRegionDiskPhysicalBlockSizeBytes(res["physicalBlockSizeBytes"], d)); err != nil { + return fmt.Errorf("Error reading RegionDisk: %s", err) + } if err := d.Set("replica_zones", flattenComputeRegionDiskReplicaZones(res["replicaZones"], d)); err != nil { return fmt.Errorf("Error reading RegionDisk: %s", err) } @@ -628,6 +643,16 @@ func flattenComputeRegionDiskUsers(v interface{}, d *schema.ResourceData) interf return convertAndMapStringArr(v.([]interface{}), ConvertSelfLinkToV1) } +func flattenComputeRegionDiskPhysicalBlockSizeBytes(v interface{}, d *schema.ResourceData) interface{} { + // Handles the string fixed64 format + if strVal, ok := v.(string); ok { + if intVal, err := strconv.ParseInt(strVal, 10, 64); err == nil { + return intVal + } // let terraform core handle it if we can't convert the string to an int. + } + return v +} + func flattenComputeRegionDiskReplicaZones(v interface{}, d *schema.ResourceData) interface{} { if v == nil { return v @@ -733,6 +758,10 @@ func expandComputeRegionDiskSize(v interface{}, d TerraformResourceData, config return v, nil } +func expandComputeRegionDiskPhysicalBlockSizeBytes(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + func expandComputeRegionDiskReplicaZones(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { l := v.([]interface{}) req := make([]interface{}, 0, len(l)) diff --git a/google/resource_compute_region_disk_generated_test.go b/google/resource_compute_region_disk_generated_test.go index 9ba0cd50..db86cd07 100644 --- a/google/resource_compute_region_disk_generated_test.go +++ b/google/resource_compute_region_disk_generated_test.go @@ -55,6 +55,7 @@ resource "google_compute_region_disk" "regiondisk" { snapshot = "${google_compute_snapshot.snapdisk.self_link}" type = "pd-ssd" region = "us-central1" + physical_block_size_bytes = 4096 replica_zones = ["us-central1-a", "us-central1-f"] } diff --git a/website/docs/r/compute_disk.html.markdown b/website/docs/r/compute_disk.html.markdown index f49e1ccd..d6604c1b 100644 --- a/website/docs/r/compute_disk.html.markdown +++ b/website/docs/r/compute_disk.html.markdown @@ -66,6 +66,7 @@ resource "google_compute_disk" "default" { labels = { environment = "dev" } + physical_block_size_bytes = 4096 } ``` @@ -107,6 +108,14 @@ The following arguments are supported: the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot. +* `physical_block_size_bytes` - + (Optional) + Physical block size of the persistent disk, in bytes. If not present + in a request, a default value is used. Currently supported sizes + are 4096 and 16384, other sizes may be added in the future. + If an unsupported value is requested, the error message will list + the supported values for the caller's project. + * `type` - (Optional) URL of the disk type resource describing which disk type to use to diff --git a/website/docs/r/compute_region_disk.html.markdown b/website/docs/r/compute_region_disk.html.markdown index 52e1a06a..382d90d5 100644 --- a/website/docs/r/compute_region_disk.html.markdown +++ b/website/docs/r/compute_region_disk.html.markdown @@ -63,6 +63,7 @@ resource "google_compute_region_disk" "regiondisk" { snapshot = "${google_compute_snapshot.snapdisk.self_link}" type = "pd-ssd" region = "us-central1" + physical_block_size_bytes = 4096 replica_zones = ["us-central1-a", "us-central1-f"] } @@ -124,6 +125,14 @@ The following arguments are supported: the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot. +* `physical_block_size_bytes` - + (Optional) + Physical block size of the persistent disk, in bytes. If not present + in a request, a default value is used. Currently supported sizes + are 4096 and 16384, other sizes may be added in the future. + If an unsupported value is requested, the error message will list + the supported values for the caller's project. + * `type` - (Optional) URL of the disk type resource describing which disk type to use to