diff --git a/builtin/providers/test/resource_with_custom_diff.go b/builtin/providers/test/resource_with_custom_diff.go index 20d3f0ef9..9c7352ce5 100644 --- a/builtin/providers/test/resource_with_custom_diff.go +++ b/builtin/providers/test/resource_with_custom_diff.go @@ -8,11 +8,11 @@ import ( func testResourceCustomDiff() *schema.Resource { return &schema.Resource{ - Create: testResourceCustomDiffCreate, - Read: testResourceCustomDiffRead, - CustomizeDiff: testResourceCustomDiffCustomizeDiff, - Update: testResourceCustomDiffUpdate, - Delete: testResourceCustomDiffDelete, + Create: testResourceCustomDiffCreate, + Read: testResourceCustomDiffRead, + Review: testResourceCustomDiffReview, + Update: testResourceCustomDiffUpdate, + Delete: testResourceCustomDiffDelete, Schema: map[string]*schema.Schema{ "required": { Type: schema.TypeString, @@ -57,7 +57,7 @@ func testResourceCustomDiffRead(d *schema.ResourceData, meta interface{}) error return nil } -func testResourceCustomDiffCustomizeDiff(d *schema.ResourceDiff, meta interface{}) error { +func testResourceCustomDiffReview(d *schema.ResourceDiff, meta interface{}) error { if d.Get("veto").(bool) == true { return fmt.Errorf("veto is true, diff vetoed") } diff --git a/helper/schema/resource.go b/helper/schema/resource.go index 5d8bc3941..f33621a16 100644 --- a/helper/schema/resource.go +++ b/helper/schema/resource.go @@ -85,15 +85,16 @@ type Resource struct { Delete DeleteFunc Exists ExistsFunc - // CustomizeDiff is a custom function for controlling diff logic after the - // initial diff is performed - it can be used to veto particular changes in - // the diff, customize the diff that has been created, or diff values not - // controlled by config. It is passed a *ResourceDiff, a structure similar to - // ResourceData but lacking most write functions, allowing the provider to - // customize the diff only. + // Review is a custom function for "reviewing" the diff that Terraform has + // created for this resource - it can be used to customize the diff that has + // been created, diff values not controlled by configuration, or even veto + // the diff altogether and abort the plan. It is passed a *ResourceDiff, a + // structure similar to ResourceData but lacking most write functions, + // allowing the provider to customize the diff only. // - // Only computed fields can be customized by this function. - CustomizeDiff CustomizeDiffFunc + // For the most part, only computed fields can be customized by this + // function. + Review ReviewFunc // Importer is the ResourceImporter implementation for this resource. // If this is nil, then this resource does not support importing. If @@ -137,7 +138,7 @@ type StateMigrateFunc func( int, *terraform.InstanceState, interface{}) (*terraform.InstanceState, error) // See Resource documentation. -type CustomizeDiffFunc func(*ResourceDiff, interface{}) error +type ReviewFunc func(*ResourceDiff, interface{}) error // Apply creates, updates, and/or deletes a resource. func (r *Resource) Apply( @@ -229,7 +230,7 @@ func (r *Resource) Diff( return nil, fmt.Errorf("[ERR] Error decoding timeout: %s", err) } - instanceDiff, err := schemaMap(r.Schema).Diff(s, c, r.CustomizeDiff, meta) + instanceDiff, err := schemaMap(r.Schema).Diff(s, c, r.Review, meta) if err != nil { return instanceDiff, err } diff --git a/helper/schema/resource_test.go b/helper/schema/resource_test.go index 22bfd1b8c..6670d1d90 100644 --- a/helper/schema/resource_test.go +++ b/helper/schema/resource_test.go @@ -266,7 +266,7 @@ func TestResourceDiff_CustomizeFunc(t *testing.T) { var called bool - r.CustomizeDiff = func(d *ResourceDiff, m interface{}) error { + r.Review = func(d *ResourceDiff, m interface{}) error { called = true return nil } diff --git a/helper/schema/schema.go b/helper/schema/schema.go index b0b9c937b..70aa77ba9 100644 --- a/helper/schema/schema.go +++ b/helper/schema/schema.go @@ -386,7 +386,7 @@ func (m *schemaMap) DeepCopy() schemaMap { func (m schemaMap) Diff( s *terraform.InstanceState, c *terraform.ResourceConfig, - customizeFunc CustomizeDiffFunc, + review ReviewFunc, meta interface{}) (*terraform.InstanceDiff, error) { result := new(terraform.InstanceDiff) result.Attributes = make(map[string]*terraform.ResourceAttrDiff) @@ -411,10 +411,10 @@ func (m schemaMap) Diff( // If this is a non-destroy diff, call any custom diff logic that has been // defined. - if !result.DestroyTainted && customizeFunc != nil { + if !result.DestroyTainted && review != nil { mc := m.DeepCopy() rd := newResourceDiff(mc, c, s, result) - if err := customizeFunc(rd, meta); err != nil { + if err := review(rd, meta); err != nil { return nil, err } for _, k := range rd.UpdatedKeys() { @@ -451,10 +451,10 @@ func (m schemaMap) Diff( } // Re-run customization - if !result2.DestroyTainted && customizeFunc != nil { + if !result2.DestroyTainted && review != nil { mc := m.DeepCopy() rd := newResourceDiff(mc, c, d.state, result2) - if err := customizeFunc(rd, meta); err != nil { + if err := review(rd, meta); err != nil { return nil, err } for _, k := range rd.UpdatedKeys() { diff --git a/helper/schema/schema_test.go b/helper/schema/schema_test.go index 3698fe0f4..f709c0ccc 100644 --- a/helper/schema/schema_test.go +++ b/helper/schema/schema_test.go @@ -139,7 +139,7 @@ func TestSchemaMap_Diff(t *testing.T) { State *terraform.InstanceState Config map[string]interface{} ConfigVariables map[string]ast.Variable - CustomizeDiff CustomizeDiffFunc + Review ReviewFunc Diff *terraform.InstanceDiff Err bool }{ @@ -2827,7 +2827,7 @@ func TestSchemaMap_Diff(t *testing.T) { }, { - Name: "overridden diff with a CustomizeDiff function, ForceNew not in schema", + Name: "overridden diff with a Review function, ForceNew not in schema", Schema: map[string]*Schema{ "availability_zone": &Schema{ Type: TypeString, @@ -2842,7 +2842,7 @@ func TestSchemaMap_Diff(t *testing.T) { "availability_zone": "foo", }, - CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + Review: func(d *ResourceDiff, meta interface{}) error { if err := d.SetNew("availability_zone", "bar"); err != nil { return err } @@ -2866,7 +2866,7 @@ func TestSchemaMap_Diff(t *testing.T) { }, { - Name: "overridden diff with a CustomizeDiff function, ForceNew in schema", + Name: "overridden diff with a Review function, ForceNew in schema", Schema: map[string]*Schema{ "availability_zone": &Schema{ Type: TypeString, @@ -2882,7 +2882,7 @@ func TestSchemaMap_Diff(t *testing.T) { "availability_zone": "foo", }, - CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + Review: func(d *ResourceDiff, meta interface{}) error { if err := d.SetNew("availability_zone", "bar"); err != nil { return err } @@ -2903,7 +2903,7 @@ func TestSchemaMap_Diff(t *testing.T) { }, { - Name: "required field with computed diff added with CustomizeDiff function", + Name: "required field with computed diff added with Review function", Schema: map[string]*Schema{ "ami_id": &Schema{ Type: TypeString, @@ -2921,7 +2921,7 @@ func TestSchemaMap_Diff(t *testing.T) { "ami_id": "foo", }, - CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + Review: func(d *ResourceDiff, meta interface{}) error { if err := d.SetNew("instance_id", "bar"); err != nil { return err } @@ -2945,7 +2945,7 @@ func TestSchemaMap_Diff(t *testing.T) { }, { - Name: "Set ForceNew only marks the changing element as ForceNew - CustomizeDiffFunc edition", + Name: "Set ForceNew only marks the changing element as ForceNew - ReviewFunc edition", Schema: map[string]*Schema{ "ports": &Schema{ Type: TypeSet, @@ -2971,7 +2971,7 @@ func TestSchemaMap_Diff(t *testing.T) { "ports": []interface{}{5, 2, 6}, }, - CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + Review: func(d *ResourceDiff, meta interface{}) error { if err := d.SetNew("ports", []interface{}{5, 2, 1}); err != nil { return err } @@ -3011,7 +3011,7 @@ func TestSchemaMap_Diff(t *testing.T) { }, { - Name: "tainted resource does not run CustomizeDiffFunc", + Name: "tainted resource does not run ReviewFunc", Schema: map[string]*Schema{}, State: &terraform.InstanceState{ @@ -3023,7 +3023,7 @@ func TestSchemaMap_Diff(t *testing.T) { Config: map[string]interface{}{}, - CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + Review: func(d *ResourceDiff, meta interface{}) error { return errors.New("diff customization should not have run") }, @@ -3036,7 +3036,7 @@ func TestSchemaMap_Diff(t *testing.T) { }, { - Name: "NewComputed based on a conditional with CustomizeDiffFunc", + Name: "NewComputed based on a conditional with ReviewFunc", Schema: map[string]*Schema{ "etag": &Schema{ Type: TypeString, @@ -3060,7 +3060,7 @@ func TestSchemaMap_Diff(t *testing.T) { "etag": "bar", }, - CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + Review: func(d *ResourceDiff, meta interface{}) error { if d.HasChange("etag") { d.SetNewComputed("version_id") } @@ -3104,7 +3104,7 @@ func TestSchemaMap_Diff(t *testing.T) { "foo": "baz", }, - CustomizeDiff: func(d *ResourceDiff, meta interface{}) error { + Review: func(d *ResourceDiff, meta interface{}) error { return fmt.Errorf("diff vetoed") }, @@ -3125,7 +3125,7 @@ func TestSchemaMap_Diff(t *testing.T) { } } - d, err := schemaMap(tc.Schema).Diff(tc.State, terraform.NewResourceConfig(c), tc.CustomizeDiff, nil) + d, err := schemaMap(tc.Schema).Diff(tc.State, terraform.NewResourceConfig(c), tc.Review, nil) if err != nil != tc.Err { t.Fatalf("err: %s", err) }