Skip to content

Commit

Permalink
detect new outputs and plans as Create actions
Browse files Browse the repository at this point in the history
Rather than using a prior value of null to indicate create, which is
imprecise because null is a valid output value, only plan values that
didn't exist in the prior state as Create changes.
  • Loading branch information
jbardin committed Jan 14, 2021
1 parent 57f004e commit d8d982c
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
26 changes: 26 additions & 0 deletions terraform/context_plan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6714,3 +6714,29 @@ output "planned" {
}
}
}

func TestContext2Plan_createOutput(t *testing.T) {
// this should always plan a NoOp change for the output
m := testModuleInline(t, map[string]string{
"main.tf": `
output "planned" {
value = 1
}
`,
})

ctx := testContext2(t, &ContextOpts{
Config: m,
State: states.NewState(),
})
plan, diags := ctx.Plan()
if diags.HasErrors() {
t.Fatal(diags.Err())
}

for _, c := range plan.Changes.Outputs {
if c.Action != plans.Create {
t.Fatalf("expected Create change, got %s for %q", c.Action, c.Addr)
}
}
}
10 changes: 8 additions & 2 deletions terraform/node_output.go
Original file line number Diff line number Diff line change
Expand Up @@ -432,12 +432,17 @@ func (n *NodeApplyableOutput) setValue(state *states.SyncState, changes *plans.C
// the diff
sensitiveBefore := false
before := cty.NullVal(cty.DynamicPseudoType)

// is this output new to out state
newOutput := true

mod := state.Module(n.Addr.Module)
if n.Addr.Module.IsRoot() && mod != nil {
for name, o := range mod.OutputValues {
if name == n.Addr.OutputValue.Name {
before = o.Value
sensitiveBefore = o.Sensitive
newOutput = false
break
}
}
Expand All @@ -455,10 +460,11 @@ func (n *NodeApplyableOutput) setValue(state *states.SyncState, changes *plans.C
switch {
case val.IsNull() && before.IsNull():
// This is separate from the NoOp case below, since we can ignore
// sensitivity here if there are only null values.
// sensitivity here when there are only null values.
action = plans.NoOp

case before.IsNull():
case newOutput:
// This output was just added to the configuration
action = plans.Create

case val.IsWhollyKnown() &&
Expand Down

0 comments on commit d8d982c

Please sign in to comment.