From a6198a0b604784388ad9183d7ca0a6953e2877cf Mon Sep 17 00:00:00 2001 From: Dana Hoffman Date: Tue, 10 Jul 2018 17:10:05 -0700 Subject: [PATCH] prereqs for regional disks (#1753) In testing an upcoming `google_compute_region_disk` resource, I had to make these changes. Checking them in separately so that when the magician runs, these changes will already be a part of TF. --- google/disk_type.go | 11 ++++ google/field_helpers.go | 4 ++ google/resource_compute_instance.go | 58 ++++++++++++++----- .../r/compute_instance_template.html.markdown | 3 +- 4 files changed, 62 insertions(+), 14 deletions(-) diff --git a/google/disk_type.go b/google/disk_type.go index 668c680a..c989adb2 100644 --- a/google/disk_type.go +++ b/google/disk_type.go @@ -1,6 +1,7 @@ package google import ( + computeBeta "google.golang.org/api/compute/v0.beta" "google.golang.org/api/compute/v1" ) @@ -13,3 +14,13 @@ func readDiskType(c *Config, zone *compute.Zone, project, name string) (*compute return nil, err } } + +// readRegionDiskType finds the disk type with the given name. +func readRegionDiskType(c *Config, region *compute.Region, project, name string) (*computeBeta.DiskType, error) { + diskType, err := c.clientComputeBeta.RegionDiskTypes.Get(project, region.Name, name).Do() + if err == nil && diskType != nil && diskType.SelfLink != "" { + return diskType, nil + } else { + return nil, err + } +} diff --git a/google/field_helpers.go b/google/field_helpers.go index 4307c0f0..06ea3ff1 100644 --- a/google/field_helpers.go +++ b/google/field_helpers.go @@ -46,6 +46,10 @@ func ParseDiskFieldValue(disk string, d TerraformResourceData, config *Config) ( return parseZonalFieldValue("disks", disk, "project", "zone", d, config, false) } +func ParseRegionDiskFieldValue(disk string, d TerraformResourceData, config *Config) (*RegionalFieldValue, error) { + return parseRegionalFieldValue("disks", disk, "project", "region", "zone", d, config, false) +} + func ParseOrganizationCustomRoleName(role string) (*OrganizationFieldValue, error) { return parseOrganizationFieldValue("roles", role, false) } diff --git a/google/resource_compute_instance.go b/google/resource_compute_instance.go index 3efd064f..3ed086b0 100644 --- a/google/resource_compute_instance.go +++ b/google/resource_compute_instance.go @@ -251,7 +251,7 @@ func resourceComputeInstance() *schema.Resource { "source": &schema.Schema{ Type: schema.TypeString, Required: true, - DiffSuppressFunc: linkDiffSuppress, + DiffSuppressFunc: compareSelfLinkOrResourceName, }, "device_name": &schema.Schema{ @@ -863,11 +863,22 @@ func resourceComputeInstanceRead(d *schema.ResourceData, meta interface{}) error continue } disk := v.(map[string]interface{}) - source, err := ParseDiskFieldValue(disk["source"].(string), d, config) - if err != nil { - return err + s := disk["source"].(string) + var sourceLink string + if strings.Contains(s, "regions/") { + source, err := ParseRegionDiskFieldValue(disk["source"].(string), d, config) + if err != nil { + return err + } + sourceLink = source.RelativeLink() + } else { + source, err := ParseDiskFieldValue(disk["source"].(string), d, config) + if err != nil { + return err + } + sourceLink = source.RelativeLink() } - attachedDiskSources[source.RelativeLink()] = i + attachedDiskSources[sourceLink] = i } attachedDisks := make([]map[string]interface{}, d.Get("attached_disk.#").(int)) @@ -878,11 +889,21 @@ func resourceComputeInstanceRead(d *schema.ResourceData, meta interface{}) error } else if disk.Type == "SCRATCH" { scratchDisks = append(scratchDisks, flattenScratchDisk(disk)) } else { - source, err := ParseDiskFieldValue(disk.Source, d, config) - if err != nil { - return err + var sourceLink string + if strings.Contains(disk.Source, "regions/") { + source, err := ParseRegionDiskFieldValue(disk.Source, d, config) + if err != nil { + return err + } + sourceLink = source.RelativeLink() + } else { + source, err := ParseDiskFieldValue(disk.Source, d, config) + if err != nil { + return err + } + sourceLink = source.RelativeLink() } - adIndex, inConfig := attachedDiskSources[source.RelativeLink()] + adIndex, inConfig := attachedDiskSources[sourceLink] di := map[string]interface{}{ "source": ConvertSelfLinkToV1(disk.Source), "device_name": disk.DeviceName, @@ -1408,13 +1429,24 @@ func resourceComputeInstanceUpdate(d *schema.ResourceData, meta interface{}) err func expandAttachedDisk(diskConfig map[string]interface{}, d *schema.ResourceData, meta interface{}) (*computeBeta.AttachedDisk, error) { config := meta.(*Config) - source, err := ParseDiskFieldValue(diskConfig["source"].(string), d, config) - if err != nil { - return nil, err + s := diskConfig["source"].(string) + var sourceLink string + if strings.Contains(s, "regions/") { + source, err := ParseRegionDiskFieldValue(s, d, config) + if err != nil { + return nil, err + } + sourceLink = source.RelativeLink() + } else { + source, err := ParseDiskFieldValue(s, d, config) + if err != nil { + return nil, err + } + sourceLink = source.RelativeLink() } disk := &computeBeta.AttachedDisk{ - Source: source.RelativeLink(), + Source: sourceLink, } if v, ok := diskConfig["mode"]; ok { diff --git a/website/docs/r/compute_instance_template.html.markdown b/website/docs/r/compute_instance_template.html.markdown index ca2e7601..ef50d420 100644 --- a/website/docs/r/compute_instance_template.html.markdown +++ b/website/docs/r/compute_instance_template.html.markdown @@ -206,7 +206,8 @@ The `disk` block supports: read-write mode. * `source` - (Required if source_image not set) The name of the disk (such as - those managed by `google_compute_disk`) to attach. + those managed by `google_compute_disk`) to attach. This cannot be a regional + disk. * `disk_type` - (Optional) The GCE disk type. Can be either `"pd-ssd"`, `"local-ssd"`, or `"pd-standard"`.