Merge pull request #22478 from hashicorp/jbardin/coerce-value

don't validate Min/Max block vals in CoerceValue
This commit is contained in:
James Bardin 2019-08-16 15:58:53 -04:00 committed by GitHub
commit 3e03213485
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 2 additions and 50 deletions

View File

@ -114,14 +114,6 @@ func (b *Block) coerceValue(in cty.Value, path cty.Path) (cty.Value, error) {
} }
l := coll.LengthInt() l := coll.LengthInt()
// Assume that if there are unknowns this could have come from
// a dynamic block, and we can't validate MinItems yet.
if l < blockS.MinItems && coll.IsWhollyKnown() {
return cty.UnknownVal(b.ImpliedType()), path.NewErrorf("insufficient items for attribute %q; must have at least %d", typeName, blockS.MinItems)
}
if l > blockS.MaxItems && blockS.MaxItems > 0 {
return cty.UnknownVal(b.ImpliedType()), path.NewErrorf("too many items for attribute %q; cannot have more than %d", typeName, blockS.MaxItems)
}
if l == 0 { if l == 0 {
attrs[typeName] = cty.ListValEmpty(blockS.ImpliedType()) attrs[typeName] = cty.ListValEmpty(blockS.ImpliedType())
continue continue
@ -140,10 +132,8 @@ func (b *Block) coerceValue(in cty.Value, path cty.Path) (cty.Value, error) {
} }
} }
attrs[typeName] = cty.ListVal(elems) attrs[typeName] = cty.ListVal(elems)
case blockS.MinItems == 0:
attrs[typeName] = cty.ListValEmpty(blockS.ImpliedType())
default: default:
return cty.UnknownVal(b.ImpliedType()), path.NewErrorf("attribute %q is required", typeName) attrs[typeName] = cty.ListValEmpty(blockS.ImpliedType())
} }
case NestingSet: case NestingSet:
@ -165,14 +155,6 @@ func (b *Block) coerceValue(in cty.Value, path cty.Path) (cty.Value, error) {
} }
l := coll.LengthInt() l := coll.LengthInt()
// Assume that if there are unknowns this could have come from
// a dynamic block, and we can't validate MinItems yet.
if l < blockS.MinItems && coll.IsWhollyKnown() {
return cty.UnknownVal(b.ImpliedType()), path.NewErrorf("insufficient items for attribute %q; must have at least %d", typeName, blockS.MinItems)
}
if l > blockS.MaxItems && blockS.MaxItems > 0 {
return cty.UnknownVal(b.ImpliedType()), path.NewErrorf("too many items for attribute %q; cannot have more than %d", typeName, blockS.MaxItems)
}
if l == 0 { if l == 0 {
attrs[typeName] = cty.SetValEmpty(blockS.ImpliedType()) attrs[typeName] = cty.SetValEmpty(blockS.ImpliedType())
continue continue
@ -191,10 +173,8 @@ func (b *Block) coerceValue(in cty.Value, path cty.Path) (cty.Value, error) {
} }
} }
attrs[typeName] = cty.SetVal(elems) attrs[typeName] = cty.SetVal(elems)
case blockS.MinItems == 0:
attrs[typeName] = cty.SetValEmpty(blockS.ImpliedType())
default: default:
return cty.UnknownVal(b.ImpliedType()), path.NewErrorf("attribute %q is required", typeName) attrs[typeName] = cty.SetValEmpty(blockS.ImpliedType())
} }
case NestingMap: case NestingMap:

View File

@ -291,34 +291,6 @@ func TestCoerceValue(t *testing.T) {
cty.DynamicVal, cty.DynamicVal,
`attribute "foo" is required`, `attribute "foo" is required`,
}, },
"missing required list block": {
&Block{
BlockTypes: map[string]*NestedBlock{
"foo": {
Block: Block{},
Nesting: NestingList,
MinItems: 1,
},
},
},
cty.EmptyObjectVal,
cty.DynamicVal,
`attribute "foo" is required`,
},
"missing required set block": {
&Block{
BlockTypes: map[string]*NestedBlock{
"foo": {
Block: Block{},
Nesting: NestingList,
MinItems: 1,
},
},
},
cty.EmptyObjectVal,
cty.DynamicVal,
`attribute "foo" is required`,
},
"unknown nested list": { "unknown nested list": {
&Block{ &Block{
Attributes: map[string]*Attribute{ Attributes: map[string]*Attribute{