From 13e2e10577374056747edea265a1d1b89d9c0ddf Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 20 Aug 2019 09:49:41 -0400 Subject: [PATCH] fix Min/Max validation during decoding We can only validate MinItems >= 1 (equiv to "Required") during decoding, as dynamic blocks each only decode as a single block. MaxItems cannot be validated at all, also because of dynamic blocks, which may have any number of blocks in the config. --- configs/configschema/decoder_spec.go | 8 +++----- configs/configschema/decoder_spec_test.go | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/configs/configschema/decoder_spec.go b/configs/configschema/decoder_spec.go index e748dd20d..c4bc3be03 100644 --- a/configs/configschema/decoder_spec.go +++ b/configs/configschema/decoder_spec.go @@ -35,7 +35,8 @@ func (b *Block) DecoderSpec() hcldec.Spec { // We can only validate 0 or 1 for MinItems, because a dynamic block // may satisfy any number of min items while only having a single - // block in the config. + // block in the config. We cannot validate MaxItems because a + // configuration may have any number of dynamic blocks minItems := 0 if blockS.MinItems > 1 { minItems = 1 @@ -46,7 +47,7 @@ func (b *Block) DecoderSpec() hcldec.Spec { ret[name] = &hcldec.BlockSpec{ TypeName: name, Nested: childSpec, - Required: blockS.MinItems == 1 && blockS.MaxItems >= 1, + Required: blockS.MinItems == 1, } if blockS.Nesting == NestingGroup { ret[name] = &hcldec.DefaultSpec{ @@ -66,14 +67,12 @@ func (b *Block) DecoderSpec() hcldec.Spec { TypeName: name, Nested: childSpec, MinItems: minItems, - MaxItems: blockS.MaxItems, } } else { ret[name] = &hcldec.BlockListSpec{ TypeName: name, Nested: childSpec, MinItems: minItems, - MaxItems: blockS.MaxItems, } } case NestingSet: @@ -86,7 +85,6 @@ func (b *Block) DecoderSpec() hcldec.Spec { TypeName: name, Nested: childSpec, MinItems: minItems, - MaxItems: blockS.MaxItems, } case NestingMap: // We prefer to use a list where possible, since it makes our diff --git a/configs/configschema/decoder_spec_test.go b/configs/configschema/decoder_spec_test.go index d6f6a6a15..1e7b1d4c6 100644 --- a/configs/configschema/decoder_spec_test.go +++ b/configs/configschema/decoder_spec_test.go @@ -354,7 +354,7 @@ func TestBlockDecoderSpec(t *testing.T) { cty.EmptyObjectVal, }), }), - 1, // too many "foo" blocks + 0, // max items cannot be validated during decode }, // dynamic blocks may fulfill MinItems, but there is only one block to // decode.