diff --git a/builtin/providers/test/resource_test.go b/builtin/providers/test/resource_test.go index 9277e9f62..5aedba214 100644 --- a/builtin/providers/test/resource_test.go +++ b/builtin/providers/test/resource_test.go @@ -1086,3 +1086,86 @@ resource "test_resource" "foo" { }, }) } + +// Verify we can use use numeric indices in `ignore_changes` paths. +func TestResource_ignoreChangesIndex(t *testing.T) { + resource.UnitTest(t, resource.TestCase{ + Providers: testAccProviders, + CheckDestroy: testAccCheckResourceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: strings.TrimSpace(` +resource "test_resource" "foo" { + required = "yep" + required_map = { + key = "value" + } + list_of_map = [ + { + a = "b" + } + ] + + lifecycle { + ignore_changes = [list_of_map[0]["a"]] + } +} + `), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr( + "test_resource.foo", "list_of_map.0.a", "b", + ), + ), + }, + resource.TestStep{ + Config: strings.TrimSpace(` +resource "test_resource" "foo" { + required = "yep" + required_map = { + key = "value" + } + list_of_map = [ + { + a = "c" + } + ] + + lifecycle { + ignore_changes = [list_of_map[0]["a"]] + } +} + `), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr( + "test_resource.foo", "list_of_map.0.a", "b", + ), + ), + }, + // set ignore_changes to a prefix of the changed value + resource.TestStep{ + Config: strings.TrimSpace(` +resource "test_resource" "foo" { + required = "yep" + required_map = { + key = "value" + } + list_of_map = [ + { + a = "d" + } + ] + + lifecycle { + ignore_changes = [list_of_map[0]] + } +} + `), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr( + "test_resource.foo", "list_of_map.0.a", "b", + ), + ), + }, + }, + }) +} diff --git a/terraform/eval_diff.go b/terraform/eval_diff.go index 3ac23b709..20af9593c 100644 --- a/terraform/eval_diff.go +++ b/terraform/eval_diff.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "log" - "reflect" "strings" "github.com/hashicorp/hcl2/hcl" @@ -532,7 +531,7 @@ func processIgnoreChangesIndividual(prior, proposed cty.Value, ignoreChanges []h // away any deeper values we already produced at that point. var ignoreTraversal hcl.Traversal for i, candidate := range ignoreChangesPath { - if reflect.DeepEqual(path, candidate) { + if path.Equals(candidate) { ignoreTraversal = ignoreChanges[i] } }