From b96f373ee98262b7c49c2e4bf91041f3ec0c3a06 Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Thu, 25 Dec 2014 18:21:05 +0100 Subject: [PATCH] Fixing some logic issues with the aws-instance resource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. The schema contained a few fields that where not marked as `computed`, while they were updated inside the resource. 2. While updating the `volume_size` it was doing so with a `string`, but in the schema this field is set as `int`. 3. The set func for calculating the hashes for the `block` set items, also used computed values to calculate the hash. As these values will not be in the config, but only in the state, this will always show as a diff. The solution is to only use the fields that aren’t computed in order to get consistent hashes. These where all issues before, but weren’t visible as such. All should be good again now. --- builtin/providers/aws/resource_aws_instance.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/builtin/providers/aws/resource_aws_instance.go b/builtin/providers/aws/resource_aws_instance.go index 0f414158b..14bf045f9 100644 --- a/builtin/providers/aws/resource_aws_instance.go +++ b/builtin/providers/aws/resource_aws_instance.go @@ -6,6 +6,7 @@ import ( "encoding/hex" "fmt" "log" + "strconv" "strings" "time" @@ -153,18 +154,21 @@ func resourceAwsInstance() *schema.Resource { "snapshot_id": &schema.Schema{ Type: schema.TypeString, Optional: true, + Computed: true, ForceNew: true, }, "volume_type": &schema.Schema{ Type: schema.TypeString, Optional: true, + Computed: true, ForceNew: true, }, "volume_size": &schema.Schema{ Type: schema.TypeInt, Optional: true, + Computed: true, ForceNew: true, }, @@ -178,6 +182,7 @@ func resourceAwsInstance() *schema.Resource { "encrypted": &schema.Schema{ Type: schema.TypeBool, Optional: true, + Computed: true, ForceNew: true, }, }, @@ -385,11 +390,15 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error { bds := make([]map[string]interface{}, len(volResp.Volumes)) for i, vol := range volResp.Volumes { + volSize, err := strconv.Atoi(vol.Size) + if err != nil { + return err + } bds[i] = make(map[string]interface{}) bds[i]["device_name"] = bdByVolID[vol.VolumeId].DeviceName bds[i]["snapshot_id"] = vol.SnapshotId bds[i]["volume_type"] = vol.VolumeType - bds[i]["volume_size"] = vol.Size + bds[i]["volume_size"] = volSize bds[i]["delete_on_termination"] = bdByVolID[vol.VolumeId].DeleteOnTermination bds[i]["encrypted"] = vol.Encrypted } @@ -491,10 +500,7 @@ func resourceAwsInstanceBlockDevicesHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["device_name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["snapshot_id"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["volume_type"].(string))) - buf.WriteString(fmt.Sprintf("%d-", m["volume_size"].(int))) + buf.WriteString(fmt.Sprintf("%s-", m["virtual_name"].(string))) buf.WriteString(fmt.Sprintf("%t-", m["delete_on_termination"].(bool))) - buf.WriteString(fmt.Sprintf("%t-", m["encrypted"].(bool))) return hashcode.String(buf.String()) }