From b94881b4238b17e1f3927fc95b9fe06ec4d38663 Mon Sep 17 00:00:00 2001 From: Paddy Carver Date: Tue, 21 Aug 2018 18:25:31 -0700 Subject: [PATCH] Always set instance template source images on read. Previously, we were only setting source images for the disks in instance templates if they weren't set in the config. Instead, let's just always set them. This fixes our test failures about self_links not matching names. Also, relative links are safer than just image names, as Terraform wouldn't notice if another project's image of the same name got used instead of your project's. Also fix the setting of tags and tag fingerprints to always set, even if to the empty value, to fix the tests. --- google/resource_compute_instance_template.go | 35 +++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/google/resource_compute_instance_template.go b/google/resource_compute_instance_template.go index c21194db..e30c6068 100644 --- a/google/resource_compute_instance_template.go +++ b/google/resource_compute_instance_template.go @@ -3,6 +3,7 @@ package google import ( "fmt" + "github.com/hashicorp/errwrap" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/validation" @@ -98,9 +99,10 @@ func resourceComputeInstanceTemplate() *schema.Resource { }, "source_image": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - ForceNew: true, + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: compareSelfLinkRelativePaths, + ForceNew: true, }, "interface": &schema.Schema{ @@ -630,17 +632,16 @@ func resourceComputeInstanceTemplateCreate(d *schema.ResourceData, meta interfac return resourceComputeInstanceTemplateRead(d, meta) } -func flattenDisks(disks []*computeBeta.AttachedDisk, d *schema.ResourceData) []map[string]interface{} { +func flattenDisks(disks []*computeBeta.AttachedDisk, d *schema.ResourceData) ([]map[string]interface{}, error) { result := make([]map[string]interface{}, 0, len(disks)) - for i, disk := range disks { + for _, disk := range disks { diskMap := make(map[string]interface{}) if disk.InitializeParams != nil { - var source_img = fmt.Sprintf("disk.%d.source_image", i) - if d.Get(source_img) == nil || d.Get(source_img) == "" { - diskMap["source_image"] = GetResourceNameFromSelfLink(disk.InitializeParams.SourceImage) - } else { - diskMap["source_image"] = d.Get(source_img) + path, err := getRelativePath(disk.InitializeParams.SourceImage) + if err != nil { + return nil, errwrap.Wrapf("Error getting relative path for source image: {{err}}", err) } + diskMap["source_image"] = path diskMap["disk_type"] = disk.InitializeParams.DiskType diskMap["disk_name"] = disk.InitializeParams.DiskName diskMap["disk_size_gb"] = disk.InitializeParams.DiskSizeGb @@ -654,7 +655,7 @@ func flattenDisks(disks []*computeBeta.AttachedDisk, d *schema.ResourceData) []m diskMap["type"] = disk.Type result = append(result, diskMap) } - return result + return result, nil } func resourceComputeInstanceTemplateRead(d *schema.ResourceData, meta interface{}) error { @@ -695,6 +696,8 @@ func resourceComputeInstanceTemplateRead(d *schema.ResourceData, meta interface{ if err = d.Set("tags_fingerprint", instanceTemplate.Properties.Tags.Fingerprint); err != nil { return fmt.Errorf("Error setting tags_fingerprint: %s", err) } + } else { + d.Set("tags_fingerprint", "") } if instanceTemplate.Properties.Labels != nil { d.Set("labels", instanceTemplate.Properties.Labels) @@ -706,7 +709,11 @@ func resourceComputeInstanceTemplateRead(d *schema.ResourceData, meta interface{ return fmt.Errorf("Error setting name: %s", err) } if instanceTemplate.Properties.Disks != nil { - if err = d.Set("disk", flattenDisks(instanceTemplate.Properties.Disks, d)); err != nil { + disks, err := flattenDisks(instanceTemplate.Properties.Disks, d) + if err != nil { + return fmt.Errorf("error flattening disks: %s", err) + } + if err = d.Set("disk", disks); err != nil { return fmt.Errorf("Error setting disk: %s", err) } } @@ -755,6 +762,10 @@ func resourceComputeInstanceTemplateRead(d *schema.ResourceData, meta interface{ if err = d.Set("tags", instanceTemplate.Properties.Tags.Items); err != nil { return fmt.Errorf("Error setting tags: %s", err) } + } else { + if err = d.Set("tags", nil); err != nil { + return fmt.Errorf("Error setting empty tags: %s", err) + } } if instanceTemplate.Properties.ServiceAccounts != nil { if err = d.Set("service_account", flattenServiceAccounts(instanceTemplate.Properties.ServiceAccounts)); err != nil {