From 49fa2b3f3579de9f043c7fce79dfb8b20db8652d Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Wed, 26 Sep 2018 10:46:43 -0700 Subject: [PATCH] core: Always set ProviderAddr on EvalDiffDestroy If we don't set it, we end up creating an invalid plan where the destroy changes don't have a provider address set, which then later fails decoding when round-tripped through a planfile. This also includes some extra safety checks in EvalDiff and EvalDiffDestroy so that we can catch this bug sooner in future. This change is verified by TestContext2Apply_plannedDestroyInterpolatedCount, which is now passing. --- terraform/eval_diff.go | 11 +++++++++++ terraform/node_resource_destroy_deposed.go | 16 +++++++++------- terraform/node_resource_plan_destroy.go | 7 ++++--- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/terraform/eval_diff.go b/terraform/eval_diff.go index 40f89e56a5..705b6710ba 100644 --- a/terraform/eval_diff.go +++ b/terraform/eval_diff.go @@ -123,6 +123,9 @@ func (n *EvalDiff) Eval(ctx EvalContext) (interface{}, error) { if providerSchema == nil { return nil, fmt.Errorf("provider schema is unavailable for %s", n.Addr) } + if n.ProviderAddr.ProviderConfig.Type == "" { + panic(fmt.Sprintf("EvalDiff for %s does not have ProviderAddr set", n.Addr.Absolute(ctx.Path()))) + } var diags tfdiags.Diagnostics @@ -707,6 +710,14 @@ func (n *EvalDiffDestroy) Eval(ctx EvalContext) (interface{}, error) { absAddr := n.Addr.Absolute(ctx.Path()) state := *n.State + if n.ProviderAddr.ProviderConfig.Type == "" { + if n.DeposedKey == "" { + panic(fmt.Sprintf("EvalDiffDestroy for %s does not have ProviderAddr set", absAddr)) + } else { + panic(fmt.Sprintf("EvalDiffDestroy for %s (deposed %s) does not have ProviderAddr set", absAddr, n.DeposedKey)) + } + } + // If there is no state or our attributes object is null then we're already // destroyed. if state == nil || state.Value.IsNull() { diff --git a/terraform/node_resource_destroy_deposed.go b/terraform/node_resource_destroy_deposed.go index 2ecb5bffae..52cc151397 100644 --- a/terraform/node_resource_destroy_deposed.go +++ b/terraform/node_resource_destroy_deposed.go @@ -131,10 +131,11 @@ func (n *NodePlanDeposedResourceInstanceObject) EvalTree() EvalNode { ProviderSchema: &providerSchema, }, &EvalDiffDestroy{ - Addr: addr.Resource, - DeposedKey: n.DeposedKey, - State: &state, - Output: &change, + Addr: addr.Resource, + ProviderAddr: n.ResolvedProvider, + DeposedKey: n.DeposedKey, + State: &state, + Output: &change, }, &EvalWriteDiff{ Addr: addr.Resource, @@ -244,9 +245,10 @@ func (n *NodeDestroyDeposedResourceInstanceObject) EvalTree() EvalNode { ProviderSchema: &providerSchema, }, &EvalDiffDestroy{ - Addr: addr.Resource, - State: &state, - Output: &change, + Addr: addr.Resource, + ProviderAddr: n.ResolvedProvider, + State: &state, + Output: &change, }, // Call pre-apply hook &EvalApplyPre{ diff --git a/terraform/node_resource_plan_destroy.go b/terraform/node_resource_plan_destroy.go index d978b65055..38746f0d35 100644 --- a/terraform/node_resource_plan_destroy.go +++ b/terraform/node_resource_plan_destroy.go @@ -68,9 +68,10 @@ func (n *NodePlanDestroyableResourceInstance) EvalTree() EvalNode { Output: &state, }, &EvalDiffDestroy{ - Addr: addr.Resource, - State: &state, - Output: &change, + Addr: addr.Resource, + ProviderAddr: n.ResolvedProvider, + State: &state, + Output: &change, }, &EvalCheckPreventDestroy{ Addr: addr.Resource,