From 5f4ff0e8be5df05f2ad21f093feb1bb8738ac91b Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 17 Nov 2020 09:31:18 -0500 Subject: [PATCH 1/2] don't render plan for module outputs Module outputs should not trigger plan rendering. --- plans/changes.go | 2 +- plans/plan_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/plans/changes.go b/plans/changes.go index 414099488..72b6a8938 100644 --- a/plans/changes.go +++ b/plans/changes.go @@ -39,7 +39,7 @@ func (c *Changes) Empty() bool { } for _, out := range c.Outputs { - if out.Action != NoOp { + if out.Addr.Module.IsRoot() && out.Action != NoOp { return false } } diff --git a/plans/plan_test.go b/plans/plan_test.go index 012ff06a6..b8a0e4501 100644 --- a/plans/plan_test.go +++ b/plans/plan_test.go @@ -68,3 +68,28 @@ func TestProviderAddrs(t *testing.T) { t.Error(problem) } } + +// Module outputs should not effect the result of Empty +func TestModuleOutputChangesEmpty(t *testing.T) { + changes := &Changes{ + Outputs: []*OutputChangeSrc{ + { + Addr: addrs.AbsOutputValue{ + Module: addrs.RootModuleInstance.Child("child", addrs.NoKey), + OutputValue: addrs.OutputValue{ + Name: "output", + }, + }, + ChangeSrc: ChangeSrc{ + Action: Update, + Before: []byte("a"), + After: []byte("b"), + }, + }, + }, + } + + if !changes.Empty() { + t.Fatal("plan has no visible changes") + } +} From 8e7a9b6312890a90ef5d9818fc636177807cb475 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 17 Nov 2020 16:11:57 -0500 Subject: [PATCH 2/2] output test for plan with no root output changes Module outputs do not show up in the plan, and are not rendered in the UI. --- backend/local/backend_plan_test.go | 50 +++++++++++++++++++ .../plan-module-outputs-changed/main.tf | 3 ++ .../plan-module-outputs-changed/mod/main.tf | 3 ++ 3 files changed, 56 insertions(+) create mode 100644 backend/local/testdata/plan-module-outputs-changed/main.tf create mode 100644 backend/local/testdata/plan-module-outputs-changed/mod/main.tf diff --git a/backend/local/backend_plan_test.go b/backend/local/backend_plan_test.go index f275d20b1..0b6cc2678 100644 --- a/backend/local/backend_plan_test.go +++ b/backend/local/backend_plan_test.go @@ -241,6 +241,56 @@ Changes to Outputs: } } +// Module outputs should not cause the plan to be rendered +func TestLocal_planModuleOutputsChanged(t *testing.T) { + b, cleanup := TestLocal(t) + defer cleanup() + testStateFile(t, b.StatePath, states.BuildState(func(ss *states.SyncState) { + ss.SetOutputValue(addrs.AbsOutputValue{ + Module: addrs.RootModuleInstance.Child("mod", addrs.NoKey), + OutputValue: addrs.OutputValue{Name: "changed"}, + }, cty.StringVal("before"), false) + })) + b.CLI = cli.NewMockUi() + outDir := testTempDir(t) + defer os.RemoveAll(outDir) + planPath := filepath.Join(outDir, "plan.tfplan") + op, configCleanup := testOperationPlan(t, "./testdata/plan-module-outputs-changed") + defer configCleanup() + op.PlanRefresh = true + op.PlanOutPath = planPath + cfg := cty.ObjectVal(map[string]cty.Value{ + "path": cty.StringVal(b.StatePath), + }) + cfgRaw, err := plans.NewDynamicValue(cfg, cfg.Type()) + if err != nil { + t.Fatal(err) + } + op.PlanOutBackend = &plans.Backend{ + Type: "local", + Config: cfgRaw, + } + run, err := b.Operation(context.Background(), op) + if err != nil { + t.Fatalf("bad: %s", err) + } + <-run.Done() + if run.Result != backend.OperationSuccess { + t.Fatalf("plan operation failed") + } + if !run.PlanEmpty { + t.Fatal("plan should be empty") + } + + expectedOutput := strings.TrimSpace(` +No changes. Infrastructure is up-to-date. +`) + output := b.CLI.(*cli.MockUi).OutputWriter.String() + if !strings.Contains(output, expectedOutput) { + t.Fatalf("Unexpected output:\n%s\n\nwant output containing:\n%s", output, expectedOutput) + } +} + func TestLocal_planTainted(t *testing.T) { b, cleanup := TestLocal(t) defer cleanup() diff --git a/backend/local/testdata/plan-module-outputs-changed/main.tf b/backend/local/testdata/plan-module-outputs-changed/main.tf new file mode 100644 index 000000000..ba8468469 --- /dev/null +++ b/backend/local/testdata/plan-module-outputs-changed/main.tf @@ -0,0 +1,3 @@ +module "mod" { + source = "./mod" +} diff --git a/backend/local/testdata/plan-module-outputs-changed/mod/main.tf b/backend/local/testdata/plan-module-outputs-changed/mod/main.tf new file mode 100644 index 000000000..cee14bd9c --- /dev/null +++ b/backend/local/testdata/plan-module-outputs-changed/mod/main.tf @@ -0,0 +1,3 @@ +output "changed" { + value = "after" +}