diff --git a/terraform/eval_state.go b/terraform/eval_state.go index c19d37801..eca680569 100644 --- a/terraform/eval_state.go +++ b/terraform/eval_state.go @@ -187,6 +187,18 @@ func (n *EvalUpdateStateHook) Eval(ctx EvalContext) (interface{}, error) { return nil, nil } +// evalWriteEmptyState wraps EvalWriteState to specifically record an empty +// state for a particular object. +type evalWriteEmptyState struct { + EvalWriteState +} + +func (n *evalWriteEmptyState) Eval(ctx EvalContext) (interface{}, error) { + var state *states.ResourceInstanceObject + n.State = &state + return n.EvalWriteState.Eval(ctx) +} + // EvalWriteState is an EvalNode implementation that saves the given object // as the current object for the selected resource instance. type EvalWriteState struct { diff --git a/terraform/node_resource_destroy.go b/terraform/node_resource_destroy.go index da154257d..6fc24fee2 100644 --- a/terraform/node_resource_destroy.go +++ b/terraform/node_resource_destroy.go @@ -234,35 +234,44 @@ func (n *NodeDestroyResourceInstance) EvalTree() EvalNode { }, }, - // Make sure we handle data sources properly. + // Managed resources need to be destroyed, while data sources + // are only removed from state. &EvalIf{ If: func(ctx EvalContext) (bool, error) { - if addr.Resource.Resource.Mode == addrs.DataResourceMode { - // deleting a data source is simply removing the state - state = nil - } return addr.Resource.Resource.Mode == addrs.ManagedResourceMode, nil }, - Then: &EvalApply{ - Addr: addr.Resource, - Config: nil, // No configuration because we are destroying - State: &state, - Change: &changeApply, - Provider: &provider, - ProviderAddr: n.ResolvedProvider, - ProviderMetas: n.ProviderMetas, - ProviderSchema: &providerSchema, - Output: &state, - Error: &err, + Then: &EvalSequence{ + Nodes: []EvalNode{ + &EvalApply{ + Addr: addr.Resource, + Config: nil, // No configuration because we are destroying + State: &state, + Change: &changeApply, + Provider: &provider, + ProviderAddr: n.ResolvedProvider, + ProviderMetas: n.ProviderMetas, + ProviderSchema: &providerSchema, + Output: &state, + Error: &err, + }, + &EvalWriteState{ + Addr: addr.Resource, + ProviderAddr: n.ResolvedProvider, + ProviderSchema: &providerSchema, + State: &state, + }, + }, + }, + Else: &evalWriteEmptyState{ + EvalWriteState{ + Addr: addr.Resource, + ProviderAddr: n.ResolvedProvider, + ProviderSchema: &providerSchema, + }, }, }, - &EvalWriteState{ - Addr: addr.Resource, - ProviderAddr: n.ResolvedProvider, - ProviderSchema: &providerSchema, - State: &state, - }, + &EvalApplyPost{ Addr: addr.Resource, State: &state,