Merge pull request #16780 from nevans-sofi/processIgnoreChangesPatch

Ignore redundant IgnoreChanges attributes
This commit is contained in:
James Bardin 2017-12-13 16:07:35 -05:00 committed by GitHub
commit f00dc45e8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 77 additions and 5 deletions

View File

@ -396,6 +396,11 @@ type ResourceAttrDiff struct {
Type DiffAttrType Type DiffAttrType
} }
// Modified returns the inequality of Old and New for this attr
func (d *ResourceAttrDiff) Modified() bool {
return d.Old != d.New
}
// Empty returns true if the diff for this attr is neutral // Empty returns true if the diff for this attr is neutral
func (d *ResourceAttrDiff) Empty() bool { func (d *ResourceAttrDiff) Empty() bool {
return d.Old == d.New && !d.NewComputed && !d.NewRemoved return d.Old == d.New && !d.NewComputed && !d.NewRemoved

View File

@ -258,12 +258,14 @@ func (n *EvalDiff) processIgnoreChanges(diff *InstanceDiff) error {
for _, v := range containers { for _, v := range containers {
if v.keepDiff() { if v.keepDiff() {
// At least one key has changes, so list all the sibling keys // At least one key has changes, so list all the sibling keys
// to keep in the diff. // to keep in the diff if any values have changed
for k := range v { for k := range v {
if v[k].Modified() {
keep[k] = true keep[k] = true
} }
} }
} }
}
for k, v := range attrs { for k, v := range attrs {
if (v.Empty() || v.NewComputed) && !keep[k] { if (v.Empty() || v.NewComputed) && !keep[k] {

View File

@ -3,6 +3,8 @@ package terraform
import ( import (
"reflect" "reflect"
"testing" "testing"
"github.com/hashicorp/terraform/config"
) )
func TestEvalFilterDiff(t *testing.T) { func TestEvalFilterDiff(t *testing.T) {
@ -76,3 +78,69 @@ func TestEvalFilterDiff(t *testing.T) {
} }
} }
} }
func TestProcessIgnoreChangesOnResourceIgnoredWithRequiresNew(t *testing.T) {
var evalDiff *EvalDiff
var instanceDiff *InstanceDiff
var testDiffs = func(ignoreChanges []string, newAttribute string) (*EvalDiff, *InstanceDiff) {
return &EvalDiff{
Resource: &config.Resource{
Lifecycle: config.ResourceLifecycle{
IgnoreChanges: ignoreChanges,
},
},
},
&InstanceDiff{
Destroy: true,
Attributes: map[string]*ResourceAttrDiff{
"resource.changed": {
RequiresNew: true,
Type: DiffAttrInput,
Old: "old",
New: "new",
},
"resource.unchanged": {
Old: "unchanged",
New: newAttribute,
},
},
}
}
evalDiff, instanceDiff = testDiffs([]string{"resource.changed"}, "unchanged")
err := evalDiff.processIgnoreChanges(instanceDiff)
if err != nil {
t.Fatalf("err: %s", err)
}
if len(instanceDiff.Attributes) > 0 {
t.Fatalf("Expected all resources to be ignored, found %d", len(instanceDiff.Attributes))
}
evalDiff, instanceDiff = testDiffs([]string{}, "unchanged")
err = evalDiff.processIgnoreChanges(instanceDiff)
if err != nil {
t.Fatalf("err: %s", err)
}
if len(instanceDiff.Attributes) != 2 {
t.Fatalf("Expected 2 resources to be found, found %d", len(instanceDiff.Attributes))
}
evalDiff, instanceDiff = testDiffs([]string{"resource.changed"}, "changed")
err = evalDiff.processIgnoreChanges(instanceDiff)
if err != nil {
t.Fatalf("err: %s", err)
}
if len(instanceDiff.Attributes) != 1 {
t.Fatalf("Expected 1 resource to be found, found %d", len(instanceDiff.Attributes))
}
evalDiff, instanceDiff = testDiffs([]string{}, "changed")
err = evalDiff.processIgnoreChanges(instanceDiff)
if err != nil {
t.Fatalf("err: %s", err)
}
if len(instanceDiff.Attributes) != 2 {
t.Fatalf("Expected 2 resource to be found, found %d", len(instanceDiff.Attributes))
}
}

View File

@ -1675,10 +1675,7 @@ aws_instance.foo:
const testTFPlanDiffIgnoreChangesWithFlatmaps = ` const testTFPlanDiffIgnoreChangesWithFlatmaps = `
UPDATE: aws_instance.foo UPDATE: aws_instance.foo
lst.#: "1" => "2" lst.#: "1" => "2"
lst.0: "j" => "j"
lst.1: "" => "k" lst.1: "" => "k"
set.#: "1" => "1"
set.0.a: "1" => "1"
set.0.b: "" => "2" set.0.b: "" => "2"
type: "" => "aws_instance" type: "" => "aws_instance"
` `