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.
This commit is contained in:
Dana Hoffman 2018-07-10 17:10:05 -07:00 committed by GitHub
parent bbed86dd0b
commit a6198a0b60
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 14 deletions

View File

@ -1,6 +1,7 @@
package google package google
import ( import (
computeBeta "google.golang.org/api/compute/v0.beta"
"google.golang.org/api/compute/v1" "google.golang.org/api/compute/v1"
) )
@ -13,3 +14,13 @@ func readDiskType(c *Config, zone *compute.Zone, project, name string) (*compute
return nil, err 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
}
}

View File

@ -46,6 +46,10 @@ func ParseDiskFieldValue(disk string, d TerraformResourceData, config *Config) (
return parseZonalFieldValue("disks", disk, "project", "zone", d, config, false) 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) { func ParseOrganizationCustomRoleName(role string) (*OrganizationFieldValue, error) {
return parseOrganizationFieldValue("roles", role, false) return parseOrganizationFieldValue("roles", role, false)
} }

View File

@ -251,7 +251,7 @@ func resourceComputeInstance() *schema.Resource {
"source": &schema.Schema{ "source": &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,
Required: true, Required: true,
DiffSuppressFunc: linkDiffSuppress, DiffSuppressFunc: compareSelfLinkOrResourceName,
}, },
"device_name": &schema.Schema{ "device_name": &schema.Schema{
@ -863,11 +863,22 @@ func resourceComputeInstanceRead(d *schema.ResourceData, meta interface{}) error
continue continue
} }
disk := v.(map[string]interface{}) disk := v.(map[string]interface{})
source, err := ParseDiskFieldValue(disk["source"].(string), d, config) s := disk["source"].(string)
if err != nil { var sourceLink string
return err 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)) 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" { } else if disk.Type == "SCRATCH" {
scratchDisks = append(scratchDisks, flattenScratchDisk(disk)) scratchDisks = append(scratchDisks, flattenScratchDisk(disk))
} else { } else {
source, err := ParseDiskFieldValue(disk.Source, d, config) var sourceLink string
if err != nil { if strings.Contains(disk.Source, "regions/") {
return err 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{}{ di := map[string]interface{}{
"source": ConvertSelfLinkToV1(disk.Source), "source": ConvertSelfLinkToV1(disk.Source),
"device_name": disk.DeviceName, "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) { func expandAttachedDisk(diskConfig map[string]interface{}, d *schema.ResourceData, meta interface{}) (*computeBeta.AttachedDisk, error) {
config := meta.(*Config) config := meta.(*Config)
source, err := ParseDiskFieldValue(diskConfig["source"].(string), d, config) s := diskConfig["source"].(string)
if err != nil { var sourceLink string
return nil, err 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{ disk := &computeBeta.AttachedDisk{
Source: source.RelativeLink(), Source: sourceLink,
} }
if v, ok := diskConfig["mode"]; ok { if v, ok := diskConfig["mode"]; ok {

View File

@ -206,7 +206,8 @@ The `disk` block supports:
read-write mode. read-write mode.
* `source` - (Required if source_image not set) The name of the disk (such as * `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"`, * `disk_type` - (Optional) The GCE disk type. Can be either `"pd-ssd"`,
`"local-ssd"`, or `"pd-standard"`. `"local-ssd"`, or `"pd-standard"`.