From 2bb4fdd86ccda3648fe92f1560bc5e4f673636cc Mon Sep 17 00:00:00 2001 From: Quinten Date: Tue, 19 Mar 2024 18:35:18 +0100 Subject: [PATCH] Fix incorrect filtering of no-op changes --- terraformstate/terraform_state.go | 2 +- terraformstate/terraform_state_test.go | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/terraformstate/terraform_state.go b/terraformstate/terraform_state.go index b9eb36e..5f97c6f 100644 --- a/terraformstate/terraform_state.go +++ b/terraformstate/terraform_state.go @@ -92,7 +92,7 @@ func importedResources(resources ResourceChanges) ResourceChanges { func FilterNoOpResources(ts *tfjson.Plan) { acc := make(ResourceChanges, 0) for _, r := range ts.ResourceChanges { - if len(r.Change.Actions) == 1 && r.Change.Actions[0] == "no-op" && r.Change.Importing != nil && r.Change.Importing.ID == "" { + if len(r.Change.Actions) == 1 && r.Change.Actions[0] == "no-op" && (r.Change.Importing == nil || r.Change.Importing.ID == "") { continue } acc = append(acc, r) diff --git a/terraformstate/terraform_state_test.go b/terraformstate/terraform_state_test.go index f71f99b..8530d77 100644 --- a/terraformstate/terraform_state_test.go +++ b/terraformstate/terraform_state_test.go @@ -4,6 +4,7 @@ import ( "testing" . "github.com/hashicorp/terraform-json" + tfjson "github.com/hashicorp/terraform-json" "github.com/stretchr/testify/assert" ) @@ -59,3 +60,20 @@ func TestResourceChangeColorAndSuffixImport(t *testing.T) { assert.Equal(t, color, ColorCyan) assert.Equal(t, suffix, "(i)") } + +func TestFilterNoOpResources(t *testing.T) { + resourceChanges := ResourceChanges{ + &ResourceChange{Address: "no-op1", Change: &Change{Actions: Actions{ActionNoop}}}, + &ResourceChange{Address: "no-op3", Change: &Change{Actions: Actions{ActionNoop}, Importing: nil}}, + &ResourceChange{Address: "no-op2", Change: &Change{Actions: Actions{ActionNoop}, Importing: &Importing{ID: ""}}}, + &ResourceChange{Address: "create", Change: &Change{Actions: Actions{ActionCreate}}}, + } + plan := tfjson.Plan{ResourceChanges: resourceChanges} + + FilterNoOpResources(&plan) + + expectedResourceChangesAfterFiltering := ResourceChanges{ + &ResourceChange{Address: "create", Change: &Change{Actions: Actions{ActionCreate}}}, + } + assert.Equal(t, expectedResourceChangesAfterFiltering, plan.ResourceChanges) +}