Merge pull request #30685 from hashicorp/alisdair/fix-30641

cli: Fix missing identifying attributes in diff
This commit is contained in:
Alisdair McDiarmid 2022-03-21 09:11:45 -04:00 committed by GitHub
commit b386f76b65
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 90 additions and 1 deletions

View File

@ -1603,7 +1603,10 @@ func (p *blockBodyDiffPrinter) writeValueDiff(old, new cty.Value, indent int, pa
action = plans.Update
}
if action == plans.NoOp && !p.verbose {
// TODO: If in future we have a schema associated with this
// object, we should pass the attribute's schema to
// identifyingAttribute here.
if action == plans.NoOp && !p.verbose && !identifyingAttribute(k, nil) {
suppressedElements++
continue
}

View File

@ -1131,6 +1131,92 @@ func TestResourceChange_JSON(t *testing.T) {
runTestCases(t, testCases)
}
func TestResourceChange_listObject(t *testing.T) {
testCases := map[string]testCase{
// https://github.com/hashicorp/terraform/issues/30641
"updating non-identifying attribute": {
Action: plans.Update,
Mode: addrs.ManagedResourceMode,
Before: cty.ObjectVal(map[string]cty.Value{
"id": cty.StringVal("i-02ae66f368e8518a9"),
"accounts": cty.ListVal([]cty.Value{
cty.ObjectVal(map[string]cty.Value{
"id": cty.StringVal("1"),
"name": cty.StringVal("production"),
"status": cty.StringVal("ACTIVE"),
}),
cty.ObjectVal(map[string]cty.Value{
"id": cty.StringVal("2"),
"name": cty.StringVal("staging"),
"status": cty.StringVal("ACTIVE"),
}),
cty.ObjectVal(map[string]cty.Value{
"id": cty.StringVal("3"),
"name": cty.StringVal("disaster-recovery"),
"status": cty.StringVal("ACTIVE"),
}),
}),
}),
After: cty.ObjectVal(map[string]cty.Value{
"id": cty.UnknownVal(cty.String),
"accounts": cty.ListVal([]cty.Value{
cty.ObjectVal(map[string]cty.Value{
"id": cty.StringVal("1"),
"name": cty.StringVal("production"),
"status": cty.StringVal("ACTIVE"),
}),
cty.ObjectVal(map[string]cty.Value{
"id": cty.StringVal("2"),
"name": cty.StringVal("staging"),
"status": cty.StringVal("EXPLODED"),
}),
cty.ObjectVal(map[string]cty.Value{
"id": cty.StringVal("3"),
"name": cty.StringVal("disaster-recovery"),
"status": cty.StringVal("ACTIVE"),
}),
}),
}),
Schema: &configschema.Block{
Attributes: map[string]*configschema.Attribute{
"id": {Type: cty.String, Optional: true, Computed: true},
"accounts": {
Type: cty.List(cty.Object(map[string]cty.Type{
"id": cty.String,
"name": cty.String,
"status": cty.String,
})),
},
},
},
RequiredReplace: cty.NewPathSet(),
ExpectedOutput: ` # test_instance.example will be updated in-place
~ resource "test_instance" "example" {
~ accounts = [
{
id = "1"
name = "production"
status = "ACTIVE"
},
~ {
id = "2"
name = "staging"
~ status = "ACTIVE" -> "EXPLODED"
},
{
id = "3"
name = "disaster-recovery"
status = "ACTIVE"
},
]
~ id = "i-02ae66f368e8518a9" -> (known after apply)
}
`,
},
}
runTestCases(t, testCases)
}
func TestResourceChange_primitiveList(t *testing.T) {
testCases := map[string]testCase{
"in-place update - creation": {