From a0338df4d4585b0a28ad8d454f668f2eae83feb7 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 8 Jul 2019 12:55:21 -0400 Subject: [PATCH] update ignore_changes to use cty.Path.Equals Remove reflect.DeepEqual from path comparisons to get reliable results. The equality issues were only noticed going the grpc interface, so add a corresponding test to the test provider. --- builtin/providers/test/resource_test.go | 83 +++++++++++++++++++++++++ terraform/eval_diff.go | 3 +- 2 files changed, 84 insertions(+), 2 deletions(-) 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] } }