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.
This commit is contained in:
parent
e4fbc49fb8
commit
a0338df4d4
|
@ -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",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"reflect"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/hcl2/hcl"
|
"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.
|
// away any deeper values we already produced at that point.
|
||||||
var ignoreTraversal hcl.Traversal
|
var ignoreTraversal hcl.Traversal
|
||||||
for i, candidate := range ignoreChangesPath {
|
for i, candidate := range ignoreChangesPath {
|
||||||
if reflect.DeepEqual(path, candidate) {
|
if path.Equals(candidate) {
|
||||||
ignoreTraversal = ignoreChanges[i]
|
ignoreTraversal = ignoreChanges[i]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue