helper/schema: Add Clear function to ResourceDiff

This should complete the feature set of the prototype. This function
removes a specific key from the existing diff, preventing conflicts.

Further functionality might be needed to make this behave as expected,
namely ensuring that we don't re-process the whole diff after the
CustomizeDiffFunc runs.
This commit is contained in:
Chris Marchesi 2017-05-25 09:45:31 -07:00 committed by Martin Atkins
parent 1e8cfc52e9
commit aeb793f968
1 changed files with 24 additions and 0 deletions

View File

@ -186,10 +186,30 @@ func newResourceDiff(schema map[string]*Schema, config *terraform.ResourceConfig
// ClearAll wipes the current diff. This cannot be undone - use only if you // ClearAll wipes the current diff. This cannot be undone - use only if you
// need to create a whole new diff from scatch, such as when you are leaning on // need to create a whole new diff from scatch, such as when you are leaning on
// the provider completely to create the diff. // the provider completely to create the diff.
//
// Note that this does not wipe overrides.
func (d *ResourceDiff) ClearAll() { func (d *ResourceDiff) ClearAll() {
d.diff = new(terraform.InstanceDiff) d.diff = new(terraform.InstanceDiff)
} }
// Clear wipes the diff for a particular key. It is called by SetDiff to remove
// any possibility of conflicts, but can be called on its own to just remove a
// specific key from the diff completely.
//
// Note that this does not wipe an override.
func (d *ResourceDiff) Clear(key string) error {
// Check the schema to make sure that this key exists first.
if _, ok := d.schema[key]; !ok {
return fmt.Errorf("%s is not a valid key", key)
}
for k := range d.diff.Attributes {
if strings.HasPrefix(k, key) {
delete(d.diff.Attributes, k)
}
}
return nil
}
// diffChange helps to implement resourceDiffer and derives its change values // diffChange helps to implement resourceDiffer and derives its change values
// from ResourceDiff's own change data, in addition to existing diff, config, and state. // from ResourceDiff's own change data, in addition to existing diff, config, and state.
func (d *ResourceDiff) diffChange(key string) (interface{}, interface{}, bool, bool) { func (d *ResourceDiff) diffChange(key string) (interface{}, interface{}, bool, bool) {
@ -238,6 +258,10 @@ func (d *ResourceDiff) SetDiff(key string, old, new interface{}, computed bool)
return fmt.Errorf("SetNew, SetNewComputed, and SetDiff are allowed on computed attributes only - %s is not one", key) return fmt.Errorf("SetNew, SetNewComputed, and SetDiff are allowed on computed attributes only - %s is not one", key)
} }
if err := d.Clear(key); err != nil {
return err
}
if err := d.oldWriter.WriteField(strings.Split(key, "."), old); err != nil { if err := d.oldWriter.WriteField(strings.Split(key, "."), old); err != nil {
return fmt.Errorf("Cannot set old diff value for key %s: %s", key, err) return fmt.Errorf("Cannot set old diff value for key %s: %s", key, err)
} }