Don't allow sub-blocks for SetNew.

You can't set individual items in lists, you can only set the list as a
whole, so we shouldn't allow sub-blocks to SetNew or SetNewComputed.
This commit is contained in:
Paddy Carver 2018-09-26 12:38:38 -07:00
parent 393c32624a
commit 2eadc8f625
1 changed files with 16 additions and 8 deletions

View File

@ -231,7 +231,7 @@ func (d *ResourceDiff) UpdatedKeys() []string {
// Note that this does not wipe an override. This function is only allowed on // Note that this does not wipe an override. This function is only allowed on
// computed keys. // computed keys.
func (d *ResourceDiff) Clear(key string) error { func (d *ResourceDiff) Clear(key string) error {
if err := d.checkKey(key, "Clear"); err != nil { if err := d.checkKey(key, "Clear", true); err != nil {
return err return err
} }
@ -287,7 +287,7 @@ func (d *ResourceDiff) diffChange(key string) (interface{}, interface{}, bool, b
// //
// This function is only allowed on computed attributes. // This function is only allowed on computed attributes.
func (d *ResourceDiff) SetNew(key string, value interface{}) error { func (d *ResourceDiff) SetNew(key string, value interface{}) error {
if err := d.checkKey(key, "SetNew"); err != nil { if err := d.checkKey(key, "SetNew", false); err != nil {
return err return err
} }
@ -299,7 +299,7 @@ func (d *ResourceDiff) SetNew(key string, value interface{}) error {
// //
// This function is only allowed on computed attributes. // This function is only allowed on computed attributes.
func (d *ResourceDiff) SetNewComputed(key string) error { func (d *ResourceDiff) SetNewComputed(key string) error {
if err := d.checkKey(key, "SetNewComputed"); err != nil { if err := d.checkKey(key, "SetNewComputed", false); err != nil {
return err return err
} }
@ -535,13 +535,21 @@ func childAddrOf(child, parent string) bool {
} }
// checkKey checks the key to make sure it exists and is computed. // checkKey checks the key to make sure it exists and is computed.
func (d *ResourceDiff) checkKey(key, caller string) error { func (d *ResourceDiff) checkKey(key, caller string, nested bool) error {
keyParts := strings.Split(key, ".")
var schema *Schema var schema *Schema
schemaL := addrToSchema(keyParts, d.schema) if nested {
if len(schemaL) > 0 { keyParts := strings.Split(key, ".")
schema = schemaL[len(schemaL)-1] schemaL := addrToSchema(keyParts, d.schema)
if len(schemaL) > 0 {
schema = schemaL[len(schemaL)-1]
}
} else { } else {
s, ok := d.schema[key]
if ok {
schema = s
}
}
if schema == nil {
return fmt.Errorf("%s: invalid key: %s", caller, key) return fmt.Errorf("%s: invalid key: %s", caller, key)
} }
if !schema.Computed { if !schema.Computed {