From 730014b33ebc6c690219f8d70e9535e54c51daae Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 17 Nov 2016 14:34:18 -0500 Subject: [PATCH] Convert the map fields values when reading diff Convert the value to the correct type when reading a diff and the map schema has an primitive Elem type. --- helper/schema/field_reader_diff.go | 21 ++++++++++++++++++++- helper/schema/resource_data_test.go | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/helper/schema/field_reader_diff.go b/helper/schema/field_reader_diff.go index 7a072fc0e9..807abfdc23 100644 --- a/helper/schema/field_reader_diff.go +++ b/helper/schema/field_reader_diff.go @@ -69,6 +69,12 @@ func (r *DiffFieldReader) readMap( resultSet = true } + // Determine what element type the map contains, defaulting to string + elemType := TypeString + if et, ok := schema.Elem.(ValueType); ok { + elemType = et + } + // Next, read all the elements we have in our diff, and apply // the diff to our result. prefix := strings.Join(address, ".") + "." @@ -89,7 +95,20 @@ func (r *DiffFieldReader) readMap( continue } - result[k] = v.New + // Replace the new value with one of the correct Elem type if needed. + // We don't supported arbitrarily nested schemas, so we can only handle + // the primitive types here. + var vNew interface{} = v.New + switch elemType { + case TypeBool, TypeInt, TypeFloat: + v, err := stringToPrimitive(v.New, false, &Schema{Type: elemType}) + if err != nil { + return FieldReadResult{}, err + } + vNew = v + } + + result[k] = vNew } var resultVal interface{} diff --git a/helper/schema/resource_data_test.go b/helper/schema/resource_data_test.go index c154e403fd..40646dd7da 100644 --- a/helper/schema/resource_data_test.go +++ b/helper/schema/resource_data_test.go @@ -2983,7 +2983,7 @@ func TestResourceData_nonStringValuesInMap(t *testing.T) { }, "boolMap.boolField": &terraform.ResourceAttrDiff{ Old: "", - New: "1", + New: "true", }, }, }, @@ -2995,7 +2995,7 @@ func TestResourceData_nonStringValuesInMap(t *testing.T) { Schema: map[string]*Schema{ "intMap": &Schema{ Type: TypeMap, - Elem: TypeBool, + Elem: TypeInt, Optional: true, }, },