add evalWriteEmptyState for data source removal

This commit is contained in:
James Bardin 2020-05-13 09:40:13 -04:00
parent 7b8f13862c
commit 8850d787f4
2 changed files with 43 additions and 22 deletions

View File

@ -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 {

View File

@ -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,