helper/schema: fix validating nested objects

When interpreting a nested object, we were validating against the "raw"
value, and not the interpolated value, causing incorrect errors.

This affects structures such as:

```tf
tags = "${list(map("foo", "bar"))}"
```

Prior to this, a complaint about "expected object, got string" since the
raw value is obviously a string, when the interpolated value is the
correct shape.
This commit is contained in:
Matt Robenolt 2017-05-24 01:04:25 -07:00
parent 76d4abd12a
commit b9a3433f6b
2 changed files with 28 additions and 1 deletions

View File

@ -1373,7 +1373,7 @@ func (m schemaMap) validateObject(
k string, k string,
schema map[string]*Schema, schema map[string]*Schema,
c *terraform.ResourceConfig) ([]string, []error) { c *terraform.ResourceConfig) ([]string, []error) {
raw, _ := c.GetRaw(k) raw, _ := c.Get(k)
if _, ok := raw.(map[string]interface{}); !ok { if _, ok := raw.(map[string]interface{}); !ok {
return nil, []error{fmt.Errorf( return nil, []error{fmt.Errorf(
"%s: expected object, got %s", "%s: expected object, got %s",

View File

@ -3947,6 +3947,33 @@ func TestSchemaMap_Validate(t *testing.T) {
Err: false, Err: false,
}, },
"Good sub-resource, interpolated value": {
Schema: map[string]*Schema{
"ingress": &Schema{
Type: TypeList,
Optional: true,
Elem: &Resource{
Schema: map[string]*Schema{
"from": &Schema{
Type: TypeInt,
Required: true,
},
},
},
},
},
Config: map[string]interface{}{
"ingress": []interface{}{
`${map("from", "80")}`,
},
},
Vars: map[string]string{},
Err: false,
},
"Invalid/unknown field": { "Invalid/unknown field": {
Schema: map[string]*Schema{ Schema: map[string]*Schema{
"availability_zone": &Schema{ "availability_zone": &Schema{