mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
Merge pull request #22236 from hashicorp/jbardin/nil-in-config
don't reflect nil in schema validation
This commit is contained in:
commit
7648f99bca
@ -1440,6 +1440,11 @@ func (m schemaMap) validateList(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// schemaMap can't validate nil
|
||||||
|
if raw == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
// We use reflection to verify the slice because you can't
|
// We use reflection to verify the slice because you can't
|
||||||
// case to []interface{} unless the slice is exactly that type.
|
// case to []interface{} unless the slice is exactly that type.
|
||||||
rawV := reflect.ValueOf(raw)
|
rawV := reflect.ValueOf(raw)
|
||||||
@ -1527,6 +1532,10 @@ func (m schemaMap) validateMap(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// schemaMap can't validate nil
|
||||||
|
if raw == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
// We use reflection to verify the slice because you can't
|
// We use reflection to verify the slice because you can't
|
||||||
// case to []interface{} unless the slice is exactly that type.
|
// case to []interface{} unless the slice is exactly that type.
|
||||||
rawV := reflect.ValueOf(raw)
|
rawV := reflect.ValueOf(raw)
|
||||||
@ -1653,6 +1662,12 @@ func (m schemaMap) validateObject(
|
|||||||
schema map[string]*Schema,
|
schema map[string]*Schema,
|
||||||
c *terraform.ResourceConfig) ([]string, []error) {
|
c *terraform.ResourceConfig) ([]string, []error) {
|
||||||
raw, _ := c.Get(k)
|
raw, _ := c.Get(k)
|
||||||
|
|
||||||
|
// schemaMap can't validate nil
|
||||||
|
if raw == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
if _, ok := raw.(map[string]interface{}); !ok && !c.IsComputed(k) {
|
if _, ok := raw.(map[string]interface{}); !ok && !c.IsComputed(k) {
|
||||||
return nil, []error{fmt.Errorf(
|
return nil, []error{fmt.Errorf(
|
||||||
"%s: expected object, got %s",
|
"%s: expected object, got %s",
|
||||||
@ -1697,6 +1712,14 @@ func (m schemaMap) validatePrimitive(
|
|||||||
raw interface{},
|
raw interface{},
|
||||||
schema *Schema,
|
schema *Schema,
|
||||||
c *terraform.ResourceConfig) ([]string, []error) {
|
c *terraform.ResourceConfig) ([]string, []error) {
|
||||||
|
|
||||||
|
// a nil value shouldn't happen in the old protocol, and in the new
|
||||||
|
// protocol the types have already been validated. Either way, we can't
|
||||||
|
// reflect on nil, so don't panic.
|
||||||
|
if raw == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Catch if the user gave a complex type where a primitive was
|
// Catch if the user gave a complex type where a primitive was
|
||||||
// expected, so we can return a friendly error message that
|
// expected, so we can return a friendly error message that
|
||||||
// doesn't contain Go type system terminology.
|
// doesn't contain Go type system terminology.
|
||||||
|
@ -5465,6 +5465,39 @@ func TestSchemaMap_Validate(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Err: false,
|
Err: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"unexpected nils values": {
|
||||||
|
Schema: map[string]*Schema{
|
||||||
|
"strings": &Schema{
|
||||||
|
Type: TypeList,
|
||||||
|
Optional: true,
|
||||||
|
Elem: &Schema{
|
||||||
|
Type: TypeString,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"block": &Schema{
|
||||||
|
Type: TypeList,
|
||||||
|
Optional: true,
|
||||||
|
Elem: &Resource{
|
||||||
|
Schema: map[string]*Schema{
|
||||||
|
"int": &Schema{
|
||||||
|
Type: TypeInt,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
Config: map[string]interface{}{
|
||||||
|
"strings": []interface{}{"1", nil},
|
||||||
|
"block": []interface{}{map[string]interface{}{
|
||||||
|
"int": nil,
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for tn, tc := range cases {
|
for tn, tc := range cases {
|
||||||
|
Loading…
Reference in New Issue
Block a user