From fb70eaa7d1c04429f946d3a9ac170dbf369e1f76 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 1 Jun 2018 09:13:49 -0700 Subject: [PATCH] core: EvalDiffDestroy only update state if requested The earlier change 5f07201a made it so that the state is always rewritten by EvalDiffDestroy, but that was too disruptive to other users of EvalDiffDestroy. Now we follow the lead of EvalDiff and have a separate pointer for the _output_ state, which allows the caller to opt in to having its state pointer updated to reflect the new (nil) state. NodePlannableResourceInstanceOrphan is the only caller that currently opts in to this, since that was the focus of 5f07201a. We may need to make a similar change to other plannable resource destroy nodes, but we'll wait to see if that needs to be done in a subsequent commit. --- terraform/eval_diff.go | 11 ++++++----- terraform/node_resource_plan_orphan.go | 7 ++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/terraform/eval_diff.go b/terraform/eval_diff.go index d299e76c0..891e7a3d6 100644 --- a/terraform/eval_diff.go +++ b/terraform/eval_diff.go @@ -424,9 +424,10 @@ func groupContainers(d *InstanceDiff) map[string]flatAttrDiff { // EvalDiffDestroy is an EvalNode implementation that returns a plain // destroy diff. type EvalDiffDestroy struct { - Addr addrs.ResourceInstance - State **InstanceState - Output **InstanceDiff + Addr addrs.ResourceInstance + State **InstanceState + Output **InstanceDiff + OutputState **InstanceState } // TODO: test @@ -463,9 +464,9 @@ func (n *EvalDiffDestroy) Eval(ctx EvalContext) (interface{}, error) { // Update our output *n.Output = diff - if n.State != nil { + if n.OutputState != nil { // Record our proposed new state, which is nil because we're destroying. - *n.State = nil + *n.OutputState = nil } return nil, nil diff --git a/terraform/node_resource_plan_orphan.go b/terraform/node_resource_plan_orphan.go index 52685ad55..09aec8c82 100644 --- a/terraform/node_resource_plan_orphan.go +++ b/terraform/node_resource_plan_orphan.go @@ -45,9 +45,10 @@ func (n *NodePlannableResourceInstanceOrphan) EvalTree() EvalNode { Output: &state, }, &EvalDiffDestroy{ - Addr: addr.Resource, - State: &state, // Will point to a nil state after this complete, signalling destroyed - Output: &diff, + Addr: addr.Resource, + State: &state, + Output: &diff, + OutputState: &state, // Will point to a nil state after this complete, signalling destroyed }, &EvalCheckPreventDestroy{ Addr: addr.Resource,